#pragma once #include "Core/Public/Core.h" #include namespace ECS { class Entity { public: Entity(entt::entity entity, entt::registry& registry) : m_registry(registry) { m_entity = entity; } Entity(entt::registry& registry) : m_registry(registry) { m_entity = m_registry.create(); } void Destroy() { m_registry.destroy(m_entity); } template T& AddComponent(Args&&... args) { assert(!HasComponent()); return m_registry.emplace(m_entity, std::forward(args)...); } template void AddOrReplaceComponent(Args&&... args) { m_registry.emplace_or_replace(m_entity, std::forward(args)...); } template decltype(auto) GetComponent() { return m_registry.get(m_entity); } template bool HasComponent() { return m_registry.has(m_entity); } template T& RemoveComponent(Args&&... args) { assert(HasComponent()); return m_registry.remove(m_entity, std::forward(args)...); } template std::size_t RemoveComponentIfExists(Args&&... args) { return m_registry.remove_if_exists(m_entity, std::forward(args)...); } template void PatchComponent(Func &&... func) { assert(HasComponent()); m_registry.patch(m_entity, std::forward(func)...); } private: entt::entity m_entity; entt::registry& m_registry; }; }