1. 程式人生 > >定製自己的Unity場景編輯工具介面(一)

定製自己的Unity場景編輯工具介面(一)

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()//設定本地大小到(111) { 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");


    }

計算三角面和頂點,這個工具可以檢視場景中所有物件的點面的數量,也可以檢視指定物件包含的點面,便於對場景的控制。