我正在尝试创建一个能够在游戏中创建的编辑器窗口。 它应该将项目添加到每次玩游戏时都不会被清除的项目列表中。
是否可以在没有外部XML / JSON文件的情况下执行此操作来保存数据。
我目前在我的编辑器窗口脚本中有这个,ItemEquipable(type,price)是一个只有类型和价格变量的基本类:
if(GUILayout.Button("Create"))
ItemList.items.Add(new ItemEquipable(type, price));
ItemList类ItemEquipable扩展了基类Item类。
using UnityEngine;
using System.Collections.Generic;
public class ItemList:MonoBehaviour {
public static List<Item> items;
}
我已将ItemList附加到场景中的GameObject。
我见过Custom editor: How to initialise a new array element?但该脚本扩展了编辑器而我正在扩展EditorWindow,因此我无法访问目标变量。
更新
好的,所以我尝试将ItemList类序列化
using UnityEngine;
using System;
using System.Collections.Generic;
[Serializable]
public class ItemList:MonoBehaviour {
public static List<Item> items;
}
从中制作一个单身人士
using UnityEngine;
using System.Collections.Generic;
public class ItemList:Singleton<ItemList> {
public List<Item> items;
}
将Singleton作为您的基本单例类/代码
但是,两个人都没有工作。
答案 0 :(得分:0)
项目数组未标记为Serializable,因此Unity在您启动游戏时无法保存。解决方案是使用属性ItemList
标记[Serializable]
,或者直接使用List<Item>
。
答案 1 :(得分:0)
所以我解决它的方法是每次创建一个项目时将数组保存到预制件中。
UnityEngine.Object prefab = PrefabUtility.CreateEmptyPrefab("Assets/Resources/Prefabs/Items/Item Manager.prefab");
PrefabUtility.ReplacePrefab(Selection.activeGameObject, prefab);
AssetDatabase.Refresh();
我已将ItemList类拆分为多个列表:
[Serializable]
public class ItemList:MonoBehaviour {
[SerializeField] private List<ItemEquipable> equipableItems = new List<ItemEquipable>();
[SerializeField] private List<ItemWeapon> weaponItems = new List<ItemWeapon>();
[SerializeField] private List<ItemPower> powerItems = new List<ItemPower>();
[SerializeField] private List<ItemSpecial> specialItems = new List<ItemSpecial>();
public List<ItemEquipable> EquipableItems { get { return equipableItems; } }
public List<ItemWeapon> WeaponItems { get { return weaponItems; } }
public List<ItemPower> PowerItems { get { return powerItems; } }
public List<ItemSpecial> SpecialItems { get { return specialItems; } }
}
每个项目都是序列化的,以及它的字段:
[Serializable]
public class Item {
public static Item item = new Item();
[SerializeField] private ItemType itemType;
[SerializeField] private string itemName;
[SerializeField] private string itemDescription;
}
静态项变量在编辑器中用于防止我的编辑器脚本混乱数百个变量:
Item.item.Type = (Item.ItemType)EditorGUILayout.EnumPopup("Item Type", Item.item.Type);
要设置这些变量,我刚刚为项目类中的每个字段使用了getter和setter。
这可能不是最有效的方法,但它确实有效。