Replicated

[Drag Down] 게임 엔딩 제작 본문

언리얼 엔진/Drag Down

[Drag Down] 게임 엔딩 제작

라구넹 2025. 6. 1. 17:03

눈 맵의 끝에서 전투기를 타고 지구를 탈출한다

 

F를 누르면 전투기가 출발하고 지구를 떠나며, 페이드 아웃이 된다

 

 

그 후, 승자와 다른 사람들을 다른 맵으로 이동시킨다.

버튼을 누르면 메인 메뉴로 돌아간다.

 

// Fill out your copyright notice in the Description page of Project Settings.


#include "Game/DDPlayingGameMode.h"
#include "Game/DDPlayingGameState.h"
#include "GameFramework/PlayerState.h"
#include "DDPlayingGameMode.h"
#include "Kismet/GameplayStatics.h"
#include "DragDown.h"

ADDPlayingGameMode::ADDPlayingGameMode()
{
	bIsWinnerLogout = false;
}

void ADDPlayingGameMode::EndGame(APlayerState* PS)
{
	ADDPlayingGameState* GS = Cast<ADDPlayingGameState>( GetWorld()->GetGameState() );

	if ( GS->PlayerArray.Num() == 1 )
	{
		UGameplayStatics::OpenLevel(GetWorld(), FName(*WinnerMapName)); 
		return;
	}

	
	GS->SetGameEnded(true);
	
	for ( APlayerState* PlayerState : GS->PlayerArray )
	{
		APlayerController* PC = PlayerState->GetPlayerController();

		if ( PC && !PC->IsLocalController() )	// For Non-Server, Because GameMode is Server Only Actor
		{
			UE_LOG(LogDD, Log, TEXT("ADDPlayingGameMode::EndGame %s"), *PlayerState->GetName());

			if ( PlayerState == PS )
			{
				bIsWinnerLogout = true;
				PC->ClientTravel(WinnerMapName, ETravelType::TRAVEL_Absolute);
			}
			else
			{
				PC->ClientTravel(NonWinnerMapName, ETravelType::TRAVEL_Absolute);
			}
		}
	}
}

void ADDPlayingGameMode::Logout(AController* Exiting)
{
	Super::Logout(Exiting);
	ADDPlayingGameState* GS = Cast<ADDPlayingGameState>(GetWorld()->GetGameState()); 

	if ( GS && GS->PlayerArray.Num() - 1 == 1 )
	{
		// Only Server Remain
		if ( !bIsWinnerLogout )
		{
			UGameplayStatics::OpenLevel(GetWorld(), FName(*WinnerMapName));
		}
		else
		{
			UE_LOG(LogDD, Log, TEXT("Server is not winner"));
			UGameplayStatics::OpenLevel(GetWorld(), FName(*NonWinnerMapName));
		}
	}
}

게임 종료 처리는 게임 모드에서 진행한다

애초에 서버 전용 객체이기에 서버에서 실행된다고 생각하고 구현

 

EndGame 시 우선 클라이언트들을 전부 내보내고,

Logout 함수를 통해 확실히 클라이언트가 전부 나갔다고 판정되면 서버도 맵 이동

* 서버가 먼저 멀티플레이를 나가버리면 네트워크 문제 발생 가능