クリックorマウスカーソルを上に合わせたUI要素を、同階層内の最前面に並び替える。
RPGでの密集している敵の選択や、カードゲームの手札選択等での使用を想定。
SetAsLastSiblingという超マイナーメソッドを使えば簡単に実装可能。
サンプル動画
使用した雰囲気。
10秒強のショート動画。
(同系色なので、やや分かり難いです)
使い方
- 新規スクリプトを作成し、サンプルコード名と同じに命名。
- コードを全文コピペ。
- 対象の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();
}
}