Unity 游戏存档框架实现

本文介绍了在Unity中重构的游戏存档框架,重点解析了ISavable、ISavableContainer、IId等核心接口及SaveEntity组件的使用。通过示例展示了Unit、Inventory、Item类型的存档,并提出扩展功能建议,如支持多个数据容器、存储内容压缩和加密,以及解决存储过程中的卡顿问题。
摘要由CSDN通过智能技术生成

最近重构了一下我的存档框架。我在这里对实现方法进行简单的解析。注意这里主要演示算法,所以,效率上并不是最佳。一个游戏中,可能有成百上千个物体需要存储,而且有几十种类型,接下来就用一个简单的例子来解释。一个很简单的例子,有一个Unit(单位)类型,有一个Inventory(背包)类型,有一个Item(道具)类型。

接下来先介绍框架中最重要的接口,ISavable,表示这个类型可以存档

public interface ISavable{
  uint Id {get; set;}
  Type DataType {get;} // 存档数据类型
  Type DataContainerType {get;} // 存档数据容器类型
  void Read(object data);
  void Write(object data);
}

ISavableContainer,用来返回一组ISavable的容器:

public interface ISavableContainer{
    IEnumerable<ISavable> Savables;
}

IId, 具有Id的接口:

public interface IId
{
    uint Id {get; set;}
}

 

SaveEntity, 这是一个MonoBehaviour,将这个组件放到需要存档的GameObject上就可以实现该GameObject的存档了,这是最核心的类之一:

public class SaveEntity : MonoBehaviour{
    public void Save(SaveDataContainer container){
        foreach(ISavable savable in GetSavables()){
            if(savable.DataContainerType = container.GetType()){
                IId newData = Activator.CreateInstance(savable.DataType) as IId;
                newData.Id = savable.Id;
                savable.Write(newData);
                container.SetData(newData);
            }
        }
    }

    public void Load(SaveDataContainer container){
        foreach(ISavable savable in GetSavables()){
            if(savable.DataContainerType = container.GetType()){
                IId data = container.GetData(savable.Id);
                savable.Read(data);
            }
        }        
    }

    public IEnumerable<ISavable> GetSavables(){
        foreach(ISavable savable in GetComponents<ISavable>()){
            yield return savable;
        }
        foreach(ISavable savableContainer in GetComponents<ISavableContainer>()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值