From 019c17c7e75cd30833f07d9587a9af62444ea21c Mon Sep 17 00:00:00 2001 From: atdunbg Date: Wed, 23 Sep 2026 15:07:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E4=BD=93=E5=87=BA=E7=94=9F?= =?UTF-8?q?=E5=8D=B3=E6=8C=82=20TransformComponent=EF=BC=88UUID=20+=20Tran?= =?UTF-8?q?sform=20=E5=9B=BA=E6=9C=89=E5=8C=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CreateEntity 自动挂 IdComponent(已有)+ TransformComponent(identity), 对齐 UE/Unity 语义(GameObject↔Transform 不可分离 / AActor 必有 RootComponent)——游戏实体的本质是"空间中存在的东西" - 调用点 AddComponent 改 GetComponent(重复 emplace 会断言) - 遗留不一致记录在案:CameraComponent 位置存于 Camera 内部而非 Transform,后续统一 --- App/main.cpp | 10 +++++++--- Engine/src/ECS/Scene.cpp | 3 ++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/App/main.cpp b/App/main.cpp index be5bdf4..3d5b497 100644 --- a/App/main.cpp +++ b/App/main.cpp @@ -48,13 +48,17 @@ protected: // 模型资产(AssetManager 负责加载/缓存/生命周期,返回句柄) // SunTemple:FBX + DDS 压缩贴图(DdsLoader 验证场景) + const auto model = GetAssets().LoadModel("assets/models/backpack/backpack.obj"); const auto temple = GetAssets().LoadModel("assets/models/SunTemple/SunTemple.fbx"); + m_Spinners.push_back(scene.CreateEntity("backpack")); + m_Spinners[0].AddComponent(MeshRendererComponent{model}); + // 地面:程序化纯色平面(半边长 15,中心 y=-2) const auto ground = GetAssets().CreatePlane(15.0f, 140, 140, 145); m_Ground = scene.CreateEntity("Ground"); - m_Ground.AddComponent() + m_Ground.GetComponent() // 出生即有,直接取 .SetPosition(glm::vec3(0.0f, -0.5f, 0.0f)) .Compose(); m_Ground.AddComponent(MeshRendererComponent{ground}); @@ -66,9 +70,9 @@ protected: camera.camera.SetPosition(glm::vec3(0.0f, 0.0f, 7.0f)); // 神庙实体 × 1( FBX 单位较大,缩放到场景尺度) - { + if (0){ auto e = scene.CreateEntity("SunTemple"); - e.AddComponent() + e.GetComponent() .SetScale(glm::vec3(0.05f)) .Compose(); e.AddComponent(MeshRendererComponent{temple}); diff --git a/Engine/src/ECS/Scene.cpp b/Engine/src/ECS/Scene.cpp index d687a0b..eab9e58 100644 --- a/Engine/src/ECS/Scene.cpp +++ b/Engine/src/ECS/Scene.cpp @@ -11,8 +11,9 @@ namespace Engine::ECS { EntityHandle Scene::CreateEntity(std::string name) { Entity e = m_Registry.create(); - // IdComponent 自动挂载:每个实体出生即有稳定 UUID + // 出生即有:UUID(稳定身份)+ Transform(空间存在性,Unity 语义) m_Registry.emplace(e, IdComponent{UUID::New()}); + m_Registry.emplace(e); if (!name.empty()) { m_Registry.emplace(e, NameComponent{std::move(name)}); }