例えばUIボタンを押したときにSpriteにアタッチしているスクリプトのpublicメソッドを叩きたい時、JavaScriptならEventDispatcherを使ったりしていたんですが、Unityだとどうしたもんかと思っていました。
とりあえずdelegateをつかってイベントを渡してみることにしました。
ButtonController(ボタンにアタッチするスクリプト)
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ClickEventArgs : EventArgs { public string txt; } public class ButtonController : MonoBehaviour { private ClickEventArgs args = new ClickEventArgs(); public event EventHandler OnClickHandler = delegate { Debug.Log ("CLICK!"); }; void Start () { this.args = new ClickEventArgs (); } public void OnClick (string foo) { this.args.txt = foo; this.OnClickHandler (this, this.args); } }
SpriteController(スプライトにアタッチするスクリプト)
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpriteController : MonoBehaviour { public void Say (string txt) { Debug.Log (txt); } }
GameController
using System; 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 (object sender, EventArgs args) { string txt = (args as ClickEventArgs).txt; Sprite.GetComponent<SpriteController> ().Say (txt); }; } }
こんな感じで引数を渡せました。