みかづきブログ その3

3ヶ月つづけてみました。

Unityでインスタンスをまたいでイベントを通知する 引数を必要とするとき編(delegateをつかう)

例えば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);
		};
	}
}

こんな感じで引数を渡せました。