Пользовательский редактор сбрасывает список каждого кадра

Я пытаюсь создать переупорядочиваемый список в единстве, который хранит список пользовательских классов:

using System;
using UnityEngine;

[Serializable]
public struct OnboardingItemData
{
   [Tooltip("The hint gameobject")]
   public GameObject prefab;

   [Tooltip("The object this hint is highlighting")]
   public GameObject target;

}

Этот класс находится в списке:

using System;
    using System.Collections.Generic;
    using UnityEngine;


    public class OnboardingItemList : MonoBehaviour
    {
    public List<OnboardingItemData> list = new List<OnboardingItemData>();

    private void Update()
    {
        Debug.Log("List count: " + list.Count);
    }

    public void Refresh()
    {
        for (int i=0; i < list.Count; i++)
        {
            if (list[i].prefab != null)
            {
                list[i].prefab.GetComponent<OnboardingItemClickHandler>().id = 
                i;
            }
        }
    }

    public virtual void Show(int id)
    {
        Debug.Log(list.Count);
        list[id].prefab.SetActive(true);
    }

    public virtual void Hide(int id)
    {
        list[id].prefab.SetActive(false);
    }
    }

И этот список показан так:

using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

[CustomEditor(typeof(OnboardingItemList))]
public class OnboardingEditor : Editor
{
private ReorderableList list;

private void OnEnable()
{
    list = new ReorderableList(serializedObject,
            serializedObject.FindProperty("list"),
            true, true, true, true);
    list.drawElementCallback =
        (Rect rect, int index, bool isActive, bool isFocused) => {
            var element = 
                      list.serializedProperty.GetArrayElementAtIndex(index);
            rect.y += 2;
            EditorGUI.PropertyField(
                new Rect(rect.x, rect.y, 200, 
                EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("prefab"), GUIContent.none);
            EditorGUI.PropertyField(
                new Rect(rect.x + 250, rect.y, 200, 
                EditorGUIUtility.singleLineHeight),
                element.FindPropertyRelative("target"), GUIContent.none);
        };
}

public override void OnInspectorGUI()
{
    list.DoLayoutList();
    serializedObject.ApplyModifiedProperties();
    OnboardingItemList myScript = (OnboardingItemList)target;
    if (GUILayout.Button("Apply"))
    {
        myScript.Refresh();
    }
}
}

Теперь в моей сцене есть некоторые элементы пользовательского интерфейса, которые вызывают функции Show() и Hide() в OnboardingItemList. Проблема в том, что я получаю исключение вне диапазона, поэтому я помещаю Debug.Log в Update() и вижу, что число в списке постоянно меняется. В одном кадре написано 2, в следующем - 0, и он постоянно меняется назад и вперед. Я предполагаю, что что-то продолжает сбрасывать список на новый, и редактор продолжает присваивать ему значения моего собственного редактора. Как это можно исправить?

0 ответов

Другие вопросы по тегам