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; }
このようなコードをかいて空オブジェクトに付け加えてみると、
のように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 に指定します。ドラッグ&ドロップで先ほどの空オブジェクトだったものをいれてあげます。
そしたら、No Function とかいてあるボタンを押して関数が書いてあるファイル名から関数名を探して選択します。
関数のアクセス修飾子が public でないと候補欄に関数がでてきませんので注意してください。
2個目の関数の引数もUnityエディタから指定できますね(ここでは1996と入力しているところです)。
実行して、Spaceキーと左クリックを押すと、
とログにでてきました!
シングルトン
シングルトン自体については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(); } } }
これで右クリックをするとログに、
こんな感じでながれてきました。
シングルトンについてはまだ私自身使い勝手がイマイチ理解できてないので、これから実践で使ってみて慣れていこうと思います。
あとクエストのオブジェクトループがよくまだわかってないのでわかったら追記しようかと。
written by Akiyama