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
복사