Unity3D - 编辑器窗口,可以将数据保存到播放时未清除的数组

时间:2014-02-09 00:15:16

标签: c# unity3d

我正在尝试创建一个能够在游戏中创建的编辑器窗口。 它应该将项目添加到每次玩游戏时都不会被清除的项目列表中。

是否可以在没有外部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作为您的基本单例类/代码

但是,两个人都没有工作。

2 个答案:

答案 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。

这可能不是最有效的方法,但它确实有效。