定製自己的Unity場景編輯工具介面(一)
阿新 • • 發佈:2019-02-18
Unity場景編輯工具介面(一)
我的介面工具命名為CustomAssist,下面簡稱CA;
CA新增以下功能
- Transform相對變換位置、方向、大小
- 快速切換物件啟用關閉
- 快速編組物件
- 快速命名子節點
- 計算三角面和頂點
主介面
介面裡有一部分功能並沒有完善,但我還是貼出了最新的介面,公開給大家是想告訴大家,每個人的工具介面都不一樣,都有自己整理的工具,所以這裡我將分享目錄中所列的幾個工具,簡單實用。
介面原始碼參考:
public class UnityCustomAssist : EditorWindow
{
[MenuItem("GenerateTools/Unity Custom Assist/Unity Custom Assist Window" )]
private static void ShowWindow()
{
var window =
(UnityCustomAssist)
GetWindow(typeof (UnityCustomAssist), false, "CustomAssist");
window.Show();
}
private void OnGUI()
{
EditorGUILayout.LabelField("ReadMe" );
//這裡可以使用EditorGUI或者GUI函式來定義介面按鈕,標籤等。
}
}
Transform相對變換位置、方向、大小
public static void SetPositionToZero() //設定物件位置為父節點位置
{
if (Selection.gameObjects.Length != 1) return;
var go = Selection.gameObjects[0];
var childs = SaveChilds(go.transform);
Undo.RecordObject(go.transform, "localPosition " + go.transform.name);
go.transform.localPosition = Vector3.zero;
ResetChilds(go.transform, childs);
}
public static void SetLocalRotationToFirstChild() //設定物件方向為第一個子節點的方向
{
if (Selection.gameObjects.Length != 1) return;
var go = Selection.gameObjects[0];
var childs = SaveChilds(go.transform);
if (childs.Length == 0)
return;
Undo.RecordObject(go.transform, "localRotation " + go.transform.name);
go.transform.localRotation = childs[0].localRotation;
ResetChilds(go.transform, childs);
}
public static void SetLocalScaleOne()//設定本地大小到(1,1,1)
{
if (Selection.gameObjects.Length != 1) return;
var go = Selection.gameObjects[0];
var childs = SaveChilds(go.transform);
Undo.RecordObject(go.transform, "localScale " + go.transform.name);
go.transform.localScale = Vector3.one;
ResetChilds(go.transform, childs);
}
private static Transform[] SaveChilds(Transform goTrans)
{
var childs = new Transform[goTrans.childCount];
for (var i = 0; i < childs.Length; i++)
{
childs[i] = goTrans.GetChild(i);
}
for (var i = 0; i < childs.Length; i++)
{
Undo.RecordObject(childs[i], "localPosition " + childs[i].transform.name);
childs[i].SetParent(goTrans.parent);
}
return childs;
}
private static void ResetChilds(Transform go, Transform[] childs)
{
for (var i = 0; i < childs.Length; i++)
{
Undo.RecordObject(childs[i], "localPosition " + childs[i].transform.name);
childs[i].SetParent(go);
}
}
參考以上指令碼,舉例設定位置,方向,大小各一個。可以自己搭配出更適合自己的操作,使用它的優點是,它的操作可以直接忽略子物體會引起的變化。
快速切換物件啟用關閉
[MenuItem("GenerateTools/FastKey/Batch/Enable\\Disable Multi GameObj %1")]
static void SelectEnableODisable()
{
GameObject[] gobj = Selection.gameObjects;
bool enable = !gobj[0].activeSelf;
foreach (GameObject go in gobj)
{
Undo.RecordObject(go, go.name + "setactive");
go.transform.gameObject.SetActive(enable);
}
}
快捷鍵Ctrl+1,可以快速的啟用或關閉選中物件。使用滑鼠點選屬性面板左上角來切換會比較麻煩。
快速編組物件
public static void AddGroup()
{
GameObject[] gop = Selection.gameObjects;
GameObject go = gop[0];
GameObject empty = new GameObject();
empty.transform.parent = go.transform.parent;
empty.transform.localPosition = Vector3.zero;
Undo.RegisterCreatedObjectUndo(empty, empty.name + "creat");
for (int i = 0; i < gop.Length; i++)
{
Undo.SetTransformParent(gop[i].transform, gop[i].transform.parent, gop[i].transform.name + "addg");
gop[i].transform.SetParent(empty.transform);
}
empty.name = "Group " + go.name;
Selection.activeGameObject = empty;
Debug.Log("new Group:" + empty.name);
}
快捷鍵Ctrl+4,為多選的幾個物件新增父節點並編組,等價於新建一個空物體,並將多個物件拖進來。
快速命名子節點
public static void ReName()
{
GameObject go =Selection.gameObjects[0];
string goName = go.name;
for (int i = 0; i < go.transform.childCount; i++)
{
Undo.RecordObject(go.transform.GetChild(i).gameObject, go.transform.GetChild(i).gameObject.name);
go.transform.GetChild(i).gameObject.name = goName + " " + i;
}
}
快速命名選中物件的所有子節點名字,對於強迫症嚴重的程式可以使用改方法進行快速命名。
計算三角面和頂點
public static void ComputingTriangle()
{
GameObject go = Selection.gameObjects[0];
Component[] filters;
int tris = 0;
int verts = 0;
filters = go.GetComponentsInChildren<MeshFilter>();
foreach (MeshFilter f in filters)
{
tris += f.sharedMesh.triangles.Length / 3;
verts += f.sharedMesh.vertexCount;
}
Debug.LogError("物件:" + go.name+ "\ntris:" + tris+ " verts:" + verts+"\n");
}
計算三角面和頂點,這個工具可以檢視場景中所有物件的點面的數量,也可以檢視指定物件包含的點面,便於對場景的控制。