源战役客户端
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

234 satır
9.6 KiB

  1. using UnityEngine;
  2. using UnityEditor;
  3. using UnityEngine.UI;
  4. using ParticleEffectProfilerNameSpace;
  5. namespace U3DExtends {
  6. public class SceneEditor {
  7. static Object LastSelectObj = null;//用来记录上次选中的GameObject,只有它带有Image组件时才把图片赋值给它
  8. static Object CurSelectObj = null;
  9. [InitializeOnLoadMethod]
  10. static void Init()
  11. {
  12. SceneView.onSceneGUIDelegate += OnSceneGUI;
  13. //选中Image节点并点击图片后即帮它赋上图片
  14. if (Configure.IsEnableFastSelectImage)
  15. Selection.selectionChanged += OnSelectChange;
  16. }
  17. static void OnSelectChange()
  18. {
  19. LastSelectObj = CurSelectObj;
  20. CurSelectObj = Selection.activeObject;
  21. //如果要遍历目录,修改为SelectionMode.DeepAssets
  22. UnityEngine.Object[] arr = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.TopLevel);
  23. if (arr != null && arr.Length > 0)
  24. {
  25. GameObject selectObj = LastSelectObj as GameObject;
  26. if (selectObj != null && (arr[0] is Sprite || arr[0] is Texture2D))
  27. {
  28. string assetPath = AssetDatabase.GetAssetPath(arr[0]);
  29. Image image = selectObj.GetComponent<Image>();
  30. bool isImgWidget = false;
  31. if (image != null)
  32. {
  33. isImgWidget = true;
  34. UIEditorHelper.SetImageByPath(assetPath, image, Configure.IsAutoSizeOnFastSelectImg);
  35. }
  36. if (isImgWidget)
  37. {
  38. //赋完图后把焦点还给Image节点
  39. EditorApplication.delayCall = delegate
  40. {
  41. Selection.activeGameObject = LastSelectObj as GameObject;
  42. };
  43. }
  44. }
  45. }
  46. }
  47. static void OnSceneGUI(SceneView sceneView)
  48. {
  49. Event e = Event.current;
  50. bool is_handled = false;
  51. if (Configure.IsEnableDragUIToScene && (Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragPerform))
  52. {
  53. //拉UI prefab或者图片入scene界面时帮它找到鼠标下的Canvas并挂在其上,若鼠标下没有画布就创建一个
  54. Object handleObj = DragAndDrop.objectReferences[0];
  55. if (!IsNeedHandleAsset(handleObj))
  56. {
  57. //让系统自己处理
  58. return;
  59. }
  60. DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
  61. //当松开鼠标时
  62. if (Event.current.type == EventType.DragPerform)
  63. {
  64. DragAndDrop.AcceptDrag();
  65. foreach (var item in DragAndDrop.objectReferences)
  66. {
  67. HandleDragAsset(sceneView, item);
  68. }
  69. }
  70. is_handled = true;
  71. }
  72. else if (e.type == EventType.KeyDown && Configure.IsMoveNodeByArrowKey)
  73. {
  74. //按上按下要移动节点,因为默认情况下只是移动Scene界面而已
  75. foreach (var item in Selection.transforms)
  76. {
  77. Transform trans = item;
  78. if (trans != null)
  79. {
  80. if (e.keyCode == KeyCode.UpArrow)
  81. {
  82. Vector3 newPos = new Vector3(trans.localPosition.x, trans.localPosition.y + 1, trans.localPosition.z);
  83. trans.localPosition = newPos;
  84. is_handled = true;
  85. }
  86. else if (e.keyCode == KeyCode.DownArrow)
  87. {
  88. Vector3 newPos = new Vector3(trans.localPosition.x, trans.localPosition.y - 1, trans.localPosition.z);
  89. trans.localPosition = newPos;
  90. is_handled = true;
  91. }
  92. else if (e.keyCode == KeyCode.LeftArrow)
  93. {
  94. Vector3 newPos = new Vector3(trans.localPosition.x - 1, trans.localPosition.y, trans.localPosition.z);
  95. trans.localPosition = newPos;
  96. is_handled = true;
  97. }
  98. else if (e.keyCode == KeyCode.RightArrow)
  99. {
  100. Vector3 newPos = new Vector3(trans.localPosition.x + 1, trans.localPosition.y, trans.localPosition.z);
  101. trans.localPosition = newPos;
  102. is_handled = true;
  103. }
  104. }
  105. }
  106. }
  107. else if (Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp && Configure.IsShowSceneMenu)
  108. {
  109. if (Selection.gameObjects == null || Selection.gameObjects.Length==0 || Selection.gameObjects[0].transform is RectTransform )
  110. {
  111. ContextMenu.AddCommonItems(Selection.gameObjects);
  112. ContextMenu.Show();
  113. is_handled = true;
  114. }
  115. else if (Selection.gameObjects != null && Selection.activeGameObject.GetComponentsInChildren<ParticleSystemRenderer>(true).Length != 0)
  116. {
  117. ContextMenu.Show();
  118. is_handled = true;
  119. }
  120. }
  121. //else if (e.type == EventType.MouseMove)//show cur mouse pos
  122. //{
  123. // Camera cam = sceneView.camera;
  124. // Vector3 mouse_abs_pos = e.mousePosition;
  125. // mouse_abs_pos.y = cam.pixelHeight - mouse_abs_pos.y;
  126. // mouse_abs_pos = sceneView.camera.ScreenToWorldPoint(mouse_abs_pos);
  127. // Debug.Log("mouse_abs_pos : " + mouse_abs_pos.ToString());
  128. //}
  129. if (e!=null && Event.current.type == EventType.KeyUp && e.control && e.keyCode==KeyCode.E)
  130. LayoutInfo.IsShowLayoutName = !LayoutInfo.IsShowLayoutName;
  131. if (is_handled)
  132. Event.current.Use();
  133. }
  134. static bool HandleDragAsset(SceneView sceneView, Object handleObj)
  135. {
  136. Event e = Event.current;
  137. Camera cam = sceneView.camera;
  138. Vector3 mouse_abs_pos = e.mousePosition;
  139. mouse_abs_pos.y = cam.pixelHeight - mouse_abs_pos.y;
  140. mouse_abs_pos = sceneView.camera.ScreenToWorldPoint(mouse_abs_pos);
  141. if (handleObj.GetType() == typeof(Sprite) || handleObj.GetType() == typeof(Texture2D))
  142. {
  143. GameObject box = new GameObject("Image_1", typeof(Image));
  144. Undo.RegisterCreatedObjectUndo(box, "create image on drag pic");
  145. box.transform.position = mouse_abs_pos;
  146. Transform container_trans = UIEditorHelper.GetContainerUnderMouse(mouse_abs_pos, box);
  147. if (container_trans == null)
  148. {
  149. //没有容器的话就创建一个
  150. container_trans = NewLayoutAndEventSys(mouse_abs_pos);
  151. }
  152. box.transform.SetParent(container_trans);
  153. mouse_abs_pos.z = container_trans.position.z;
  154. box.transform.position = mouse_abs_pos;
  155. box.transform.localScale = Vector3.one;
  156. Selection.activeGameObject = box;
  157. //生成唯一的节点名字
  158. box.name = CommonHelper.GenerateUniqueName(container_trans.gameObject, handleObj.name);
  159. //赋上图片
  160. Image imageBoxCom = box.GetComponent<Image>();
  161. if (imageBoxCom != null)
  162. {
  163. imageBoxCom.raycastTarget = false;
  164. string assetPath = AssetDatabase.GetAssetPath(handleObj);
  165. UIEditorHelper.SetImageByPath(assetPath, imageBoxCom);
  166. return true;
  167. }
  168. }
  169. else
  170. {
  171. GameObject new_obj = GameObject.Instantiate(handleObj) as GameObject;
  172. if (new_obj != null)
  173. {
  174. Undo.RegisterCreatedObjectUndo(new_obj, "create obj on drag prefab");
  175. new_obj.transform.position = mouse_abs_pos;
  176. GameObject ignore_obj = new_obj;
  177. Transform container_trans = UIEditorHelper.GetContainerUnderMouse(mouse_abs_pos, ignore_obj);
  178. if (container_trans == null)
  179. {
  180. container_trans = NewLayoutAndEventSys(mouse_abs_pos);
  181. }
  182. new_obj.transform.SetParent(container_trans);
  183. mouse_abs_pos.z = container_trans.position.z;
  184. new_obj.transform.position = mouse_abs_pos;
  185. new_obj.transform.localScale = Vector3.one;
  186. Selection.activeGameObject = new_obj;
  187. //生成唯一的节点名字
  188. new_obj.name = CommonHelper.GenerateUniqueName(container_trans.gameObject, handleObj.name);
  189. return true;
  190. }
  191. }
  192. return false;
  193. }
  194. private static Transform NewLayoutAndEventSys(Vector3 pos)
  195. {
  196. GameObject layout = UIEditorHelper.CreatNewLayout();
  197. pos.z = 0;
  198. layout.transform.position = pos;
  199. Vector3 last_pos = layout.transform.localPosition;
  200. last_pos.z = 0;
  201. layout.transform.localPosition = last_pos;
  202. return UIEditorHelper.GetRootLayout(layout.transform);
  203. }
  204. static bool IsNeedHandleAsset(Object obj)
  205. {
  206. if (obj.GetType() == typeof(Sprite) || obj.GetType() == typeof(Texture2D))
  207. return true;
  208. else
  209. {
  210. GameObject gameObj = obj as GameObject;
  211. if (gameObj != null)
  212. {
  213. RectTransform uiBase = gameObj.GetComponent<RectTransform>();
  214. if (uiBase != null)
  215. {
  216. return true;
  217. }
  218. }
  219. }
  220. return false;
  221. }
  222. }
  223. }