Aizu-Progressive xr Lab blog

会津大学のVR部であるA-PxLの部員が持ち回りで投稿していくブログです。部員がそれぞれVRに関する出来事やVRにちなんだことについて学んだことを書いていきます。

連絡はサークルTwitterのDMへお願いします。
「面白法人カヤックVR分室」としても活動しています。詳細はこちら

VR Academy 〜3/4 プレ講座〜

3/4にVRプロフェッショナルアカデミーのプレ講座(3回目)が行われました。第2回目には私は参加できていないので、4月入って講座がはじまったときに第2回目に参加された方にどのようなことをやったのか聞いてみたいですね。第3回はVRの知識がついたというよりかは、Unityの知識がつきました。見たことはあるけど使ったことのない機能が色々でてきたので、ここに備忘録として記録しておこうと思います。


UnityEvent

public or SerializeField 属性の UnityEventを使うことによってコールバック関数をUnity側から設定することができます。
e-words.jp

例えば、

using UnityEngine;
using UnityEngine.Events;

public class TestEvent : MonoBehaviour {

	public UnityEvent publicEventTest;
	[SerializeField] private UnityEvent serializeFieldEventTest;

}

このようなコードをかいて空オブジェクトに付け加えてみると、
f:id:aizu-vr:20170305222436p:plain
のようにUnity側に先ほど作った UnityEvent がエディタにでてきます。こっからコールバック関数を指定できます。


〜 Sample 〜

先ほどのファイルを以下に書き換えました↓

using UnityEngine;
using UnityEngine.Events;

public class TestEvent : MonoBehaviour {

	public UnityEvent publicEventTest;
	[SerializeField] private UnityEvent serializeFieldEventTest;

	void Update() {

		if (Input.GetKeyDown (KeyCode.Space)) {
			publicEventTest.Invoke ();
		}

		if (Input.GetMouseButtonDown (0)) {
			serializeFieldEventTest.Invoke ();
		}

	}

}

UnityEvent名.Invoke() でUnityエディタから指定した関数を実行させることができます。今回は新しく DebugTest.cs というファイルを先ほどと同じように空オブジェクトに付け加えて以下のコードを書きました。

using UnityEngine;

public class DebugTest : MonoBehaviour {

	public void PrintDebug() {
		Debug.Log ("Debug test");
	}

	public void PrintInt(int num) {
		Debug.Log (num);
	}

}

PrintDebug()関数は引数を取らない関数で、PrintInt()関数はint型の引数を1つとる関数です。
この2つの関数をUnityエディタから UnityEvent に指定します。ドラッグ&ドロップで先ほどの空オブジェクトだったものをいれてあげます。
f:id:aizu-vr:20170305230431p:plain
そしたら、No Function とかいてあるボタンを押して関数が書いてあるファイル名から関数名を探して選択します。
f:id:aizu-vr:20170305230705p:plain
関数のアクセス修飾子が public でないと候補欄に関数がでてきませんので注意してください。
f:id:aizu-vr:20170305225935p:plain
2個目の関数の引数もUnityエディタから指定できますね(ここでは1996と入力しているところです)。

実行して、Spaceキーと左クリックを押すと、
f:id:aizu-vr:20170305231456p:plain
とログにでてきました!




シングルトン

シングルトン自体についてはWikiなどで調べてください。
シングルトンは私は今まで名前しか聞いたことありませんでした。こんなふうに実装するんだなあ、としみじみ思いました。

新しく SingletonTest.cs というファイルを作り、以下をかきました。

using UnityEngine;

public class SingletonTest : MonoBehaviour {

	private int num = 0;

	private static SingletonTest instance;

	private void Awake () {
		if (instance == null) {
			instance = this;
		} else if (instance != null) {
			Destroy(this.gameObject);
		}
	}

	public static SingletonTest GetInstance() {
		return instance;
	}

	public void Print() {
		Debug.Log ("Test" + num);
		num++;
	}

}

これを他のファイルから使います。

using UnityEngine;

public class UsingSingleton : MonoBehaviour {

	// Update is called once per frame
	void Update () {
		if (Input.GetMouseButtonDown (1)) {
			SingletonTest.GetInstance().Print();
		}
	}
}

これで右クリックをするとログに、
f:id:aizu-vr:20170305235643p:plain
こんな感じでながれてきました。


シングルトンについてはまだ私自身使い勝手がイマイチ理解できてないので、これから実践で使ってみて慣れていこうと思います。
あとクエストのオブジェクトループがよくまだわかってないのでわかったら追記しようかと。

written by Akiyama

会津大学VR部の部員が持ち回りで投稿していくブログです。特にテーマに縛りを設けずに書いていきます!