Unity: スクリプトから生成したオブジェクトにEventTriggerをアタッチする

Unityで生成されたオブジェクトにEventTriggerをアタッチする方法をメモとして残しておく。

やりたいこと

  1. スクリプトからGameObjectを生成する
  2. 生成されたオブジェクトをクリックしたときにイベントを発生させたい。

オブジェクトを生成する

とりあえず立方体オブジェクトを生成してみる。

1. 空のGameObject (BoxGenerator) をシーンに生成

f:id:teriyaki398:20210212231006p:plain

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を参照させる

生成したいオブジェクトを選択する。 f:id:teriyaki398:20210212231017p:plain

シーンを実行すると、ちゃんと生成された。

次はこのオブジェクトにEventTriggerを付与してみる。 f:id:teriyaki398:20210212231507p:plain

EventTriggerを加える

1. EventSystemを生成する

UI>Event Systemからシーンに追加する

これが存在しないと正しくイベントを処理できないので注意!

f:id:teriyaki398:20210212233759p:plain:w300

2. CameraにPhysics Raycasterコンポーネントを追加する

これによりCameraを通じて、ポインタの位置から直線上にあるオブジェクトを判別できるようになる。

f:id:teriyaki398:20210212232336p:plain:w300

3. 生成するPrefabにColliderを設定する

以下の二点を確認する。 - 何らかのColliderが存在している - Is Triggerが有効になっている これらを付与することによって、先ほど設定したPhysics Raycasterの判別対象になる。

f:id:teriyaki398:20210212232048p:plain

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すること

他の利用可能なメソッドについてはこちら

docs.unity3d.com

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にログが吐かれた。

f:id:teriyaki398:20210212234000p:plain