2014年1月26日日曜日

【Unity、C#】オブジェクト間のやりとりにC#のイベント機能って使っていいのかな?

気になった

下記つぶやきが興味深くて考えてみた。
上記ブログではデリゲートを使ってインスタンス生成側から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);
    }

}

どーなんだろうなぁ。
イベントはデリゲートの使い方の一種だからデリゲート使っていいなら問題ないと思うけど…。
パフォーマンス悪くなったりするのかな。

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...