unity保存游戏对象到mysql_Unity实现游戏存档框架

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

foreach(ISavable savable in GetComponents()){

yield return savable;

}

foreach(ISavable savableContainer in GetComponents()){

foreach(ISavable savable in savableContainer.Savables){

yield return savable;

}

}

}

}

SaveFile代表一个文件

<
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值