为ECS的组件和系统生成唯一ID并允许序列化?

时间:2017-12-14 08:24:50

标签: c++ templates components entity

我正在使用实体组件系统,其中为同一类的组件生成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,以便于序列化?

0 个答案:

没有答案