Unityの新GUIシステム、(通称)UGUIのイベント制御について紹介します。
エディタのGUI上での設定
UGUIのボタンのコールバックは、AnimationEventのようにオブジェクトのメソッドを呼び出すことが出来ます。
例えばUI>ButtonでButtonを作った際も、下のようなインターフェースが設定されています。このインターフェースの「+」をクリックし、操作したいGameObjectをドラッグ&ドロップして登録、最後にメソッドを選択すればOKです。これでButtonをクリックした際に、登録したイベントが呼ばれます。
uGUIでボタンのクリックイベントを取得 - チラ裏Unity
またクリック以外の操作もEventTriggerをアタッチする事で設定することが出来ます。EventTriggerはPointerEnter(範囲内に入ったら)やPointerExit(範囲外に出たら)を始めとした、幾つかの操作を登録することがで、ソースコードを記述せずとも簡単な動作を指定することが出来ます。
例えばという事で「マウスが画面内に入ったらUIをポップアップで表示」を作ってみました。コードをかかなくても単純な反応系なら作ることが出来ます。希望があれば作り方を書きます。
なおEventTriggerやAnimationEvent等の「メタデータからメソッドを呼び出す機構」はコード上で追跡が困難になる点に注意して下さい。
この場合「メソッドの頭にOnを付ける」「コメントで何から呼ばれるか記述する」「同一オブジェクトないし親子関係で完結する」といった配置の工夫を行っておくとベターです。
これを簡単に追跡出来るアセット作ってるのでその内紹介します。
ソースコードでの操作
UnityのGUI上で行った操作を取得する方法は2つあります。一つがUnityEventへ登録する方法、もう一つがコールバックを定義する方法です。
上で行ったGUIによるイベントですが、これはUnityEventsを利用しています。UnityEventsはUnity 4.5らへん(多分)から追加されたイベント制御機能です。例えば以下のようなコードを記述すると、Inspector上にイベントを登録するウィンドウを表示します。
using UnityEngine;
using System.Collections;
public class EventTest : MonoBehaviour
{
[SerializeField]
UnityEngine.Events.UnityEvent ev;
}
後はevに呼び出したいクラスの呼び出したいメソッドを登録します。これで例えばev.Invoke()のように呼び出せば、メソッドが呼び出されます。ちなみにコードで登録してもInspectorには反映されないみたいです。Inspectorに登録したい場合はこちらを使います。
void Start()
{
ev.AddListener( Callback);
ev.Invoke();
}
void Callback()
{
Debug.Log("callback");
}
もう一つの方法がインターフェースを継承させる方法です。uGUIコンポーネントと同じコンポーネントにアタッチされているオブジェクトは、特定のインターフェースを継承しているとUI操作時にコールバックを返してくれるようになります。
現在使えるコールバックはUnity - Manual: Supported Eventsで確認する事が出来ます。後はInterfaceとしてクラスに追加すればOKです。
中身は大抵「eventData.pointerPressRaycast.gameObject」で取ってこれそうな気がします。
エディタ操作をスクリプトで設定
なお、このコールバックシステムは(上のEventTriggerもそうですが)親で定義したメソッドもコールします。
ちなみにエディタでメソッドを登録したい場合は、こっちの方法が使えますが、文字列登録方式なので凄い面倒です。
参考
Unity 4.6 から利用できる UI での EventSystem をカスタムする方法について調べてみた - 凹みTips
【Unity4.6beta】何もないところでもEventSystemの通知を受け取る方法 | ケットシーウェア
【Unity4.6beta】EventSystemの通知を受け取ってみた | ケットシーウェア