源战役客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

235 行
9.6 KiB

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;
}
}
}