如何在检查器中拖放多个精灵

时间:2016-09-13 16:17:33

标签: unity3d

我有一个处理许多精灵数组的脚本。我不想一个一个地拖动它们所以我为它编写了一个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?

2 个答案:

答案 0 :(得分:1)

如果您正在尝试将多个精灵分配给检查器中的数组,您实际上只需将它们拖放到数组本身即可。

您通常要做的是选择要将其拖入的资源,然后点击检查器右上角的挂锁将其锁定。然后,您可以选择多个对象并将它们拖动到数组本身(带有下拉菜单的数组名称),而不是拖到数组的任何特定插槽中。然后,Unity会自动使用您放置的数据填充数组。

这适用于数组和列表(以及可能的其他容器类型,如果unity在检查器中显示它们)。

答案 1 :(得分:0)

我找到了解决方法。

而不是return DragAndDrop.objectReferences;我写了return DragAndDrop.paths;

然后加载:

sprites = drops.Select(x => AssetDatabase.LoadAssetAtPath<Sprite>(x)).ToArray();