feat: 实体出生即挂 TransformComponent(UUID + Transform 固有化)

- CreateEntity 自动挂 IdComponent(已有)+ TransformComponent(identity),
  对齐 UE/Unity 语义(GameObject↔Transform 不可分离 / AActor 必有
  RootComponent)——游戏实体的本质是"空间中存在的东西"
- 调用点 AddComponent<Transform> 改 GetComponent(重复 emplace 会断言)
- 遗留不一致记录在案:CameraComponent 位置存于 Camera 内部而非
  Transform,后续统一
This commit is contained in:
2026-09-23 15:07:00 +08:00
parent 0ed7b4c5b8
commit 019c17c7e7
2 changed files with 9 additions and 4 deletions
+7 -3
View File
@@ -48,13 +48,17 @@ protected:
// 模型资产(AssetManager 负责加载/缓存/生命周期,返回句柄) // 模型资产(AssetManager 负责加载/缓存/生命周期,返回句柄)
// SunTemple:FBX + DDS 压缩贴图(DdsLoader 验证场景) // SunTemple:FBX + DDS 压缩贴图(DdsLoader 验证场景)
const auto model = GetAssets().LoadModel("assets/models/backpack/backpack.obj");
const auto temple = GetAssets().LoadModel("assets/models/SunTemple/SunTemple.fbx"); const auto temple = GetAssets().LoadModel("assets/models/SunTemple/SunTemple.fbx");
m_Spinners.push_back(scene.CreateEntity("backpack"));
m_Spinners[0].AddComponent<MeshRendererComponent>(MeshRendererComponent{model});
// 地面:程序化纯色平面(半边长 15,中心 y=-2) // 地面:程序化纯色平面(半边长 15,中心 y=-2)
const auto ground = GetAssets().CreatePlane(15.0f, 140, 140, 145); const auto ground = GetAssets().CreatePlane(15.0f, 140, 140, 145);
m_Ground = scene.CreateEntity("Ground"); m_Ground = scene.CreateEntity("Ground");
m_Ground.AddComponent<TransformComponent>() m_Ground.GetComponent<TransformComponent>() // 出生即有,直接取
.SetPosition(glm::vec3(0.0f, -0.5f, 0.0f)) .SetPosition(glm::vec3(0.0f, -0.5f, 0.0f))
.Compose(); .Compose();
m_Ground.AddComponent<MeshRendererComponent>(MeshRendererComponent{ground}); m_Ground.AddComponent<MeshRendererComponent>(MeshRendererComponent{ground});
@@ -66,9 +70,9 @@ protected:
camera.camera.SetPosition(glm::vec3(0.0f, 0.0f, 7.0f)); camera.camera.SetPosition(glm::vec3(0.0f, 0.0f, 7.0f));
// 神庙实体 × 1( FBX 单位较大,缩放到场景尺度) // 神庙实体 × 1( FBX 单位较大,缩放到场景尺度)
{ if (0){
auto e = scene.CreateEntity("SunTemple"); auto e = scene.CreateEntity("SunTemple");
e.AddComponent<TransformComponent>() e.GetComponent<TransformComponent>()
.SetScale(glm::vec3(0.05f)) .SetScale(glm::vec3(0.05f))
.Compose(); .Compose();
e.AddComponent<MeshRendererComponent>(MeshRendererComponent{temple}); e.AddComponent<MeshRendererComponent>(MeshRendererComponent{temple});
+2 -1
View File
@@ -11,8 +11,9 @@ namespace Engine::ECS {
EntityHandle Scene::CreateEntity(std::string name) EntityHandle Scene::CreateEntity(std::string name)
{ {
Entity e = m_Registry.create(); Entity e = m_Registry.create();
// IdComponent 自动挂载:每个实体出生即有稳定 UUID // 出生即有:UUID(稳定身份)+ Transform(空间存在性,Unity 语义)
m_Registry.emplace<IdComponent>(e, IdComponent{UUID::New()}); m_Registry.emplace<IdComponent>(e, IdComponent{UUID::New()});
m_Registry.emplace<TransformComponent>(e);
if (!name.empty()) { if (!name.empty()) {
m_Registry.emplace<NameComponent>(e, NameComponent{std::move(name)}); m_Registry.emplace<NameComponent>(e, NameComponent{std::move(name)});
} }