例えば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);
};
}
}
こんな感じで引数を渡せました。