UnityのHierarchyの並び順(Sibling)を上下するショートカットを作った。
ドラッグアンドドロップでも移動は出来るが狙った位置に移動できなかったり、階層が変わってしまったりしてイラッとしていた。
ショートカットにより瞬時に移動できる。
使い方
Editorフォルダ内にUniSiblingChanger.csを入れる。
標準では以下にキーを割り当てている。
Ctrl(Cmd) + Shift + "+" : 下(手前)に移動
Ctrl(Cmd) + Shift + "*" : 上(奥)に移動
Ctrl + Shift + "-"は既にショートカットが割り当てられていた。
コード
using UnityEditor;
using System.Linq;
/// <summary>
/// Siblingを上下に移動させるエディタ拡張
/// </summary>
public class UniSiblingChanger : Editor
{
/// <summary>
/// Siblingを上げ、前方に移動する
/// </summary>
[MenuItem("GameObject/Set to Next Sibling %#+")]
static void SetToNextSibling()
{
ChangeSibling(1);
}
/// <summary>
/// Siblingを下げ、後方に移動する
/// </summary>
[MenuItem("GameObject/Set to Previous Sibling %#*")]
static void SetToPreviousSibling()
{
ChangeSibling(-1);
}
/// <summary>
/// Siblingを移動量変える
/// </summary>
/// <param name="count">移動量</param>
static void ChangeSibling(int count)
{
var objects = Selection.gameObjects;
if(objects == null) {
return;
}
// ソート条件
var desc = count > 0 ? -1 : 1;
// 並び替え
foreach(var obj in objects.OrderBy(x => desc * x.transform.GetSiblingIndex())) {
var index = obj.transform.GetSiblingIndex();
obj.transform.SetSiblingIndex(index + count);
}
}
}
仕組み
Inspectorで選択中のオブジェクトはSelection.gameObjectsで取得できる。
transform.GetSiblingIndex()で階層内の順番を取得する。
transform.SetSiblingIndex()で階層内の順番を設定する。
GitHub