Unity 框架

TransfromInspector.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEditor;
  5. using System;
  6. using System.Reflection;
  7. namespace TFramework
  8. {
  9. [CustomEditor(typeof(Transform))]
  10. public class TransfromInspector : Editor
  11. {
  12. Texture w;
  13. Texture l;
  14. [SerializeField]
  15. bool isW = false;
  16. [SerializeField]
  17. bool isL = true;
  18. Transform trans;
  19. GUIContent wGC;
  20. GUIContent lGC;
  21. GUIContent cGC;
  22. bool IsCantPaste => !string.IsNullOrEmpty(EditorGUIUtility.systemCopyBuffer) && EditorGUIUtility.systemCopyBuffer.Contains("Vector3(");
  23. private SerializedProperty m_Scale;
  24. private Type constrainProportionsTransformScale;
  25. private SerializedProperty m_ConstrainProportionsScaleProperty;
  26. private object m_ConstrainProportionsScale;
  27. private MethodInfo co_Initialize;
  28. private MethodInfo co_Static_GetMixedValueFields;
  29. private MethodInfo co_DoGUI;
  30. private MethodInfo co_Static_IsBit;
  31. private MethodInfo co_Static_HandleMultiSelectionScaleChanges;
  32. private GUIContent scaleContent = EditorGUIUtility.TrTextContent("缩放", "GameObject相对于父对象的局部缩放", icon:null);
  33. private GUIContent positionContent = EditorGUIUtility.TrTextContent("位置", "", icon: null);
  34. private GUIContent rotateContent = EditorGUIUtility.TrTextContent("旋转", "", icon: null);
  35. private bool m_IsScaleDirty;
  36. private void OnEnable()
  37. {
  38. w = AssetDatabase.LoadAssetAtPath<Texture>("Assets/TFramework/Editor/Texture/W_icon.png");
  39. l = AssetDatabase.LoadAssetAtPath<Texture>("Assets/TFramework/Editor/Texture/L_icon.png");
  40. trans = target as Transform;
  41. wGC = new GUIContent(w, "显示世界坐标");
  42. lGC = new GUIContent(l, "显示本地坐标");
  43. cGC = new GUIContent();
  44. cGC.tooltip = "按比例约束缩放";
  45. m_Scale = serializedObject.FindProperty("m_LocalScale");
  46. m_ConstrainProportionsScaleProperty = serializedObject.FindProperty("m_ConstrainProportionsScale");
  47. constrainProportionsTransformScale = Type.GetType("UnityEditor.ConstrainProportionsTransformScale,UnityEditor");
  48. ConstructorInfo constructor = constrainProportionsTransformScale.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(Vector3) }, null);
  49. m_ConstrainProportionsScale = constructor.Invoke(new object[] { m_Scale.vector3Value });
  50. co_Initialize = constrainProportionsTransformScale.GetMethod("Initialize", BindingFlags.NonPublic | BindingFlags.Instance);
  51. co_Static_GetMixedValueFields= constrainProportionsTransformScale.GetMethod("GetMixedValueFields", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  52. co_DoGUI= constrainProportionsTransformScale.GetMethod("DoGUI", BindingFlags.NonPublic | BindingFlags.Instance);
  53. co_Static_IsBit= constrainProportionsTransformScale.GetMethod("IsBit", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  54. co_Static_HandleMultiSelectionScaleChanges= constrainProportionsTransformScale.GetMethod("HandleMultiSelectionScaleChanges", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  55. }
  56. public override void OnInspectorGUI()
  57. {
  58. serializedObject.Update();
  59. //base.OnInspectorGUI();
  60. using (new EditorGUILayout.HorizontalScope())
  61. {
  62. GUI.backgroundColor = isW ? Color.white : Color.gray;
  63. if (GUILayout.Button(wGC, GUILayout.Width(20), GUILayout.Height(20)))
  64. {
  65. isW = true;
  66. isL = false;
  67. }
  68. GUI.backgroundColor = Color.white;
  69. GUI.backgroundColor = isL ? Color.white : Color.gray;
  70. if (GUILayout.Button(lGC, GUILayout.Width(20), GUILayout.Height(20)))
  71. {
  72. isL = true;
  73. isW = false;
  74. }
  75. GUI.backgroundColor = Color.white;
  76. }
  77. if (isW)
  78. {
  79. using (new EditorGUILayout.HorizontalScope())
  80. {
  81. trans.position = EditorGUILayout.Vector3Field(positionContent, trans.position);
  82. if (GUILayout.Button("复制", GUILayout.ExpandWidth(false)))
  83. {
  84. string v3 = $"new Vector3({trans.position.x}f,{trans.position.y}f,{trans.position.z}f)";
  85. EditorGUIUtility.systemCopyBuffer = v3;
  86. }
  87. GUI.enabled = IsCantPaste;
  88. if (GUILayout.Button("粘贴", GUILayout.ExpandWidth(false)))
  89. {
  90. trans.position = AnalysisString(EditorGUIUtility.systemCopyBuffer);
  91. }
  92. GUI.enabled = true;
  93. }
  94. using (new EditorGUILayout.HorizontalScope())
  95. {
  96. trans.rotation = Quaternion.Euler(EditorGUILayout.Vector3Field(rotateContent, trans.rotation.eulerAngles));
  97. if (GUILayout.Button("复制", GUILayout.ExpandWidth(false)))
  98. {
  99. string v3 = $"new Vector3({trans.rotation.eulerAngles.x}f,{trans.rotation.eulerAngles.y}f,{trans.rotation.eulerAngles.z}f)";
  100. EditorGUIUtility.systemCopyBuffer = v3;
  101. }
  102. GUI.enabled = IsCantPaste;
  103. if (GUILayout.Button("粘贴", GUILayout.ExpandWidth(false)))
  104. {
  105. trans.rotation = Quaternion.Euler(AnalysisString(EditorGUIUtility.systemCopyBuffer));
  106. }
  107. GUI.enabled = true;
  108. }
  109. }
  110. else
  111. {
  112. using (new EditorGUILayout.HorizontalScope())
  113. {
  114. trans.localPosition = EditorGUILayout.Vector3Field(positionContent, trans.localPosition);
  115. if (GUILayout.Button("复制", GUILayout.ExpandWidth(false)))
  116. {
  117. string v3 = $"new Vector3({trans.localPosition.x}f,{trans.localPosition.y}f,{trans.localPosition.z}f)";
  118. EditorGUIUtility.systemCopyBuffer = v3;
  119. }
  120. GUI.enabled = IsCantPaste;
  121. if (GUILayout.Button("粘贴", GUILayout.ExpandWidth(false)))
  122. {
  123. trans.localPosition = AnalysisString(EditorGUIUtility.systemCopyBuffer);
  124. }
  125. GUI.enabled = true;
  126. }
  127. using (new EditorGUILayout.HorizontalScope())
  128. {
  129. trans.localRotation = Quaternion.Euler(EditorGUILayout.Vector3Field(rotateContent, trans.localRotation.eulerAngles));
  130. if (GUILayout.Button("复制", GUILayout.ExpandWidth(false)))
  131. {
  132. string v3 = $"new Vector3({trans.localRotation.eulerAngles.x}f,{trans.localRotation.eulerAngles.y}f,{trans.localRotation.eulerAngles.z}f)";
  133. EditorGUIUtility.systemCopyBuffer = v3;
  134. }
  135. GUI.enabled = IsCantPaste;
  136. if (GUILayout.Button("粘贴", GUILayout.ExpandWidth(false)))
  137. {
  138. trans.localRotation = Quaternion.Euler(AnalysisString(EditorGUIUtility.systemCopyBuffer));
  139. }
  140. GUI.enabled = true;
  141. }
  142. }
  143. bool isScaleDirty = m_IsScaleDirty;
  144. if (isScaleDirty)
  145. {
  146. serializedObject.Update();
  147. }
  148. using (new EditorGUILayout.HorizontalScope())
  149. {
  150. bool flag = trans != null && (bool)co_Initialize.Invoke(m_ConstrainProportionsScale, new object[] {serializedObject.targetObjects }) && this.m_ConstrainProportionsScaleProperty != null;
  151. if (flag)
  152. {
  153. int num = -1;
  154. uint mixedValueFields = (uint)co_Static_GetMixedValueFields.Invoke(null,new object[] {this.m_Scale });
  155. Vector3 vector = (Vector3)co_DoGUI.Invoke(m_ConstrainProportionsScale,new object[] { EditorGUILayout.GetControlRect(true, Array.Empty<GUILayoutOption>()), scaleContent, this.m_Scale.vector3Value, base.serializedObject.targetObjects, num, this.m_Scale, this.m_ConstrainProportionsScaleProperty });
  156. uint mixedValueFields2 = (uint)co_Static_GetMixedValueFields.Invoke(null, new object[] { this.m_Scale });
  157. bool flag2 = vector != this.m_Scale.vector3Value || mixedValueFields != mixedValueFields2;
  158. if (flag2)
  159. {
  160. bool flag3 = serializedObject.targetObjects.Length > 1;
  161. if (flag3)
  162. {
  163. bool flag4 = mixedValueFields != mixedValueFields2;
  164. if (flag4)
  165. {
  166. num = -1;
  167. for (int i = 0; i < 3; i++)
  168. {
  169. bool flag5 = (bool)co_Static_IsBit.Invoke(null,new object[] { mixedValueFields, i }) && !(bool)co_Static_IsBit.Invoke(null,new object[] { mixedValueFields2, i });
  170. if (flag5)
  171. {
  172. num = i;
  173. break;
  174. }
  175. }
  176. }
  177. bool flag6 = num != -1;
  178. if (flag6)
  179. {
  180. this.m_IsScaleDirty = (bool)co_Static_HandleMultiSelectionScaleChanges.Invoke(null,new object[]
  181. { m_Scale.vector3Value, vector,
  182. constrainProportionsTransformScale.GetProperty("constrainProportionsScale", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(m_ConstrainProportionsScale),
  183. serializedObject.targetObjects, num });
  184. }
  185. }
  186. bool flag7 = vector != this.m_Scale.vector3Value;
  187. if (flag7)
  188. {
  189. m_Scale.vector3Value = vector;
  190. }
  191. }
  192. }
  193. else
  194. {
  195. EditorGUILayout.PropertyField(m_Scale, scaleContent, Array.Empty<GUILayoutOption>());
  196. }
  197. if (GUILayout.Button("复制", GUILayout.ExpandWidth(false)))
  198. {
  199. string v3 = $"new Vector3({trans.localScale.x}f,{trans.localScale.y}f,{trans.localScale.z}f)";
  200. EditorGUIUtility.systemCopyBuffer = v3;
  201. }
  202. GUI.enabled = IsCantPaste;
  203. if (GUILayout.Button("粘贴", GUILayout.ExpandWidth(false)))
  204. {
  205. trans.localScale = AnalysisString(EditorGUIUtility.systemCopyBuffer);
  206. }
  207. GUI.enabled = true;
  208. }
  209. serializedObject.ApplyModifiedProperties();
  210. bool isScaleDirty2 = m_IsScaleDirty;
  211. if (isScaleDirty2)
  212. {
  213. m_IsScaleDirty = false;
  214. EditorGlobalTool.GetTypeInEditorAssemblies("UnityEditor", "Editor").GetMethod("OnForceReloadInspector", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(this,null);
  215. }
  216. }
  217. private Vector3 AnalysisString(string str)
  218. {
  219. string v3 = str;
  220. Vector3 vec3 = Vector3.zero;
  221. if (v3.Contains("Vector3("))
  222. {
  223. v3 = v3.Substring(v3.IndexOf("Vector3(") + 8);
  224. v3 = v3.Remove(v3.IndexOf(')'));
  225. v3 = v3.Replace("f", "");
  226. string[] value = v3.Split(',');
  227. vec3 = new Vector3(float.Parse(value[0]), float.Parse(value[1]), float.Parse(value[2]));
  228. }
  229. return vec3;
  230. }
  231. }
  232. }