例えばUIボタンを押したときにSpriteにアタッチしているスクリプトのpublicメソッドを叩きたい時、JavaScriptならEventDispatcherを使ったりしていたんですが、Unityだとどうしたもんかと思っていました。
とりあえずdelegateをつかってイベントを渡してみることにしました。
ButtonController(ボタンにアタッチするスクリプト)
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ButtonController : MonoBehaviour { public event EventHandler OnClickHandler = delegate { Debug.Log ("CLICK!"); }; void Start () { } public void OnClick () { this.OnClickHandler (this, EventArgs.Empty); } }
SpriteController(スプライトにアタッチするスクリプト)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpriteController : MonoBehaviour { public void Say () { Debug.Log ("Sprite!"); } }
GameController
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameController : MonoBehaviour { [SerializeField] private GameObject Button; [SerializeField] private GameObject Sprite; // Use this for initialization void Start () { Button.GetComponent<ButtonController> ().OnClickHandler += delegate { Sprite.GetComponent<SpriteController> ().Say (); }; } }
引数がなければこんな感じで実装できました。