【问题标题】:Unity: Adding a blank element to an array of SerializedProperty'sUnity:将空白元素添加到 SerializedProperty 的数组中
【发布时间】:2017-05-26 05:44:58
【问题描述】:

我正在尝试在 Unity Inspector 中创建一个用于绘制任意序列化对象数组的类。我可以很好地绘制它们,但是在函数的末尾我想要一个按钮来向数组添加一个空元素。我可以在网上找到的大多数建议都是简单地使用 arraySize++,但这会复制数组的最后一个元素,这不是所需的行为。到目前为止我所拥有的是:

public static void ShowArray(SerializedProperty arr, Type elemType)
{
    //Draw array elements

    if (GUILayout.Button("ADD EMPTY ELEMENT")) 
    {
        arr.arraySize += 1;
        SerializedProperty prop = arr.GetArrayElementAtIndex (arr.arraySize - 1);
        prop.isExpanded = true;
        UnityEngine.Object nextObj = Activator.CreateInstance (elemType) as UnityEngine.Object;
        prop.objectReferenceValue = nextObj;
    }
}

然而这行不通:

prop.objectReferenceValue = nextObj;

出现错误:类型不是受支持的 pptr 值

这可能是因为元素类型派生自 System.Object 而不是 UnityEngine.Object,但我不确定如何解决这个问题?很明显,Unity 能够序列化和绘制从 System.Object 派生的序列化对象,因为整个数组都填充了相同类型的元素,但是我如何构造和附加一个新的呢?

【问题讨论】:

    标签: c# arrays user-interface unity3d serialization


    【解决方案1】:

    可能有点晚了 :) 但实际上有一个解决方法。我假设您正在尝试在编辑器脚本中执行此操作。因此,您可以达到实际目标,例如:

    YourType trg { get { return target as YourType; } }
    

    当您将新项目添加到您的收藏时,请使用此参考。假设你有一个数组。所以你可以这样做:

    if (GUILayout.Button("ADD EMPTY ELEMENT")) 
    {
        arr.InsertArrayElementAtIndex(arr.arraySize);
        //arr is your actual Serializable Array field
        trg.arr[trg.arr.Length - 1] = new YourType() { isExpanded = true };
    } 
    

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 2017-01-23
      相关资源
      最近更新 更多