改组Unity ReorderableList上的嵌套属性

时间:2019-06-04 01:09:07

标签: c# unity3d serialization unity-editor

我有一个带有ReorderableList的CustomEditor,它为每个元素显示一个嵌套的ReorderableList。当我在外部父级ReorderableList中拖动元素以更改其顺序时,内部列表不会相应地更改其顺序。这是发生的事情的gif图像:

如您所见,第一项始终有一个Connected Waypoint,第二项始终有两个。

这是“路径代理”脚本:

public class PathingAgent : MonoBehaviour
{
  [System.Serializable]
  public class ConnectedWaypointsListContainer
  {
    public List<WaypointObject> connections = new List<WaypointObject>();
  }

  public List<WaypointObject> waypoints = new List<WaypointObject>();
  public List<ConnectedWaypointsListContainer> connectedWaypoints = new List<ConnectedWaypointsListContainer>();
}

这些是CustomEditor的相关部分:

  waypointsList = new ReorderableList(serializedObject, serializedObject.FindProperty("waypoints");
  SerializedProperty connectedWaypointsProperty = serializedObject.FindProperty("connectedWaypoints");
  ...
  waypointsList.onReorderCallbackWithDetails = (ReorderableList list, int oldIndex, int newIndex) =>
  {
    connectedWaypointsProperty.arraySize++;
    connectedWaypointsProperty.GetArrayElementAtIndex(connectedWaypointsProperty.arraySize - 1).objectReferenceValue = connectedWaypointsProperty.GetArrayElementAtIndex(oldIndex).objectReferenceValue;
    if(newIndex < oldIndex)
    {
      for(int i = oldIndex; i > newIndex + 1; --i)
      {
        connectedWaypointsProperty.MoveArrayElement(i - 1, i);
      }
      connectedWaypointsProperty.MoveArrayElement(connectedWaypointsProperty.arraySize - 1, newIndex);
    }
    else
    {
      for(int i = oldIndex; i < newIndex - 1; ++i)
      {
        connectedWaypointsProperty.MoveArrayElement(i + 1, i);
      }
      connectedWaypointsProperty.MoveArrayElement(connectedWayointsProperty.arraySize - 1, newIndex);
    }
    if(connectedWaypointsProperty.GetArrayElementAtIndex(connectedWaypointsProperty.arraySize - 1) != null)
    {
      connectedWaypointsProperty.DeleteArrayElementAtIndex(connectedWaypointsProperty.arraySize - 1);
    }
    connectedWaypointsProperty.DeleteArrayElementAtIndex(connectedWaypointsProperty.arraySize - 1);

我的尝试是沿着ConnectedWaypointsListContainer手动改组,这需要缓存第一个被覆盖的缓存,并用保存的数据覆盖最后一个。但是,当我尝试通过分配objectReferenceValue来将要缓存的列表复制为序列化数组中的最后一个元素时出现错误:“类型不是受支持的pptr值”。

如何使connectedWaypoint与航路点一起重新排序?如果我通过手动对数组进行随机排序走上了正确的轨道,那么我如何正确地进行临时复制,以确保不会丢失第一个被覆盖的元素?

1 个答案:

答案 0 :(得分:0)

确保您正在拨打电话

serializedObject.ApplyModifiedProperties();

以便将更改应用回原始对象。

症状表明情况确实如此。


进一步阅读:
https://docs.unity3d.com/Manual/editor-CustomEditors.html
https://docs.unity3d.com/ScriptReference/SerializedObject.html