我有一个处理许多精灵数组的脚本。我不想一个一个地拖动它们所以我为它编写了一个CustomEditor
,它允许我使用拖放操作一次分配多个精灵:
[CustomEditor(typeof(MyMonoBehaviour))]
public class MyMonoBehaviourEditor : Editor
{
Sprite[] sprites;//actually Sprite[,][] but simplified here
Object[] DropAreaGUI()
{
Event evt = Event.current;
Rect drop_area = GUILayoutUtility.GetRect(0.0f, 20.0f, GUILayout.ExpandWidth(true));
GUI.Box(drop_area, "Drop here!");
switch (evt.type)
{
case EventType.DragUpdated:
case EventType.DragPerform:
if (!drop_area.Contains(evt.mousePosition))
return null;
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
if (evt.type == EventType.DragPerform)
{
DragAndDrop.AcceptDrag();
return DragAndDrop.objectReferences;
}
break;
}
return null;
}
void OnInspectorGUI(){
var drops = DropAreaGUI();
if (drops != null)
{
//the following line gives me error
sprites = drops.Select(x => (x as Sprite)).ToArray();
}
}
}
我锁定了检查器,从Project中选择了12个精灵,将它们拖到框中,当我放下它时,它给了我这个错误:ArgumentException: GUILayout: Mismatched LayoutGroup.DragPerform
我注意到DragAndDrop.objectReferences
会返回Object[]
,在我的情况下是Texture2D[]
,我无法将其投放到Sprite[]
。我试过了Sprite.Create
,但它要求我没有的矩形和枢轴。
如何让DragAndDrop识别出我正在删除Sprites而不是Texture2D?
答案 0 :(得分:1)
如果您正在尝试将多个精灵分配给检查器中的数组,您实际上只需将它们拖放到数组本身即可。
您通常要做的是选择要将其拖入的资源,然后点击检查器右上角的挂锁将其锁定。然后,您可以选择多个对象并将它们拖动到数组本身(带有下拉菜单的数组名称),而不是拖到数组的任何特定插槽中。然后,Unity会自动使用您放置的数据填充数组。
这适用于数组和列表(以及可能的其他容器类型,如果unity在检查器中显示它们)。
答案 1 :(得分:0)
我找到了解决方法。
而不是return DragAndDrop.objectReferences;
我写了return DragAndDrop.paths;
然后加载:
sprites = drops.Select(x => AssetDatabase.LoadAssetAtPath<Sprite>(x)).ToArray();