読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Unityの新GUI、UGUIのイベント制御について

2D GUI(uGUI/NGUI/旧UI) Unity

Unityの新GUIシステム、(通称)UGUIのイベント制御について紹介します。

エディタのGUI上での設定

UGUIのボタンのコールバックは、AnimationEventのようにオブジェクトのメソッドを呼び出すことが出来ます。

例えばUI>ButtonでButtonを作った際も、下のようなインターフェースが設定されています。このインターフェースの「+」をクリックし、操作したいGameObjectをドラッグ&ドロップして登録、最後にメソッドを選択すればOKです。これでButtonをクリックした際に、登録したイベントが呼ばれます。

f:id:tsubaki_t1:20141223232731g:plain


uGUIでボタンのクリックイベントを取得 - チラ裏Unity

またクリック以外の操作もEventTriggerをアタッチする事で設定することが出来ます。EventTriggerはPointerEnter(範囲内に入ったら)やPointerExit(範囲外に出たら)を始めとした、幾つかの操作を登録することがで、ソースコードを記述せずとも簡単な動作を指定することが出来ます。

f:id:tsubaki_t1:20141223235115p:plain

例えばという事で「マウスが画面内に入ったらUIをポップアップで表示」を作ってみました。コードをかかなくても単純な反応系なら作ることが出来ます。希望があれば作り方を書きます。

f:id:tsubaki_t1:20141223231953g:plain

なお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;
}

f:id:tsubaki_t1:20141223235650p:plain

後はevに呼び出したいクラスの呼び出したいメソッドを登録します。これで例えばev.Invoke()のように呼び出せば、メソッドが呼び出されます。ちなみにコードで登録してもInspectorには反映されないみたいです。Inspectorに登録したい場合はこちらを使います。

    void Start()
    {
        ev.AddListenerCallback);
        ev.Invoke();
    }

    void Callback()
    {
        Debug.Log("callback");
    }

 

もう一つの方法がインターフェースを継承させる方法です。uGUIコンポーネントと同じコンポーネントにアタッチされているオブジェクトは、特定のインターフェースを継承しているとUI操作時にコールバックを返してくれるようになります。

現在使えるコールバックはUnity - Manual: Supported Eventsで確認する事が出来ます。後はInterfaceとしてクラスに追加すればOKです。

中身は大抵「eventData.pointerPressRaycast.gameObject」で取ってこれそうな気がします。

f:id:tsubaki_t1:20141224003259g:plain

エディタ操作をスクリプトで設定

 なお、このコールバックシステムは(上のEventTriggerもそうですが)親で定義したメソッドもコールします。

ちなみにエディタでメソッドを登録したい場合は、こっちの方法が使えますが、文字列登録方式なので凄い面倒です。

tsubakit1.hateblo.jp

参考

Unity 4.6 から利用できる UI での EventSystem をカスタムする方法について調べてみた - 凹みTips

【Unity4.6beta】何もないところでもEventSystemの通知を受け取る方法 | ケットシーウェア

【Unity4.6beta】EventSystemの通知を受け取ってみた | ケットシーウェア

値の変更を通知するクラス - テラシュールブログ

関連

tsubakit1.hateblo.jp