【问题标题】:How to drag and drop multiple sprites in inspector如何在检查器中拖放多个精灵
【发布时间】:2016-09-13 16:17:33
【问题描述】:

我有一个处理许多精灵数组的脚本。我不想一个一个地拖动它们,所以我为它写了一个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,但它要求我没有的rect和pivot。

如何让 DragAndDrop 识别出我正在放置 Sprite 而不是 Texture2D?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    我找到了解决方法。

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

    然后可以加载:

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

    【讨论】:

      【解决方案2】:

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

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

      这适用于数组和列表(可能还有其他容器类型,如果统一在检查器中显示它们)。

      【讨论】:

      • 太好了 :) 我使用的是自定义检查器,所以我想我只是错过了这个选项
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2013-07-11
      • 1970-01-01
      相关资源
      最近更新 更多