#pragma once #include "Core/Object/GameObject.h" class GameSceneManager; class GameDataManager; class GameInputSystem; class GameObject; class Player; class GameInstance { public: GameInstance(); ~GameInstance(); void Run(); void Quit(); template GameObject* SpawnCharacter(Arguments&&... Args); void PushObject(GameObject* Object) { GameObjects.push_back(Object); } void SetLocalPlayer(Player* NewPlayer) { LocalPlayer = NewPlayer; } GameInputSystem* GetInput() { return GameInput; } GameDataManager* GetGameDataManager() { return DataManager; } Player* GetLocalPlayer() { return LocalPlayer; } private: void GameLoop(); void PrepareSceneManager(); void PrepareCreateDataManager(); void PrepareGameInput(); void Initialize(); void PostInitialize(); void Update(); void Release(); private: GameInputSystem* GameInput; GameSceneManager* SceneManager; GameDataManager* DataManager; Player* LocalPlayer; std::vector GameObjects; bool bIsRunning; bool bInitalized; }; template inline GameObject* GameInstance::SpawnCharacter(Arguments&&... Args) { static_assert(std::is_base_of_v, "반드시 Character 클래스 이거나 상속받아야 함"); GameObject* NewCharacter = new T(std::forward(Args)...); GameObjects.push_back(NewCharacter); return NewCharacter; }