Search
Duplicate

LV21 DontDestroyOnLoad

DontDestroyOnLoad라는 메서드가 있습니다. DontDestroyOnLoad 메서드는 씬 변경 시에도 게임 오브젝트가 지속되도록 만드는 데 사용됩니다. 게임 오브젝트에서 이 메서드를 호출하면 새 씬을 로드할 때 게임 오브젝트가 파괴되지 않고 게임 전체에 걸쳐 지속되도록 할 수 있습니다.
기본적인 원리는 하나의 씬에있는 오브젝트들만 엔진에서 구동시키는게 아니라
현재 재생되는 두개의 씬(ActiveScene + DontdestroyOnOnLoad씬)을 만들고 DontdestroyOnOnLoad씬은 어느씬에서든 같이 업데이트 / 렌더링 된다고 보면된다.
//header class SceneManager { public: template <typename T> static Scene* CreateScene(const std::wstring& name) { T* scene = new T(); scene->SetName(name); mActiveScene = scene; scene->Initialize(); mScene.insert(std::make_pair(name, scene)); return scene; } static Scene* LoadScene(const std::wstring& name); static Scene* GetActiveScene() { return mActiveScene; } static Scene* GetDontDestroyOnLoad() { return mDontDestroyOnLoad; } static std::vector<GameObject*> GetGameObjects(eLayerType layer); static void Initialize(); static void Update(); static void LateUpdate(); static void Render(HDC hdc); static void Destroy(); static void Release(); private: static std::map<std::wstring, Scene*> mScene; static Scene* mActiveScene; static Scene* mDontDestroyOnLoad; }; //cpp void SceneManager::Initialize() { mDontDestroyOnLoad = CreateScene<DontDestroyOnLoad>(L"DontDestroyOnLoad"); } void SceneManager::Update() { mActiveScene->Update(); mDontDestroyOnLoad->Update(); } void SceneManager::LateUpdate() { mActiveScene->LateUpdate(); mDontDestroyOnLoad->LateUpdate(); } void SceneManager::Render(HDC hdc) { mActiveScene->Render(hdc); mDontDestroyOnLoad->Render(hdc); } void SceneManager::Destroy() { mActiveScene->Destroy(); mDontDestroyOnLoad->Destroy(); }
C++
복사
사용하는 방법은 간단하다. 어느씬에서도 사용할 게임오브젝트를 다음곽 같은 함수를 사용하여 인자로 초기화활떄 사용해주면된다.
static void DontDestroyOnLoad(GameObject* gameObject) { Scene* activeScene = SceneManager::GetActiveScene(); // 현재씬에서 게임오브젝트를 지워준다. activeScene->EraseGameObject(gameObject); // 해당 게임오브젝트를 -> DontDestroy씬으로 넣어준다. Scene* dontDestroyOnLoad = SceneManager::GetDontDestroyOnLoad(); dontDestroyOnLoad->AddGameObject(gameObject, gameObject->GetLayerType()); }
JavaScript
복사
로드씬에서는 mAcriveScene 만 바뀌기 떄문이다.
Scene* SceneManager::LoadScene(const std::wstring& name) { if (mActiveScene) mActiveScene->OnExit(); std::map<std::wstring, Scene*>::iterator iter = mScene.find(name); if (iter == mScene.end()) return nullptr; mActiveScene = iter->second; mActiveScene->OnEnter(); return iter->second; }
JavaScript
복사