Unityでスクリプトからボタンのイベントリスナーを取り付ける

今回はスクリプトからボタン操作時のイベントリスナーを取り付けてみたいと思います。

通常であればボタンのOnClickにボタンをクリックした時に実行するメソッドを指定したり、EventTriggerコンポーネントを取り付け、それぞれの操作に対して実行するメソッドを指定する事で簡単に該当する処理を実行する事が出来ます。

手動で指定する場合は、

UnityのUIのクリックやドラッグのイベントを受け取る方法を勉強していきます。

↑の記事に記載しています。

ですが、同じボタンを押した時でも違うメソッドを呼び出したい!といった事も必要になる事があります。

そこでスクリプトからボタン操作時のイベントリスナーを追加したり削除したり出来るようにして、これに対応出来るようにします。

スポンサーリンク

ボタンを押した時に実行するメソッドを追加する

まずは簡単なイベントリスナーの追加からやっていきましょう。

まずはヒエラルキー上に右クリック→UI→Buttonを選択し作成します。

AddListenerのテスト用ボタン

ボタンにはAddListenerTest1スクリプトを作成し取り付けます。

StartメソッドでButtonコンポーネントを取得し、ボタンの子要素のTextを書き換えてボタンに表示されるテキストを書き換えています。

ボタンにはOnClickというイベントが発生するので、それに対するイベントリスナーを設定します。

それをしているのが、

↑の部分で、ボタンをクリックするイベントが起きた時にOnClickButtonという自前のメソッドを実行するようにAddListenerメソッドで指定しています。

OnClickButtonメソッドではボタンのテキストの文字がtest1だったらtest2に書き換え、test1でなければtest1に書き換えます。

実行すると、

ボタンクリックでボタンのテキストを書き換える

↑のようになりました。

ButtonコンポーネントのOnClickイベントに手動でOnClickButtonメソッドを指定しなくても実行出来ています。

EventTriggerの取り付けとリスナーの設定

次はEventTriggerコンポーネントをスクリプトから取り付け、イベントリスナーの設定を行ってみます。

トリガーイベントを一括削除して再度登録する

まずはEventTriggerコンポーネントを取り付け、イベントリスナーの登録をしてイベントの削除をする時は全部一旦削除してから、再び登録してみます。

EventTriggerコンポーネントを取り付けた後、EventTriggerのtriggersのAddListenerメソッドでイベントリスナーを登録します。

AddListenerメソッドにはラムダ式で実行するメソッドを渡しています。

EventTrigger.Entryクラスのインスタンスを生成し、entryID(イベントの種類)とcallback(実行する処理)を設定した後、eventTrigger.triggers.Addで追加しています。

ボタンを押す度にボタン上にマウスが来た時に実行するメソッドを変更してます。

ChangeOnMouseEnterEventメソッドでは実際に実行するメソッドを切り替えていて、eventTrigger.triggersのクリアをして一旦登録したトリガーをクリアにしています。

その後、再度AddListenerで実行するメソッドを登録し、eventTrigger.triggers.Addでイベントを登録しています。

それでは確認してみます。

ボタンの中にマウスを置いた時とクリックした時のイベントリスナー登録

↑のようにボタンをクリックする度に呼び出すメソッドを変えて処理が変わっています。

イベントリスナーの一部を削除する

先ほどの例ではeventTrigger.triggersのリストを一旦全部削除してから再度イベントリスナーを登録しているので、ちょっとモヤモヤしますね。

そこで、EventTrigger.Entry毎にイベントリスナーを削除するようにしてみます。

ボタンの上にマウスポインタが入った時のイベントリスナー登録はラムダ式で設定してます。

ボタンをクリックした時のイベントリスナー登録にはUnityActionクラスをインスタンス化して設定しています。

UnityActionの場合は+=でそのまま追加でイベントリスナー登録が出来ます。

削除する場合は-=です。

OnMyPointerClick2メソッドではEventTriggerに登録したイベントリスナーを削除する為、Removeメソッドの引数にentry1を設定し、登録したOnMyPointerEnterイベントリスナーを削除しています。

その為、ボタンをクリックするとボタン内にマウスが入ってもOnMyPointerEnterメソッドが呼ばれないようになります。

それでは試してみましょう。

イベントリスナーを指定して削除する

↑のように最初はボタンの上にマウスを置くとOnMyPointerEnterメソッドが呼ばれましたが、ボタンをクリックした後はマウスの上に置いても何も実行されなくなりました。

終わりに

ButtonコンポーネントのOnClickやEventTriggerコンポーネントを手動で設定し、イベントが発生したら実行するメソッドを選択出来ますが、

同じボタンでも処理を切り替えたい時等は、スクリプトを使ってイベントリスナーの登録や削除を行うと良さそうですね。(^_^)v

参考サイト

UnityスクリプトリファレンスーEventTriggerー

UnityチュートリアルーEvents: Creating a simple messaging systemー

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます