动态创建可保存字符的最佳做法

时间:2019-07-06 10:13:09

标签: c# unity3d

我有一个基于聚会的游戏,玩家可以拥有1到8个字符。我正在尝试建立一个合理,优雅的系统来存储这些字符统计信息,更重要的是,用于存储其可脚本化对象的清单。

目前,我正在使用一个序列化脚本,其中包含游戏中角色对象的列表,这些对象只是附带了CharacterInventory脚本的空游戏对象。

我想动态创建CharacterInventory脚本,因此我可以根据需要添加其他字符。我不知道如何将脚本的单个实例添加到可保存列表中。我知道不能实例化脚本。

我可以通过脚本创建一个空的游戏对象,并在创建过程中将脚本添加到其中,但是还有更好的解决方案吗?

可编写脚本的对象对字符有用吗,假设它们应包含更多也可以动态更改的可编写脚本的对象的列表?

1 个答案:

答案 0 :(得分:0)

您可以遵循的一般规则是,您应该将DataViews分开。

我不建议使用ScriptableObject作为唯一的数据源,因为它有一些限制。它只能序列化Unity为您执行的数据。但是使用以下方法,您可以存储几乎所有想要的东西。

您可以或应该使用ScriptableObject,但与files之类的其他数据源一起使用时,它的功能将更为强大。

然后,您可以轻松地保存和加载数据。

MonoBehavious用作View Layer,将普通的c#脚本用作Data Layer。

例如,考虑以下数据类:

public class CharacterModel
    {
        public string Name;
        public int Level;
        public List<string> Inventory;
    }

这是View类:

public class Character : MonoBehaviour
    {
        private CharacterModel model;

        public void Save()
        {
            // I would use Json.net to serialize the model
            // Note: this is just a simple and non-efficient of saving all characters
// data, don't use it in production
            PlayerPrefs.SetString(model.Name, JsonConvert.SerializeObject(model));

        }

        public void Load(string characterName)
        {
            model = JsonConvert.DeserializeObject<CharacterModel>(PlayerPrefs.GetString(characterName));
        }
    }

或者您可以将所有字符保存为单个file,并在场景初始化期间填充主ScriptableObject

基于此想法,您可以随时保存所有字符,并在要加载字符数据时填充字符可编写脚本的对象。

相关问题