万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    C#でFunctionを渡す Unity

    メソッドを他のクラスに委譲したいけどよくわっかんない。
    UnityScriptはFunctionをそのまま引数に渡せるので楽。
    例えば→ http://d.hatena.ne.jp/shinriyo/20120730/p3

    しかし、C#はちがう。
    ゲームを管理しているクラスでポイントの追加をしたいが、弾であるBulletにポイントを追加する処理を渡したい。

    ・委譲元のクラス(GameScript.cs)
    ゲームのポイントを管理もしている。

    public delegate void Delegater();
    
    public class GameScript : MonoBehaviour
    {
        // 略 〜〜〜
        // 略 〜〜〜
    
        void Update()
        {
            Delegater delegateFunc = new Delegater(AddPoint);
            // bulletObjは弾のインスタンス
            bulletObj.GetComponent<HogeComponent>().HitFunc = delegateFunc;
        }
        voif AddPoint()
        {
            // 略 〜〜〜
            // ポイントを追加する処理
            // 略  〜〜〜
        }
    }
    

    ・HogeComponentがアタッチされたオブジェクト

    public class Hoge : MonoBehaviour
    {
        private Delegater hitFunc;
        public Delegater HitFunc
        {
            get{ return this.hitFunc; }
            set{ this.hitFunc = value; }
        }
    
        void OnTriggerEnter(Collider other)
        {;
            if (other.name == "Enemy")
            {
                hitFunc();
            }
        }
    }

    こんな感じ??

    Aクラス→Bクラス→Cクラスといった関数のまた渡しもできた。

    Aクラスではこれを

        Delegater delegateFunc = new Delegater(HogeFunc);
        hogeObj.GetComponent<HogeComponent>().MyDelegateFunc = delegateFunc;
    

    B,CでこうすればOK

        public Delegater MyDelegateFunc
        {
            get;
            set;
        }
    
        void Start()
        {
            Delegater delegateFunc = new Delegater(HogeFunc);
            hogeObj.GetComponent<HogeComponent>().MyDelegateFunc = delegateFunc;
        }