using UnityEngine; using UnityEditor; using UnityEngine.UI; using ParticleEffectProfilerNameSpace; namespace U3DExtends { public class SceneEditor { static Object LastSelectObj = null;//用来记录上次选中的GameObject,只有它带有Image组件时才把图片赋值给它 static Object CurSelectObj = null; [InitializeOnLoadMethod] static void Init() { SceneView.onSceneGUIDelegate += OnSceneGUI; //选中Image节点并点击图片后即帮它赋上图片 if (Configure.IsEnableFastSelectImage) Selection.selectionChanged += OnSelectChange; } static void OnSelectChange() { LastSelectObj = CurSelectObj; CurSelectObj = Selection.activeObject; //如果要遍历目录,修改为SelectionMode.DeepAssets UnityEngine.Object[] arr = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.TopLevel); if (arr != null && arr.Length > 0) { GameObject selectObj = LastSelectObj as GameObject; if (selectObj != null && (arr[0] is Sprite || arr[0] is Texture2D)) { string assetPath = AssetDatabase.GetAssetPath(arr[0]); Image image = selectObj.GetComponent(); bool isImgWidget = false; if (image != null) { isImgWidget = true; UIEditorHelper.SetImageByPath(assetPath, image, Configure.IsAutoSizeOnFastSelectImg); } if (isImgWidget) { //赋完图后把焦点还给Image节点 EditorApplication.delayCall = delegate { Selection.activeGameObject = LastSelectObj as GameObject; }; } } } } static void OnSceneGUI(SceneView sceneView) { Event e = Event.current; bool is_handled = false; if (Configure.IsEnableDragUIToScene && (Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragPerform)) { //拉UI prefab或者图片入scene界面时帮它找到鼠标下的Canvas并挂在其上,若鼠标下没有画布就创建一个 Object handleObj = DragAndDrop.objectReferences[0]; if (!IsNeedHandleAsset(handleObj)) { //让系统自己处理 return; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; //当松开鼠标时 if (Event.current.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (var item in DragAndDrop.objectReferences) { HandleDragAsset(sceneView, item); } } is_handled = true; } else if (e.type == EventType.KeyDown && Configure.IsMoveNodeByArrowKey) { //按上按下要移动节点,因为默认情况下只是移动Scene界面而已 foreach (var item in Selection.transforms) { Transform trans = item; if (trans != null) { if (e.keyCode == KeyCode.UpArrow) { Vector3 newPos = new Vector3(trans.localPosition.x, trans.localPosition.y + 1, trans.localPosition.z); trans.localPosition = newPos; is_handled = true; } else if (e.keyCode == KeyCode.DownArrow) { Vector3 newPos = new Vector3(trans.localPosition.x, trans.localPosition.y - 1, trans.localPosition.z); trans.localPosition = newPos; is_handled = true; } else if (e.keyCode == KeyCode.LeftArrow) { Vector3 newPos = new Vector3(trans.localPosition.x - 1, trans.localPosition.y, trans.localPosition.z); trans.localPosition = newPos; is_handled = true; } else if (e.keyCode == KeyCode.RightArrow) { Vector3 newPos = new Vector3(trans.localPosition.x + 1, trans.localPosition.y, trans.localPosition.z); trans.localPosition = newPos; is_handled = true; } } } } else if (Event.current != null && Event.current.button == 1 && Event.current.type == EventType.MouseUp && Configure.IsShowSceneMenu) { if (Selection.gameObjects == null || Selection.gameObjects.Length==0 || Selection.gameObjects[0].transform is RectTransform ) { ContextMenu.AddCommonItems(Selection.gameObjects); ContextMenu.Show(); is_handled = true; } else if (Selection.gameObjects != null && Selection.activeGameObject.GetComponentsInChildren(true).Length != 0) { ContextMenu.Show(); is_handled = true; } } //else if (e.type == EventType.MouseMove)//show cur mouse pos //{ // Camera cam = sceneView.camera; // Vector3 mouse_abs_pos = e.mousePosition; // mouse_abs_pos.y = cam.pixelHeight - mouse_abs_pos.y; // mouse_abs_pos = sceneView.camera.ScreenToWorldPoint(mouse_abs_pos); // Debug.Log("mouse_abs_pos : " + mouse_abs_pos.ToString()); //} if (e!=null && Event.current.type == EventType.KeyUp && e.control && e.keyCode==KeyCode.E) LayoutInfo.IsShowLayoutName = !LayoutInfo.IsShowLayoutName; if (is_handled) Event.current.Use(); } static bool HandleDragAsset(SceneView sceneView, Object handleObj) { Event e = Event.current; Camera cam = sceneView.camera; Vector3 mouse_abs_pos = e.mousePosition; mouse_abs_pos.y = cam.pixelHeight - mouse_abs_pos.y; mouse_abs_pos = sceneView.camera.ScreenToWorldPoint(mouse_abs_pos); if (handleObj.GetType() == typeof(Sprite) || handleObj.GetType() == typeof(Texture2D)) { GameObject box = new GameObject("Image_1", typeof(Image)); Undo.RegisterCreatedObjectUndo(box, "create image on drag pic"); box.transform.position = mouse_abs_pos; Transform container_trans = UIEditorHelper.GetContainerUnderMouse(mouse_abs_pos, box); if (container_trans == null) { //没有容器的话就创建一个 container_trans = NewLayoutAndEventSys(mouse_abs_pos); } box.transform.SetParent(container_trans); mouse_abs_pos.z = container_trans.position.z; box.transform.position = mouse_abs_pos; box.transform.localScale = Vector3.one; Selection.activeGameObject = box; //生成唯一的节点名字 box.name = CommonHelper.GenerateUniqueName(container_trans.gameObject, handleObj.name); //赋上图片 Image imageBoxCom = box.GetComponent(); if (imageBoxCom != null) { imageBoxCom.raycastTarget = false; string assetPath = AssetDatabase.GetAssetPath(handleObj); UIEditorHelper.SetImageByPath(assetPath, imageBoxCom); return true; } } else { GameObject new_obj = GameObject.Instantiate(handleObj) as GameObject; if (new_obj != null) { Undo.RegisterCreatedObjectUndo(new_obj, "create obj on drag prefab"); new_obj.transform.position = mouse_abs_pos; GameObject ignore_obj = new_obj; Transform container_trans = UIEditorHelper.GetContainerUnderMouse(mouse_abs_pos, ignore_obj); if (container_trans == null) { container_trans = NewLayoutAndEventSys(mouse_abs_pos); } new_obj.transform.SetParent(container_trans); mouse_abs_pos.z = container_trans.position.z; new_obj.transform.position = mouse_abs_pos; new_obj.transform.localScale = Vector3.one; Selection.activeGameObject = new_obj; //生成唯一的节点名字 new_obj.name = CommonHelper.GenerateUniqueName(container_trans.gameObject, handleObj.name); return true; } } return false; } private static Transform NewLayoutAndEventSys(Vector3 pos) { GameObject layout = UIEditorHelper.CreatNewLayout(); pos.z = 0; layout.transform.position = pos; Vector3 last_pos = layout.transform.localPosition; last_pos.z = 0; layout.transform.localPosition = last_pos; return UIEditorHelper.GetRootLayout(layout.transform); } static bool IsNeedHandleAsset(Object obj) { if (obj.GetType() == typeof(Sprite) || obj.GetType() == typeof(Texture2D)) return true; else { GameObject gameObj = obj as GameObject; if (gameObj != null) { RectTransform uiBase = gameObj.GetComponent(); if (uiBase != null) { return true; } } } return false; } } }