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<Image>();
|
|
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<ParticleSystemRenderer>(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<Image>();
|
|
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<RectTransform>();
|
|
if (uiBase != null)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|