我目前正在开发一个多人游戏,使用回滚网络编码,同时创建机制来在每帧中保存状态,我不小心地创建了一个基于内存打包的超快的保存和加载系统。
要使类成为保存的状态的一部分,只需在类声明中添加 [StatefulObject],或为 GameObjects 附加一个 StatefulGameObject 组件。对于每个 Unity 组件,需要实现一个 MonoSerializer\<T> 类并在应用程序启动时注册它,它只需打包和解包数据。所有具有状态的 GameObject 都需要从预设中派生出来(这将在附加 StatefulGameObject 组件时自动强制执行)。状态通过 [State] 声明。 我有与 Unity 自己的序列化机制类似的生命周期方法,如 [Initialize], [BeforeSerialize] 等。生命周期方法可选地允许传递 IContainer 参数(如果您使用 DI)。所有类型都支持 [MemoryPackable],并且我为最常见的 Unity 类型,如 Transform、AnimationController 等,创建了 MonoSerializer\<T> 适配器。
这个系统将保留引用,覆盖现有对象(速度极快),自动重新创建不存在的对象并移除不应存在的对象。可以通过对 ObjectRegistry 的引用触发它,并在保存时返回一个 byte[],在加载时也可以从一个 byte[] 中加载。即使场景也成为状态的一部分,并且在需要时将正确地加载。
这主要基于代码生成,并利用了 Memory Pack 代码生成器的修改版本,因此在运行时没有反射。
我想知道是否值得花费精力将其转换为开源库。您是否感兴趣在类似系统上使用此系统?您在 Asset Store 上有过类似系统的经验吗?它们是否提供相同的功能?目前我看来大多数系统只存储键值对,您必须自己提供加载功能。
评论 (0)