【Unity】クリックorマウスオーバーしたUIを最前面に表示

【Unity】マウスカーソルを上に乗せたUIを最前面に並び替え

クリックorマウスカーソルを上に合わせたUI要素を、同階層内の最前面に並び替える。
RPGでの密集している敵の選択や、カードゲームの手札選択等での使用を想定。

SetAsLastSiblingという超マイナーメソッドを使えば簡単に実装可能。

サンプル動画

使用した雰囲気。
10秒強のショート動画。

(同系色なので、やや分かり難いです)

使い方

  1. 新規スクリプトを作成し、サンプルコード名と同じに命名。
  2. コードを全文コピペ。
  3. 対象のUI要素にアタッチ。

備考

注意

  • OnMouseEnterや、OnMouseDown等のイベント関数は、Collider付きオブジェクトと旧UIにしか対応していない。
  • ヒエラルキーでの順番を操作する為、LayoutGroupを適用していると位置も変更されるので注意。

挙動

  • 親オブジェクトのOnTransformChildrenChangedは呼ばれない。
    (直接順番を操作しているだけで、parentを付け直しているという訳ではない)

無効化

以下の場合は呼ばれない。

  • 親Canvasのenabledがfalse。
  • 親CanvasのGraphic Raycasterが無効化されている。
  • 親Canvasが非アクティブ状態。
  • 本体が非アクティブ状態。
  • ボタンの場合、Imageコンポーネントのenabledがfalse。
  • 各コンポーネントのオプションのRaycastTargetがfalse。

コード

FocusOnPointerEnter (マウスオーバーで最前面に並び替え)

  • PCのみに対応。
    *(スマホにマウスカーソル相当の機能が無い為、マウスオーバー判定不可)


using UnityEngine;
using UnityEngine.EventSystems;

//インターフェイスの継承が必須。
public class FocusOnPointerEnter : MonoBehaviour, IPointerEnterHandler
{
//一応、キャッシュしておく。
	Transform tf;


	void Awake()
	{
		tf = transform;
	}


//public必須。
	public void OnPointerEnter(PointerEventData data)
	{
		tf.SetAsLastSibling();
	}
}

FocusOnPointerDown (クリックorタップで最前面に並べ替え)

  • PC&スマホ対応。
  • 対象がボタンの場合は、普通にリスナー登録メソッド内にSetAsLastSiblingを追記すれば良い。


using UnityEngine;
using UnityEngine.EventSystems;

//PointerEnterと別のインターフェイスなので注意。
public class FocusOnPointerDown : MonoBehaviour, IPointerDownHandler
{
	Transform tf;


	void Awake()
	{
		tf = transform;
	}


	public void OnPointerDown(PointerEventData eventData)
	{
		tf.SetAsLastSibling();
	}
}

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