我正在使用实体组件系统,其中为同一类的组件生成ID,并使用我在下面发布的模板组合。在尝试加载序列化数据时,我无法弄清楚如何重新创建组件的ID生成的确切顺序,以便正确的组件与正确的ID相关联。
首次创建组件派生类时,下面的代码会为该类的组件生成唯一ID。
typedef std::size_t TypeId;
template<typename BaseClass>
class ClassTypeId
{
public:
template<typename BaseClass>
static TypeId getTypeId()
{
static const TypeId id = nextTypeId++;
return id;
}
private:
static std::atomic<TypeId> nextTypeId;
};
template <typename BaseClass>
std::atomic<TypeId> ClassTypeId<BaseClass>::nextTypeId{ 0 };
// Get a new ID if the components is new, or get the ID
// of the component of class T
template<class T>
TypeId ComponentTypeId()
{
return ClassTypeId<Component>::getTypeId<T>();
}
有没有办法以某种方式存储为特定组件创建这些Id的顺序,并在加载序列化数据时重新创建/关联它们与类T的组件?作为组件ID可能会随着组件被动态添加到实体而开始按创建顺序变化。在ECS之外以相同的顺序创建它们是不可能的。
或者是否有更好的方法为多个基类类型和多个派生类生成唯一ID,以便于序列化?