我有一个带有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与航路点一起重新排序?如果我通过手动对数组进行随机排序走上了正确的轨道,那么我如何正确地进行临时复制,以确保不会丢失第一个被覆盖的元素?
答案 0 :(得分:0)
确保您正在拨打电话
serializedObject.ApplyModifiedProperties();
以便将更改应用回原始对象。
症状表明情况确实如此。
进一步阅读:
https://docs.unity3d.com/Manual/editor-CustomEditors.html
https://docs.unity3d.com/ScriptReference/SerializedObject.html