unity編輯器拓展二——一鍵調整scene中物件座標朝向
阿新 • • 發佈:2019-02-04
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; } }
操作檢視如下: