気になった
下記つぶやきが興味深くて考えてみた。
[ブログ更新] 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);
}
}
どーなんだろうなぁ。
イベントはデリゲートの使い方の一種だからデリゲート使っていいなら問題ないと思うけど…。
パフォーマンス悪くなったりするのかな。
