우선, 이런식으로 내가 기획문서를 읽고 작동시켜야 할 이벤트들을 정리해보았다. 아직 기획서가 완벽하게 정해지진 않은거라 다 채우진 못했음!
퀘스트 데이터 테이블에서 bMoveToMaintenance
변수를 제거하고, EventCode
변수를 추가해주었다. 추후에 스크립트 테이블에도 이 Event Code를 넣어줄 것이다.
// GameState.h
DECLARE_MULTICAST_DELEGATE_OneParam(FOnEventExecute, int32)
FOnEventExecute OnEventExecute;
// GameMode.cpp
void ATrapperGameMode::BeginPlay()
{
Super::BeginPlay();
TrapperGameState = Cast<ATrapperGameState>(GetWorld()->GetGameState());
TrapperGameState->OnEventExecute.AddUObject(this, &ATrapperGameMode::EventHandle);
// 생략..
}
게임 스테이트에 델리게이트 변수를 선언해주고, 게임모드에서 이걸 처리해줄 함수를 선언하고 바인딩 해주었다.
void AQuestManager::QuestComplete()
{
// 생략..
// 정비시간으로 이동
if (GetCurrentQuest().bMoveToMaintenance)
{
ATrapperGameMode* GameMode = GetWorld()->GetAuthGameMode<ATrapperGameMode>();
GameMode->SetGameProgress(EGameProgress::Maintenance);
GameMode->SetSkipIcon(true);
GameMode->InitialItemSetting();
UE_LOG(LogQuest, Warning, TEXT("Go Maintenance"));
}
// 생략..
}
이부분의 코드를, 아래처럼 퀘스트를 완료했을 시에 발생시켜야 하는 이벤트 코드를 보내는 쪽으로 바꾸어주었다.
void AQuestManager::QuestComplete()
{
// 생략..
if (GetCurrentQuest().EventCode.Num() != 0)
{
ATrapperGameState* GameState = GetWorld()->GetGameState<ATrapperGameState>();
for (auto Code : GetCurrentQuest().EventCode)
{
// 이벤트 코드 브로드캐스트
GameState->OnEventExecute.Broadcast(Code);
}
}
// 생략..
}
void ATrapperGameMode::EventHandle(int32 EventCode)
{
switch (EventCode)
{
/// --------------------------------
/// Event
/// --------------------------------
#pragma region Event
case 1:
{
SetGameProgress(EGameProgress::Maintenance);
SetSkipIcon(true);
InitialItemSetting();
}
break;
#pragma endregion Event
/// --------------------------------
/// Sequence
/// --------------------------------
#pragma region Sequence
#pragma endregion Sequence
/// --------------------------------
/// Dialog
/// --------------------------------
#pragma region Dialog
#pragma endregion Dialog
default:
break;
}
}
이벤트를 재생시킬 함수는 그냥 switch-case 문으로 빠르게 처리했다. 어차피 이벤트가 그렇게 많은 게임이 아니기 때문에, 이정도로 해두는게 가독성도 좋고 유지보수가 쉬울 것이라고 판단했기 때문이다.
이렇게 만들어두고! 내일은 스크립트 매니저와 시퀀스 매니저를 만든 뒤에 본격적으로 메타루프에 살을 붙혀보려고 한다 :)