【Unity】ボタンなどUIのオブジェクトを選択ことを判定する

2024年4月15日

例えば、マウスでUIオブジェクトをクリックしたとき、Input.MouseDown()メソッドも実行できてしまう
UIだけ操作したいので困る!

Rayを使った処理など、ゲームオブジェクトの情報を得るコードが実装されているケースでは、そのコードは有効となり、ポーズ画面なのに、オブジェクトの移動などができてしまいます。その場合、次のようなコードで対応しましょう

実装方法

必要なusing

using UnityEngine.EventSystems;

UI以外のクリック時にのみマウスのクリック処理を実行したい

UIのところにカーソルがあると以降のコードを実行しない

UnityのUIイベントと通常の入力イベントを正しく管理するために、EventSystemクラスを利用する例です。特に、UI要素がクリックされた際に背後のゲームオブジェクトが反応してしまう問題は、EventSystem.current.IsPointerOverGameObject()メソッドを用いて判断し、これを利用して不必要な入力を無視することができます。

現在のポインター(通常はマウスカーソル)がどのUI要素上にあるかを確認します。つまり、ポインターがUI要素上にある場合、このメソッドはtrueを返し、それ以外の場合はfalseを返します。

以下のコードはUpdateメソッド内でInput.GetButtonDown("Fire1")がUI要素上で発生した場合に無視し、それ以外の場合にのみ反応するように修正する例です。

void Update()
{
    // マウスクリックがUI要素上でない場合にのみ反応する
    if (Input.GetButtonDown("Fire1") && !EventSystem.current.IsPointerOverGameObject())
    {
        // UI以外をクリックしたときに実行したいコード
    }
}

この方法を用いることで、UIボタンがクリックされた際にのみそのイベントを処理し、それ以外の場所でFire1が押された際には通常通りの処理(この場合は攻撃)を行うことができます。これにより、UI操作とゲーム内操作の干渉を防ぐことが可能です。

ワールド座標上のオブジェクトをRayで取得したい

// 追加:UI選択中は、以降のコードは実行しない
if (EventSystem.current.IsPointerOverGameObject())
{
    return;
}

// 次のようなコードの前に追加します
if (Input.GetMouseButtonDown(0))
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
}

Unity

Posted by hidepon