C# 动态创建可保存角色的最佳实践

C# 动态创建可保存角色的最佳实践,c#,unity3d,C#,Unity3d,我有一个基于派对的游戏,玩家可以有1到8个角色。我试图建立一个合理、优雅的系统来存储这些角色的统计信息,更重要的是,它们的可脚本对象清单 目前,我正在使用一个序列化脚本,其中包含游戏中角色对象的列表,这些对象只是附加了CharacterInventory脚本的空游戏对象 我希望动态生成CharacterInventory脚本,以便根据需要生成额外的字符。我无法确定如何将脚本的各个实例添加到可保存列表中。我知道脚本不能实例化 我可以通过脚本创建一个空的游戏对象,并在创建过程中将脚本添加到其中,但是

我有一个基于派对的游戏,玩家可以有1到8个角色。我试图建立一个合理、优雅的系统来存储这些角色的统计信息,更重要的是,它们的可脚本对象清单

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

我希望动态生成CharacterInventory脚本,以便根据需要生成额外的字符。我无法确定如何将脚本的各个实例添加到可保存列表中。我知道脚本不能实例化

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


可脚本化对象是否适用于角色,因为它们应该包含更多动态更改的可脚本化对象的列表?

您可以遵循的一般规则是,您应该将
数据和
视图分开

我不建议将
ScriptableObject
作为唯一的数据源,因为它有一些限制。它只能序列化Unity为您提供的数据。但通过以下方法,您可以存储几乎所有您想要的内容

您可以或应该使用
ScriptableObject
,但与另一个数据源(如
文件
)一起使用时,它的功能会更强大

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

使用
monobhavious
作为视图层,使用普通c#脚本作为数据层

例如,考虑这个数据类:

public class CharacterModel
    {
        public string Name;
        public int Level;
        public List<string> Inventory;
    }
公共类CharacterModel
{
公共字符串名称;
公共智力水平;
公开清单清单;
}
这是一个视图类:

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));
        }
    }
公共类字符:单行为
{
私有特征模型;
公共作废保存()
{
//我将使用Json.net来序列化模型
//注意:这只是保存所有字符的一种简单而无效的方法
//数据,不要在生产中使用它
PlayerPrefs.SetString(model.Name,JsonConvert.SerializeObject(model));
}
公共无效加载(字符串字符名称)
{
model=JsonConvert.DeserializeObject(PlayerPrefs.GetString(characterName));
}
}
或者,您可以将所有字符保存为单个
文件
,并在场景初始化期间填充主
脚本对象


基于这一思想,您可以随时保存所有字符,并在加载字符数据时填充字符脚本对象。

只是一个提示,因为这是一个相当广泛的问题。您也可以在unity中创建非脚本代码。因此,您可以只使用一个普通的类字符,并将字符保存在列表或类似的其他实体中。Mirko的意思是,您的代码不需要有
:monobhavior
,实际上可以扩展其他内容。关于注释:即“不要使用playerprefs”。您可以完全访问文件系统和
应用程序.persistentData
路径。使用它。