Почему в ScriptableObject сбрасывает переменные Unity

У меня есть такой класс унаследованный от ScriptableObject:

[CreateAssetMenu(fileName = "Weapon", menuName = "Weapon/DataWeapon")]
    public class WeaponData : ScriptableObject
    {
        public static List<String> namesClass = new List<String>();
        //DropdownString это атрибут который создает пополняемый выпадающий список
        [DropdownString(nameof(GetTypesWeapons))] public string TypeWeaponName;
        public IWeapon WeaponInstance { get; private set; }

        private List<WeaponDataFieldInfo> _info = new List<WeaponDataFieldInfo>();
        private List<object> _values = new List<object>();

        string[] GetTypesWeapons()
        {
            namesClass.Add("None");

            Type[] types = Assembly.GetExecutingAssembly().GetTypes();
            foreach (Type type in types.Where(t => typeof(IWeapon).IsAssignableFrom(t)))
            {
                if (type != typeof(IWeapon)) namesClass.Add(type.ToString());
            }

            return namesClass.ToArray();
        }

        private void OnValidate()
        {
            if (TypeWeaponName == "None")
            {
                WeaponInstance = null;
                _values.Clear();
                _info.Clear();
                return;
            }

            if (TypeWeaponName != nameof(WeaponInstance))
            {
                Assembly assembly = typeof(IWeapon).Assembly;
                Type type = assembly.GetType(TypeWeaponName);
                WeaponInstance = CreateInstance(type) as IWeapon;
                _values.Clear();
                _info.Clear();
                _info = GetMembersInstance(WeaponInstance);

                foreach (WeaponDataFieldInfo info in _info) _values.Add(info.Value);
            }

        }

        private List<WeaponDataFieldInfo> GetMembersInstance(object instance)
        {
            List<WeaponDataFieldInfo> fieldInfo = new List<WeaponDataFieldInfo>();
            BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
            MemberInfo[] members = instance.GetType().GetMembers(flags);

            foreach (MemberInfo member in members)
            {
                if (member.CustomAttributes.ToArray().Length > 0)
                {
                    WeaponDataField attribute = member.GetCustomAttribute<WeaponDataField>();
                    if (attribute != null)
                    {
                        fieldInfo.Add(new WeaponDataFieldInfo(member, attribute, this));
                    }
                }
            }

            return fieldInfo;
        }
//Дальше там остальной код но на мою ошибку он не влияет

Когда я работаю в Editor, то все нормально. Но после запуска игры OnValidate() выполняется, а значения WeaponInstance, _info и _values становится null. В итоге выполняется код в этой проверке if (TypeWeaponName != nameof(WeaponInstance)) и создается новый инстенс(то есть, значения сбрасываются). Как сохранить эти значения?


Ответы (0 шт):