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