From 3357de85c91a96b78e8fcb10c9807e453bf06648 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 22 Mar 2026 02:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Components=20=E5=92=8C=20S?= =?UTF-8?q?cene=20=E6=A8=A1=E5=9D=97=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. GameObject 析构函数:从全局注册表移除自己,防止悬挂指针 2. SceneManager 测试:事件订阅后正确 Unsubscribe,防止 lambda 销毁后悬挂调用 3. SceneManager 测试:使用唯一场景名称避免覆盖问题 --- engine/src/Components/GameObject.cpp | 1 + tests/Scene/test_scene_manager.cpp | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/engine/src/Components/GameObject.cpp b/engine/src/Components/GameObject.cpp index 295217c5..06b6acc8 100644 --- a/engine/src/Components/GameObject.cpp +++ b/engine/src/Components/GameObject.cpp @@ -22,6 +22,7 @@ GameObject::GameObject(const std::string& name) } GameObject::~GameObject() { + GetGlobalRegistry().erase(m_id); if (m_transform) { delete m_transform; m_transform = nullptr; diff --git a/tests/Scene/test_scene_manager.cpp b/tests/Scene/test_scene_manager.cpp index 7b057a1d..81518eef 100644 --- a/tests/Scene/test_scene_manager.cpp +++ b/tests/Scene/test_scene_manager.cpp @@ -60,14 +60,14 @@ TEST(SceneManager_Test, GetScene_NotExists) { TEST_F(SceneManagerTest, GetAllScenes_ReturnsAll) { SceneManager& sm = SceneManager::Get(); - size_t initialCount = sm.GetAllScenes().size(); - sm.CreateScene("Scene1"); - sm.CreateScene("Scene2"); - sm.CreateScene("Scene3"); + size_t beforeCount = sm.GetAllScenes().size(); + sm.CreateScene("GetAllScenes_TestScene1"); + sm.CreateScene("GetAllScenes_TestScene2"); + sm.CreateScene("GetAllScenes_TestScene3"); auto scenes = sm.GetAllScenes(); - EXPECT_EQ(scenes.size(), initialCount + 3); + EXPECT_EQ(scenes.size(), beforeCount + 3); } TEST(SceneManager_Test, SetActiveScene) { @@ -123,13 +123,14 @@ TEST(SceneManager_Test, UnloadScene_ByName) { TEST(SceneManager_Test, OnSceneLoaded_Event) { SceneManager& sm = SceneManager::Get(); bool eventFired = false; - sm.OnSceneLoaded().Subscribe([&eventFired](Scene*) { + uint64_t subId = sm.OnSceneLoaded().Subscribe([&eventFired](Scene*) { eventFired = true; }); sm.CreateScene("TestScene"); EXPECT_TRUE(eventFired); + sm.OnSceneLoaded().Unsubscribe(subId); } TEST(SceneManager_Test, OnActiveSceneChanged_Event) { @@ -138,13 +139,14 @@ TEST(SceneManager_Test, OnActiveSceneChanged_Event) { Scene* scene2 = sm.CreateScene("Scene2"); bool eventFired = false; - sm.OnActiveSceneChanged().Subscribe([&eventFired](Scene*) { + uint64_t subId = sm.OnActiveSceneChanged().Subscribe([&eventFired](Scene*) { eventFired = true; }); sm.SetActiveScene(scene2); EXPECT_TRUE(eventFired); + sm.OnActiveSceneChanged().Unsubscribe(subId); } TEST(SceneManager_Test, CreateScene_MultipleScenes) {