気になった
下記つぶやきが興味深くて考えてみた。
[ブログ更新] Prefabからインスタンスを作成、インスタンスへデリゲートを設定するサンプルです。 --- Unity3D:インスタンスの生成とデリゲートの設定 http://t.co/pTY3swqmmy @narudesign_dev #unity3d
— narudesign (@narudesign_dev) 2014, 1月 26
上記ブログではデリゲートを使ってインスタンス生成側からOnMouseDownイベントを拾ってます。(DelegateFuncって最初から定義されてるのかな…?)
十分実用的なんですが
これをC#イベントで書いたらどうなのかなーって思った。
Unity系のブログとかみててもC#のイベント機能使ってるところが全然ないんですよね。
非推奨とかあるのかな?
MonoBehaviourの流儀がいまだによくわからん。
書いてみた
上記 @narudesign さんのやってる内容をC#イベントで置き換えてみた。(実行環境がなくて試してないので動くか分かりませんけど。)
Cube.cs
using System; using UnityEngine; class Cube : MonoBehaviour { /// <summary> /// クリックイベント /// </summary> public event EventHandler Click; /// <summary> /// クリックイベントを発生させます。 /// </summary> private void OnClick() { if (this.Click != null) { this.Click(this, EventArgs.Empty); } } /// <summary> /// 名前 /// </summary> public string Name { get; set; } /// <summary> /// クリックされた /// </summary> void OnMouseDown() { print("Cube - OnMouseDown() : " + this.Name); //イベントをRaise this.OnClick(); } }
MainClass.cs
using System; using UnityEngine; public class MainClass : MonoBehaviour { public GameObject prefab; void Start() { //Create Cube1 GameObject obj1 = Instantiate(this.prefab, new Vector3(-1, 0, 0), Quaternion.identity) as GameObject; Cube cube1 = obj1.GetComponent<Cube>(); cube1.Name = "1st Cube"; cube1.Click += cube_Click; //Create Cube2 GameObject obj2 = Instantiate(this.prefab, new Vector3(-1, 0, 0), Quaternion.identity) as GameObject; Cube cube2 = obj1.GetComponent<Cube>(); cube2.Name = "2nd Cube"; cube2.Click += cube_Click; } void cube_Click(object sender, EventArgs e) { Cube cube = sender as Cube; print("MainClass - cube_Click() : " + cube.Name); } }
どーなんだろうなぁ。
イベントはデリゲートの使い方の一種だからデリゲート使っていいなら問題ないと思うけど…。
パフォーマンス悪くなったりするのかな。