[Unity]UIとオブジェクトに対するクリック検知の違い

Unityでゲームを制作中にクリック検知を実装するとき、何が必要か分からなくなったり忘れたりしがちなので、まとめておきます。

この記事の環境
 Unity 2021.x 以降から 2023.x Unity6

1. UIに対するクリック検知

仕組み

  • UnityのUI(ButtonやImageなど)は Canvas 上で描画され、イベント検知には EventSystem が必要です。
  • IPointerClickHandler や Unity UI のデフォルト機能(ButtonのOnClickなど)を利用します。

必要な設定

  1. Canvas を作成:
    • UI要素を配置するために Canvas が必要です。
  2. EventSystem の確認:
    • シーンに EventSystem が存在することを確認します。
    • 存在しない場合は、Hierarchy > 右クリック > UI > EventSystem から追加可能。
  3. UI要素の設定:
    • UI要素(Buttonなど)には Graphic Raycaster が必要です(Canvasに自動で設定されます)。
    • インタラクティブなUI要素(Buttonなど)は適切なイベント(例: OnClick)を設定します。

実装例

IPointerClickHandler を使う方法

C#
using UnityEngine;
using UnityEngine.EventSystems;

public class UIButtonClickHandler : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log($"UI {gameObject.name} がクリックされました!");
    }
}

ButtonのOnClickを使う方法

  1. ButtonOnClick() に関数を登録。
  2. Inspector上で簡単に設定できます。

2. オブジェクトに対するクリック検知

仕組み

  • ゲームオブジェクト(スプライトや3Dモデル)は Collider を使ってクリックを検知します。
  • Physics Raycaster(3Dオブジェクト)や Physics2D Raycaster(2Dオブジェクト)が必要です。

必要な設定

  1. Collider の設定:
    • クリックを検知したいオブジェクトに Collider または Collider2D を追加します。
  2. Raycaster の追加:
    • カメラに Physics Raycaster(3D)または Physics2D Raycaster(2D)を追加します。
  3. EventSystem の確認:
    • シーンに EventSystem が必要です。

実装例

IPointerClickHandlerを使う方法

C#
using UnityEngine;
using UnityEngine.EventSystems;

public class ObjectClickHandler : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log($"オブジェクト {gameObject.name} がクリックされました!");
    }
}

3. UIとオブジェクトクリック検知の違い

項目UIクリック検知オブジェクトクリック検知
必要コンポーネントCanvas, EventSystem, Graphic RaycasterCollider, EventSystem, Physics Raycaster/2D Raycaster
検知可能な対象UI要素(Button, Imageなど)2D/3Dオブジェクト
主要インターフェースIPointerClickHandlerIPointerClickHandler
イベントの種類ボタンのOnClickやPointerイベントColliderを介したクリックイベント

4. よくあるトラブル

UIがクリックを検知しない場合

  1. CanvasとEventSystemの確認:
    • Canvasに Graphic Raycaster が設定されているか。
    • シーンに EventSystem が存在するか。
  2. UIのレイヤーと順序:
    • UI要素が正しいSorting Orderで描画されているか。

オブジェクトがクリックを検知しない場合

  1. Colliderの有無:
    • クリック対象のオブジェクトに Collider(2D/3D)が設定されているか。
  2. カメラにRaycasterが設定されているか:
    • Physics Raycaster または Physics2D Raycaster がアタッチされているか。
    • RaycasterEvent Mask に対象オブジェクトのレイヤーが含まれているか。
  3. Culling Maskの設定:
    • カメラの Culling Mask に対象オブジェクトのレイヤーが含まれているか。

5. まとめ

  • UIとオブジェクトではクリック検知の仕組みが少し異なるため、適切な設定が必要です。
  • 必要なコンポーネント(Collider, Raycaster, EventSystemなど)を忘れずに設定しましょう。

参考

イベントシステム - Unity マニュアル
イベントシステムはキーボード、マウス、タッチやカスタムの入力に基づいて、アプリケーション内のオブジェクトにイベントを送信する方法です。イベントシステムはイベントを送信するために協調する、いくつかのコンポーネントで構成されています。

コメント

タイトルとURLをコピーしました