Unityでオブジェクト同士の連携をさせたいことは多々あると思います。
そんなとき、EventTriggerやボタンUIにインスペクターで設定できる、クリック時にどのオブジェクトのどのメソッドを実行するっていうこれ。これを使えたら便利だなーと思いますよね。
これをUnityEventを用いて自前で実装する方法を紹介します。
ゲームオブジェクトにUnityEventを追加する
スクリプトの準備
テスト用のスクリプトを作成します。今回は実行のトリガーとなるボタンにアタッチするための「TestButton」と、実行したいメソッドが書かれている「TestScript」の2つを用意しました。
スクリプトのコード
2つのスクリプトのコードはそれぞれ下記となります。
TestButton.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class TestButton : MonoBehaviour{ [SerializeField] private UnityEvent myEvent = new UnityEvent(); void Start() { //スタート時にテスト用の関数を実行 TestFunc(); } public void TestFunc() { //myEventに登録されている関数を実行 myEvent.Invoke(); } }
TestScript.cs(実行したいメソッドが書かれているスクリプト)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TestScript : MonoBehaviour{ public void TestCallBack() { GetComponent<Text>().text = "テスト関数じっこう!"; } public void TestCallBack2() { GetComponent<Text>().text = "違う関数やオブジェクトに変更することもできる"; } public void TestCallBack3(int num) { GetComponent<Text>().text = num + " :引数もとれる"; } }
「TestButton.cs」にSerializeFieldとしてUnityEventを宣言しています。そうすることでインスペクターからUnityEventを操作できるようになります。
スクリプトの解説
TestButton.cs
[SerializeField] private UnityEvent myEvent = new UnityEvent();
インスペクターにUnityEventを表示するための宣言です。
なお、UnityEventを使用するために「using UnityEngine.Events;」のインポート記述をするようにしてください。
public void TestFunc() { //myEventに登録されている関数を実行 myEvent.Invoke(); }
このメソッドを実行するとmyEventに登録されたオブジェクトのメソッドを実行します。
Invoke()はイベントに登録されたものをすべて実行する命令となります。
TestScript.cs
自身のテキストを書き換えるだけです。これでどのメソッドが実行されたか確認できます。
ゲームオブジェクトの準備
まずはテスト用のUIボタンとテキストをヒエラルキーウィンドウに追加しました。今回はテスト用なので、実際は他の種類のオブジェクトでも大丈夫です。
シーン上ではこんな感じで配置しておきます。
ボタンに「TestButton.cs」、テキストに「TestScript.cs」をアタッチします。
ボタンのインスペクターにはスクリプトで宣言した「MyEvent()」が表示されています。
MyEventにテスト用メソッドをセット
アタッチしたTestButtonのMyEvent()にTextオブジェクトを追加し、TestScriptのメソッドを指定します。
スポンサードサーチ
動作確認
再生ボタンでゲームを実行すると、TestScript.csのTestCallBackメソッドが実行され、テキストの表示が変わります。
また、指定するメソッドを変えることで、別の動作をさせることができます。
テストメソッド2が実行されます。
引数を持つメソッドの実行
引数があるメソッドを指定した場合、インスペクター上で引数を設定できます。
インスペクターで設定した引数がメソッドに渡されます。
引数ありメソッドを指定する場合の注意点
この方法で引数アリメソッドを指定する場合、以下の注意点があります。
- 設定できる引数の数は1つのみ
- 引数はインスペクター上でしか設定できない
→つまり静的な値のみ設定可能でスクリプトからは引数を渡せない
動的で、かつ複数の引数を渡す方法についてはこちらの記事で紹介しています。
スポンサードサーチ
まとめ
この方法を使えば、ボタンのスクリプトをいじることなく、色々なオブジェクトのメソッドを実行できるようになります。
つまり、使いまわしがとてもしやすくなります。
1度作ったものを使いまわすことで作業効率がぐっと上がりますので、そういった資産をどんどん増やしていきましょう。