开放世界游戏,尤为生存游戏,玩家自由建筑系统是一个几乎必不可少的功能。就算不是建筑,那些循环生成的资源,也需要在保存的时候序列化到文件中去。
比如一堵墙,需要在运行时保存他的位置,朝向和缩放等。
如果是一个物品箱,还需要保存其保持的背包数据信息。所有者信息等等。
同时这个系统还要满足插件式可扩展的需求。于是乎我设计了几版序列化和 反序列化开放世界物件的方案。最终采纳了下面的方案。
UML图早已还给学校老师,姑且领会精神吧。
【1】对于任意一个需要序列化的开放世界中的物件,可以是建筑物件如墙,可以是存储箱子,可以是自动防御炮塔,等等。需要那种功能,就绑定那种物件的脚本,其中WorldObject是必须的脚本,其他的都是扩展脚本。
【2】WorldObject处理WorldObjectProfile中的基础数据,而对应的扩展脚本,处理对应的扩展数据
基本数据处理代码:
public void Load(WorldObjectProfile profile)
{
GUID = profile.GUID;
cachedTransform.position = profile.position;
cachedTransform.eulerAngles = profile.eularAngles;
cachedTransform.localScale = profile.localScale;
}
public void Save(WorldObjectProfile profile)
{
profile.GUID = GUID;
string p