refactor: 实体句柄表皮——实体自己管理组件的 API 形态

- 新增 EntityHandle:e.AddComponent<T>() / e.GetComponent<T>() /
  e.Destroy() / e.GetUUID(),转发 entt registry,零存储开销
- Scene::CreateEntity 返回 EntityHandle;Scene 层组件接口保留
  (给渲染器/系统批量遍历用)
- 语义分层:应用层"实体管组件"(句柄表皮),
  数据层组件存储仍集中在 registry(ECS 性能根基)
This commit is contained in:
2026-09-22 13:59:18 +08:00
parent b73e197783
commit 394bfd3d0c
4 changed files with 150 additions and 23 deletions
+19 -20
View File
@@ -12,6 +12,7 @@
#include <Engine/Core/Log.h>
#include <Engine/Core/Stats.h>
#include <Engine/ECS/Scene.h>
#include <Engine/ECS/EntityHandle.h>
#include <Engine/ECS/Components.h>
#include <Engine/Assets/AssetManager.h>
@@ -42,56 +43,54 @@ protected:
auto backpack = GetAssets().LoadModel("assets/models/backpack/backpack.obj");
// 相机实体(primary = 当前渲染视角)
m_CameraEntity = scene.CreateEntity("MainCamera");
auto& camera = scene.AddComponent<CameraComponent>(m_CameraEntity);
m_Camera = scene.CreateEntity("MainCamera");
auto& camera = m_Camera.AddComponent<CameraComponent>();
camera.primary = true;
camera.camera.SetPosition(glm::vec3(0.0f, 0.0f, 7.0f));
// 背包实体 × 3
for (int i = 0; i < 3; ++i) {
Entity e = scene.CreateEntity("Backpack" + std::to_string(i));
auto e = scene.CreateEntity("Backpack" + std::to_string(i));
auto& transform = scene.AddComponent<TransformComponent>(e);
transform.world = glm::translate(
e.AddComponent<TransformComponent>().world = glm::translate(
glm::mat4(1.0f),
glm::vec3((i - 1) * 1.5f, 0.0f, 0.0f));
scene.AddComponent<MeshRendererComponent>(e, MeshRendererComponent{backpack});
e.AddComponent<MeshRendererComponent>(MeshRendererComponent{backpack});
m_Spinners.push_back(e);
}
// 灯光实体
Entity keyLight = scene.CreateEntity("KeyLight");
scene.AddComponent<LightComponent>(keyLight,
LightComponent{glm::vec3(-0.5f, -1.0f, -0.3f),
glm::vec4(1.0f, 0.95f, 0.9f, 1.0f)});
scene.CreateEntity("KeyLight")
.AddComponent<LightComponent>(
LightComponent{glm::vec3(-0.5f, -1.0f, -0.3f),
glm::vec4(1.0f, 0.95f, 0.9f, 1.0f)});
Entity fillLight = scene.CreateEntity("FillLight");
scene.AddComponent<LightComponent>(fillLight,
LightComponent{glm::vec3(0.5f, -0.5f, 0.3f),
glm::vec4(0.3f, 0.5f, 1.0f, 0.8f)});
scene.CreateEntity("FillLight")
.AddComponent<LightComponent>(
LightComponent{glm::vec3(0.5f, -0.5f, 0.3f),
glm::vec4(0.3f, 0.5f, 1.0f, 0.8f)});
}
void OnUpdate(f32 deltaTime) override
{
Scene& scene = GetScene();
m_Time += deltaTime;
// 相机(WASD/Space/Shift 移动)
scene.GetComponent<CameraComponent>(m_CameraEntity)
m_Camera.GetComponent<CameraComponent>()
.camera.Update(GetWindow(), deltaTime);
// 旋转动画:直接写实体组件
for (size_t i = 0; i < m_Spinners.size(); ++i) {
f32 angle = m_Time * glm::radians(60.0f) + static_cast<f32>(i) * 0.7f;
auto& transform = scene.GetComponent<TransformComponent>(m_Spinners[i]);
auto& transform = m_Spinners[i].GetComponent<TransformComponent>();
glm::mat4 t = glm::translate(
glm::mat4(1.0f),
glm::vec3((static_cast<f32>(i) - 1.0f) * 1.5f, 0.0f, 0.0f));
glm::mat4 r = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 s = glm::scale(glm::mat4(1.0f), glm::vec3(0.5));
glm::mat4 s = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f));
transform.world = t * r * s;
}
@@ -115,8 +114,8 @@ protected:
}
private:
Entity m_CameraEntity{entt::null}; // 注意:entt::entity{} 是 0 号实体,空句柄要用 entt::null
std::vector<Entity> m_Spinners;
EntityHandle m_Camera{}; // Scene::CreateEntity 之前为空
std::vector<EntityHandle> m_Spinners;
f32 m_Time = 0.0f;
};