본문 바로가기

공부/이득우의 언리얼 프로그래밍

[Study] Part 3 - 게임의 완성 (15/15)

728x90
반응형

 

 

  • 정리
    • 게임 제작의 완성
      1. 게임 모드를 활용한 게임 규칙의 완성
      2. 전용 이벤트 함수를 활용한 블루프린트와의 연동
      3. 게임 데이터의 저장 방식의 이해
      4. 게임의 최종 빌드

 

  • 게임 모드
    • 멀티플레이를 포함해 게임에서 유일하게 존재하는 게임의 심판 오브젝트
    • 최상단에서 게임의 진행을 관리하며, 게임 판정에 관련된 중요한 행동을 주관하는데 적합함
    • 다양한 게임 규칙을 적용할 수 있도록 핵심 기능과 분리해 설계하는 것이 바람직
    • 게임의 상태와 플레이어의 상태를 별도로 저장할 수 있는 프레임웍을 제공함
    • 하나의 운동장에서 발야구, 축구, 야구등을 할 수 있도록 게임을 관장하는 규칙을 관리하는 부분이라고 이해하면 편하다. 그렇기 때문에 핵심 기능과는 분리해서 설계!

 

게임 모드

 

#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "ABGameInterface.generated.h"

// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class UABGameInterface : public UInterface
{
	GENERATED_BODY()
};

class ARENABATTLE_API IABGameInterface
{
	GENERATED_BODY()

public:
	// 플레이어의 스코어가 변경될 때 호출
	virtual void OnPlayerScoreChanged(int32 NewPlayerScore) = 0;
	// 플레이어가 죽었을 때
	virtual void OnPlayerDead() = 0;
	// 현재 게임이 클리어 되었는지 확인하는 함수
	virtual bool IsGameCleared() = 0;
};
  • ABGameInterface.h

 

  • 인터페이스를 하나 만들어서, 다른 스코어가 변경되거나, 플레이어가 죽었을 때, 게임이 클리어가 되었는지 확인할 때 GameMode에 대한 직접적인 참조보다는 간접 참조를 위해 인터페이스를 구성한다.

 

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "Interface/ABGameInterface.h"
#include "ABGameMode.generated.h"

UCLASS()
class ARENABATTLE_API AABGameMode : public AGameModeBase, public IABGameInterface
{
	GENERATED_BODY()
	
public:
	AABGameMode();

	virtual void OnPlayerScoreChanged(int32 NewPlayerScore) override;
	virtual void OnPlayerDead() override;
	virtual bool IsGameCleared() override;
	
	// 게임을 클리어하기 위한 조건을 위한 점수
	// 현재 진행되고 있는 게임의 점수
	UPROPERTY(EditDefaultsOnly,BlueprintReadWrite, Category = Game)
	int32 ClearScrore;

	UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = Game)
	int32 CurrentScore;

	// 게임을 클리어했는지 판단하기 위한 변수
	UPROPERTY(VisibleInstanceOnly,BlueprintReadOnly, Category = Game)
	uint8 bIsCleared : 1;
};
  • AABGameMode.h
#include "Game/ABGameMode.h"
#include "ABGameMode.h"
#include "Player/ABPlayerController.h"

AABGameMode::AABGameMode()
{
	// ...
	
	ClearScrore = 3;

	// CurrentScore의 경우 게임의 규모가 조금 더 커진다면 PlayerState같은 객체에 보관하는 것이 좋다.
	CurrentScore = 0;
	bIsCleared = false;
}

// 플레이어의 현재 점수가 변경되었을 때
void AABGameMode::OnPlayerScoreChanged(int32 NewPlayerScore)
{
	CurrentScore = NewPlayerScore;

	// 스코어가 변했을 때 신호를 날려주기 위한
	// 1인 플레이기 때문에 FirstPlayerController를 가져와도 된다.
	AABPlayerController* ABPlayerController = Cast<AABPlayerController>(GetWorld()->GetFirstPlayerController());
	if (ABPlayerController)
	{
		ABPlayerController->GameScoreChanged(CurrentScore);
	}

	// 게임을 클리어했을 때
	if (CurrentScore >= ClearScrore)
	{
		bIsCleared = true;

		if (ABPlayerController)
		{
			ABPlayerController->GameClear();
		}
	}
}

// 플레이어가 죽었을 때
void AABGameMode::OnPlayerDead()
{
	// 플레이어가 죽었을 때 관련된 UI를 날리는 이벤트를 PlayerController에게 알려주기 위한
	AABPlayerController* ABPlayerController = Cast<AABPlayerController>(GetWorld()->GetFirstPlayerController());
	if (ABPlayerController)
	{
		ABPlayerController->GameOver();
	}
}

// 현재 게임을 클리어 하였는가?
bool AABGameMode::IsGameCleared()
{
	return bIsCleared;
}
  • AABGameMode.cpp
#include "Interface/ABGameInterface.h"

	// ...
		// 플레이어가 죽으면 게임이 종료되도록 GameMode를 통해 전달하기
		IABGameInterface* ABGameMode = Cast<IABGameInterface>(GetWorld()->GetAuthGameMode());
		if (ABGameMode)
		{
			ABGameMode->OnPlayerDead();
		}
	// ...
  • AABCharacterPlayer.cpp

 

  • GameMode 클래스에 다음과 같이 게임모드에 필요한 변수와 함수들을 추가해준다.
  • Gimmick 클래스와 CharacterPlayer 클래스에서 인터페이스 헤더를 추가해준 뒤, 다음과 같이 인터페이스GetAuthGameMode를 통해 GameMode의 함수들을 호출해주도록 한다.
  • 이후, PlayerController 클래스에서 UI 이벤트를 위해 로직을 구성해준다.

 

 

 

 

 

 

해당 포스트는 인프런의 <이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이어 프레임웍의 이해>강의를 수강하고 정리한 내용입니다.
 

이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해 강의 | 이득우 - 인프런

이득우 | 또 하나의 언리얼 엔진이라고도 불리는 네트웍 멀티플레이어 프레임웍을 학습합니다. 네트웍 멀티플레이어 게임을 제작할 때 반드시 알아야 하는 주요 개념, 내부 동작 원리, 최적화

www.inflearn.com

 

728x90