using UnityEngine;
using UnityEditor;
using System;
namespace XGame.Editor.ObjectCollection
{
public class DragAreaGUI
{
public static UnityEngine.Object ObjectField(Rect position, Type objType, Type[] blackTypes = null)
{
return ObjectField(position, objType, null, null, null, blackTypes);
}
///
/// DragArea
///
/// 限定拖拽进来的类型
/// 显示信息
/// 返回拖拽进来的Object,不符合条件为空
public static UnityEngine.Object ObjectField(Rect position, Type objectType,
GUIContent title = null, GUIStyle style = null, string meg = null, Type[] blackTypes = null)
{
Event aEvent;
aEvent = Event.current;
UnityEngine.Object temp = null;
var dragArea = position;
if (title == null)
{
if (string.IsNullOrEmpty(meg))
{
meg = "Drag here to add";
}
title = new GUIContent(meg + $"\n({objectType.Name})");
}
if (style == null)
{
style = new GUIStyle("Button")
{
alignment = TextAnchor.MiddleCenter,
fontStyle = FontStyle.BoldAndItalic,
fontSize = 12,
};
}
GUI.Box(dragArea, title, style);
switch (aEvent.type)
{
case EventType.DragUpdated:
if (!dragArea.Contains(aEvent.mousePosition))
{
return null;
}
if (Selection.activeObject)
{
UnityEngine.Object judge = TryReadComponentFromGameObject(DragAndDrop.objectReferences[0], objectType, blackTypes);
if (judge == null)
{
DragAndDrop.visualMode = DragAndDropVisualMode.None;
}
else
{
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
}
}
break;
case EventType.DragPerform:
if (!dragArea.Contains(aEvent.mousePosition))
{
return null;
}
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
if (aEvent.type == EventType.DragPerform)
{
if (Selection.activeObject)
{
DragAndDrop.AcceptDrag();
temp = TryReadComponentFromGameObject(DragAndDrop.objectReferences[0], objectType, blackTypes);
}
}
Event.current.Use();
break;
default:
break;
}
return temp;
}
private static UnityEngine.Object TryReadComponentFromGameObject(UnityEngine.Object obj, Type objectType, Type[] blackTypes)
{
//Debug.Log($"TryReadComponentFromGameObject obj:{obj.name} objectType:{objectType} blackTypes:{blackTypes != null}");
var go = obj as GameObject;
if (blackTypes != null)
{
var comps = go.GetComponents(typeof(Component));
foreach (var comp in comps)
{
foreach (var item in blackTypes)
{
if (item.IsAssignableFrom(comp.GetType()))
{
return null;
}
}
}
}
if (go != null && objectType == typeof(GameObject))
{
return go;
}
if (go != null && objectType != null && objectType.IsSubclassOf(typeof(Component)))
{
var comps = go.GetComponents(typeof(Component));
foreach (var comp in comps)
{
if (objectType.IsAssignableFrom(comp.GetType()))
{
return comp;
}
}
}
return null;
}
}
}