Перестановка вложенных свойств в переупорядочении Unity ReorderableList - PullRequest
0 голосов
/ 04 июня 2019

У меня есть CustomEditor с ReorderableList, который отображает вложенный ReorderableList для каждого элемента. Когда я перетаскиваю элементы во внешний родительский ReorderableList, чтобы изменить их порядок, внутренние списки не меняют свой порядок соответственно. Вот изображение того, что происходит:

Как видите, первый элемент всегда имеет одну Подключенную путевую точку, а второй элемент всегда имеет две.

Это скрипт агента Pathing:

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».

Как я могу изменить порядок подключенных точек маршрута вместе с путевыми точками? Если я на правильном пути, перетасовывая массивы вручную, как правильно сделать временную копию, чтобы первый перезаписанный элемент не терялся?

1 Ответ

0 голосов
/ 17 июня 2019

Убедитесь, что вы звоните на

serializedObject.ApplyModifiedProperties();

, чтобы изменения применялись обратно к исходному объекту.

Симптом намекает на то, что это так.


Дополнительная литература:
https://docs.unity3d.com/Manual/editor-CustomEditors.html
https://docs.unity3d.com/ScriptReference/SerializedObject.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...