Unity: スクリプトから生成したオブジェクトにEventTriggerをアタッチする
Unityで生成されたオブジェクトにEventTriggerをアタッチする方法をメモとして残しておく。
やりたいこと
- スクリプトからGameObjectを生成する
- 生成されたオブジェクトをクリックしたときにイベントを発生させたい。
オブジェクトを生成する
とりあえず立方体オブジェクトを生成してみる。
1. 空のGameObject (BoxGenerator) をシーンに生成
2. コンポーネントに以下のスクリプトを貼り付ける
今回はクラス名をBoxGeneratorとした。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BoxGenerator : MonoBehaviour { public GameObject box; // Start is called before the first frame update void Start() { Instantiate(box, new Vector3(0, 0, 0), Quaternion.identity); } // Update is called once per frame void Update() {} }
3. スクリプトのboxにPrefabを参照させる
生成したいオブジェクトを選択する。
シーンを実行すると、ちゃんと生成された。
次はこのオブジェクトにEventTriggerを付与してみる。
EventTriggerを加える
1. EventSystem
を生成する
UI>Event System
からシーンに追加する
これが存在しないと正しくイベントを処理できないので注意!
2. CameraにPhysics Raycaster
コンポーネントを追加する
これによりCameraを通じて、ポインタの位置から直線上にあるオブジェクトを判別できるようになる。
3. 生成するPrefabにColliderを設定する
以下の二点を確認する。
- 何らかのColliderが存在している
- Is Trigger
が有効になっている
これらを付与することによって、先ほど設定したPhysics Raycaster
の判別対象になる。
4. 発生させるイベントのスクリプトを用意する
今回はクリックした場合に何かを起こすスクリプトを付与したいので、以下のような物を用意する。
今回はクラス名をTestEventTriggerとした。
using UnityEngine; using UnityEngine.EventSystems; public class TestEventTrigger : EventTrigger { public override void OnPointerClick(PointerEventData eventData) { Debug.Log("Box is clicked"); } }
注意点としては、
- using UnityEngine.EventSystems
を参照していること
- EventTrigger
を継承したクラスであること
- 起こしたいイベントに対応するメソッドをoverride
すること
他の利用可能なメソッドについてはこちら
5. 生成したオブジェクトにアタッチする
先ほど作ったBoxGeneratorを改造する。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BoxGenerator : MonoBehaviour { public GameObject box; // Start is called before the first frame update void Start() { GameObject boxObj = Instantiate(box, new Vector3(0, 0, 0), Quaternion.identity); boxObj.AddComponent<TestEventTrigger>(); } // Update is called once per frame void Update() { } }
Instantiate
の結果を変数に格納するAddComponent
メソッドから、先ほど作成したTestEventTrigger
を加える
シーンを実行し、オブジェクトをクリックするとちゃんとConsoleにログが吐かれた。