1. 程式人生 > >unity編輯器拓展二——一鍵調整scene中物件座標朝向

unity編輯器拓展二——一鍵調整scene中物件座標朝向

1.描述

  在專案中,我們遇到很多這種情況,美術製作的時候從來不管座標朝向,真正使用起來就會有各種問題。

需要美術來調整座標朝向的時候,物體數量很多,就會很麻煩,很枯燥的工作,還得耐主性子一個一個調整。

  如圖,我們今天要做的是不動任何物體的情況下,一鍵控制物體的座標朝向

 2.步驟分析

  1.繪製視窗部分

  2.lab繪製

  3.button繪製

  4.功能實現

程式碼如下:

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class SceneTool : EditorWindow
{
    [MenuItem("Owen/Tool")]
    //繪製視窗
    static void tranPoint()
    {
        SceneTool win = (SceneTool)EditorWindow.GetWindow(typeof(SceneTool), false, "Tool", false);
        win.Show();
    }
    void OnGUI()
    {
        //設定字型型別
        GUIStyle style1 = new GUIStyle();
        //字型大小為15
        style1.fontSize = 15;
        //字型顏色為灰白色
        style1.normal.textColor = new Color(0.7f, 0.7f, 0.7f);

        GUIStyle style2 = new GUIStyle();
        style2.fontSize = 13;
        style2.normal.textColor = new Color(0.7f, 0.7f, 0.7f);

        //垂直繪製
        GUILayout.BeginHorizontal();
        {
            //lab的繪製
            EditorGUILayout.LabelField("▼TransformDirection", style1);


            //按鈕的繪製
            if (GUI.Button(new Rect(100, 40, 25, 25), "↑"))
            {
                if (Selection.activeGameObject)
                {
                    forward();
                }
            }

            //座標朝向-z方向 按鈕觸發
            if (GUI.Button(new Rect(100, 100, 25, 25), "↓"))
            {
                if (Selection.activeGameObject)
                    back();
            }
            //座標朝向-x方向 按鈕觸發
            if (GUI.Button(new Rect(70, 70, 25, 25), "←"))
            {
                if (Selection.activeGameObject)
                    left();
            }
            //座標朝向x方向 按鈕觸發
            if (GUI.Button(new Rect(130, 70, 25, 25), "→"))
            {
                if (Selection.activeGameObject)
                    right();
            }
        }
        GUILayout.EndHorizontal();
    }

    //座標朝向Z軸方向
    void forward()
    {

        Transform parent = Selection.activeGameObject.transform;
        if (parent != null)
        {
            if (parent.GetComponent<Renderer>())
            {
                GameObject parent02 = new GameObject(parent.name+"-Parent");

                parent02.transform.position = parent.position;
                parent02.transform.SetParent(parent.parent);
                parent.SetParent(parent02.transform);
                Selection.activeGameObject = parent02;
                parent = parent02.transform;
            }
            Vector3 Position = parent.position;
            Vector3 rotate = parent.localEulerAngles;
            Vector3 Scale = parent.localScale;

            parent.position = Vector3.zero;
            parent.localScale = Vector3.one;

            foreach (Transform trans in parent)
            {
                trans.transform.RotateAround(Vector3.zero, Vector3.up, rotate.y);
            }
            parent.localEulerAngles = new Vector3(0, 0, 0);

            parent.transform.position = Position;
            parent.transform.localScale = Scale;
        }
    }
    //座標朝向-x方向
    void left()
    {

        Transform parent = Selection.activeGameObject.transform;

        if (parent.GetComponent<Renderer>() != null)
        {
            GameObject parent02 = new GameObject(parent.name + "-Parent");

            parent02.transform.position = parent.position;
            parent02.transform.SetParent(parent.parent);
            parent.SetParent(parent02.transform);
            Selection.activeGameObject = parent02;
            parent = parent02.transform;
        }
        Vector3 Position = parent.position;
        Vector3 rotate = parent.localEulerAngles;
        Vector3 Scale = parent.localScale;

        parent.position = Vector3.zero;
        parent.localScale = Vector3.one;

        foreach (Transform trans in parent)
        {
            trans.transform.RotateAround(Vector3.zero, Vector3.up, rotate.y + 90);
        }
        parent.localEulerAngles = new Vector3(0, -90, 0);

        parent.transform.position = Position;
        parent.transform.localScale = Scale;

    }

    //座標朝向-z方向
    void back()
    {

        Transform parent = Selection.activeGameObject.transform;

        if (parent.GetComponent<Renderer>() != null)
        {
            GameObject parent02 = new GameObject(parent.name + "-Parent");

            parent02.transform.position = parent.position;
            parent.SetParent(parent02.transform);
            Selection.activeGameObject = parent02;
            parent = parent02.transform;
        }
        Vector3 Position = parent.position;
        Vector3 rotate = parent.localEulerAngles;
        Vector3 Scale = parent.localScale;

        parent.position = Vector3.zero;
        parent.localScale = Vector3.one;

        foreach (Transform trans in parent)
        {
            trans.transform.RotateAround(Vector3.zero, Vector3.up, rotate.y + 180);
        }
        parent.localEulerAngles = new Vector3(0, -180, 0);

        parent.transform.position = Position;
        parent.transform.localScale = Scale;

    }

    //座標朝向X方向
    void right()
    {

        Transform parent = Selection.activeGameObject.transform;

        if (parent.GetComponent<Renderer>() != null)
        {
            GameObject parent02 = new GameObject(parent.name + "-Parent");

            parent02.transform.position = parent.position;
            parent02.transform.SetParent(parent.parent);
            parent.SetParent(parent02.transform);
            Selection.activeGameObject = parent02;
            parent = parent02.transform;
        }
        Vector3 Position = parent.position;
        Vector3 rotate = parent.localEulerAngles;

        Vector3 Scale = parent.localScale;

        parent.position = Vector3.zero;
        parent.localScale = Vector3.one;


        foreach (Transform trans in parent)
        {
            trans.transform.RotateAround(Vector3.zero, Vector3.up, rotate.y + 270);
        }
        parent.localEulerAngles = new Vector3(0, -270, 0);

        parent.transform.position = Position;
        parent.transform.localScale = Scale;
    }
}

操作檢視如下: