オブジェクトをクリックしたら、アクションを起こす(イベントを使う)

2023年5月25日

Unityでイベントを使い、Cubeをクリックしたら前に進むサンプルを作成します。

実行結果

まずは実行した様子を見てみましょう
Cubeをクリックすると前方(Z軸方向)へ進みます

シーン作成

Mainカメラからイベントを取得できるようにする

MainカメラにPhysicsRaycasterコンポーネントを追加します。


イベントシステムを追加

ヒエラルキーにイベントシステムを追加して、イベントを受け取れるようにします


スクリプトを作成

クリックイベントを受け取れるようにスクリプトを作成します

using UnityEngine;
using UnityEngine.EventSystems;

// Rigidbodyコンポーネントがアタッチされていなければアタッチします
[RequireComponent(typeof(Rigidbody))]
// インターフェースを実装します
public class CubeControlEvent : MonoBehaviour, IPointerClickHandler
{
    Rigidbody rigidBody;

    // インスペクタで調整が可能になります
    public Vector3 force = new Vector3(0, 0, 10);

    void Start()
    {
        rigidBody = GetComponent<Rigidbody>();
    }

    // ここに、クリックした時に実行したいコードを記述します。
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("クリックイベントが発生");
        // 瞬発的に力を加えます(オブジェクトの質量の無視の設定です)
        rigidBody.AddForce(force, ForceMode.VelocityChange);
    }
}

OnPointerClickイベントで、クリックされた時の処理をします
引数でPointerEventData型を取得できます。クラスのプロパティ一覧を下の参考のところに載せておきます

 public void OnPointerClick(PointerEventData eventData)

Cubeにアタッチします

Rigidbodyコンポーネントが自動的にAddComponentされます

Cubeが落下してしまいますので、UseGravityはオフにしておきます

Cubeのタグを変更します

もし、タグがPlayerならば・・・と条件をつけています
条件はそのほかでも構いません(名前が〇〇ならばとか、宣言しているLife値が〇〇ならばとか)

完成!

実行してみましょう
イベント駆動(イベントドリブン)型のアプリは多く存在します
たくさんのサンプルに触れて、自分でも活用できるようにしておきましょう

他のアクション(マウスが物体の上に乗った時、マウスが物体から離れた時)

// IPointerExitHandlerインターフェースを実装(classに:をつけて追記)します。
public class CubeControlEvent : MonoBehaviour, IPointerClickHandler, IPointerExitHandler, IPointerEnterHandler
{
    // マウスがCubeから離れた場合
    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("マウスが離れました");
    }
    // マウスがCubeに乗った場合
    // IPointerEnterHandlerインターフェースを実装(classに:をつけて追記)します。
    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("マウスが乗っています");
    }
}

参考

PointerEventData型

buttonこのイベントで使用する InputButton
clickCount続けてクリックした数
clickTime最後にクリックイベントが送信された時間
delta最後の更新からのデルタポインタ
draggingDetermines whether the user is dragging the mouse or trackpad.
enterEventCamera最後に OnPointerEnter イベントに関連付けられたカメラ
hoveredマウスが上にのっているオブジェクトのスタックリスト
lastPress最後に押された GameObject。
pointerCurrentRaycast現在のイベントにが関連付けられている RaycastResult 
pointerDragThe object that is receiving OnDrag.
pointerEnter`OnPointerEnter` を受け取るゲームオブジェクト
pointerIdIdentification of the pointer.
pointerPressThe GameObject that received the OnPointerDown.
pointerPressRaycastReturns the RaycastResult associated with a mouse click, gamepad button press or screen touch.
position現在のポインタの位置
pressEventCamera最後に OnPointerPress イベントに関連付けられたカメラ
pressPositionThe screen space coordinates of the last pointer click.
rawPointerPress押下イベントを処理できない場合でも、オブジェクト上で押したことになります。
scrollDelta最後の更新から移動したスクロール量
useDragThresholdドラッグするときのしきい値を使用するかどうか

どのような値が実際に得られるのかの確認

ブレークポイントを置いて、確認してみましょう

大きな緑の四角で囲われているところが、上記表と一致しています

例えば、positionは、"(275.00, 128.00)"になっています。これは、スクリーン座標になります

Unity

Posted by hidepon