【Unity】ボタンなどUIのオブジェクトを選択ことを判定する
例えば、マウスで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);
}
ディスカッション
コメント一覧
まだ、コメントがありません