[내일배움캠프/UE] 게임 루프 설계 및 구현

김세희·2025년 7월 4일

✍️Today I Learned

  1. Game Loop
  2. Game Instance

Game Loop

게임의 전체적인 흐름
게임의 시작부터 종료까지 수행하는 단계를 의미한다.

게임 플로우

플레이어가 게임을 시작해서 진행하고 끝내는 과정에서 발생하는 모든 상호작용

GameState

  • 게임 전역 상태
  • 클라이언트가 알아야할 전체적인 정보 담당
  • 게임 시작 시점 필요한 초기화 작업 담당
    📌 싱글플레이이므로 여기에 게임 루프 구현

GameMode

  • 서버 전용 로직
  • 게임 규칙을 담당

게임 규칙

  1. 게임시작 (게임 시작 버튼)
    BeginPlay() - StartLevel() - Open BasicLevel

  2. 레벨에 40개 아이템 랜덤 소환

  3. 코인 아이템을 다 먹은 경우 바로 다음 레벨로 넘어감

  4. 30초 시간이 주어지고 타임 오버가 되도 바로 다음 레벨로 넘어감

  5. 체력이 0이 되면 바로 게임 오버

  6. 게임 종료 이후 재시작 (재시작 버튼)


Game Instance

❗새 레벨 로드시 주의할 점

새 레벨이 로드될 때마다 새로 생성/초기화 되는 클래스

  1. Game Mode
  2. Game State
  3. Player Controller
    레벨이 바뀔 때 새로 생성되어 새로운 아바타에 빙의된다.
  4. Pawn/Character
    플레이어가 빙의되는 월드 내 아바타. Game Mode에 의해 새로 스폰된다.
  5. Level Blueprint

레벨이 바뀌어도 유지되는 클래스

  1. Game Instance
    게임 종료될 때까지 단 하나만 존재한다. 레벨 이동과 관계없이 데이터를 유지해야 할 때 사용한다.
  2. Player State
    플레이어의 핵심 상태 정보를 담고 레벨을 이동해도 정보가 유지된다. 새로운 PlayerController에 정보가 복사되어 플레이어의 연속성을 보장한다.

레벨이 새로 오픈될때마다 GameState도 같이 만들어지면서 BeginPlay() 실행된다.
게임의 스코어나 레벨을 GameState의 생성자에서 초기화하게 되면 새로운 레벨을 시작할 때마다 초기화되어 이전 정보가 날아간다.
👉 Game Instance에 전역 정보를 저장하고 관리한다.
Game State에서 스코어나 레벨을 업데이트하거나 가져올 때 Game Instance를 통해서 작업을 수행한다.

void ACH3_GameState::AddScore(int32 Amount)
{
	if (UGameInstance* GameInstance = GetGameInstance()) 
	{
		UCH3_GameInstance* CH3_GameInstance = Cast<UCH3_GameInstance>(GameInstance);
		if (CH3_GameInstance) 
		{
			CH3_GameInstance->AddToScore(Amount);
		}
	}
}

출처: 스파르타코딩 내일배움캠프

0개의 댓글