728x90
반응형
- 정리
- 게임 제작의 완성
- 게임 모드를 활용한 게임 규칙의 완성
- 전용 이벤트 함수를 활용한 블루프린트와의 연동
- 게임 데이터의 저장 방식의 이해
- 게임의 최종 빌드
- 게임 제작의 완성
- 게임 모드
- 멀티플레이를 포함해 게임에서 유일하게 존재하는 게임의 심판 오브젝트
- 최상단에서 게임의 진행을 관리하며, 게임 판정에 관련된 중요한 행동을 주관하는데 적합함
- 다양한 게임 규칙을 적용할 수 있도록 핵심 기능과 분리해 설계하는 것이 바람직함
- 게임의 상태와 플레이어의 상태를 별도로 저장할 수 있는 프레임웍을 제공함
- 하나의 운동장에서 발야구, 축구, 야구등을 할 수 있도록 게임을 관장하는 규칙을 관리하는 부분이라고 이해하면 편하다. 그렇기 때문에 핵심 기능과는 분리해서 설계!
#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
'공부 > 이득우의 언리얼 프로그래밍' 카테고리의 다른 글
[Study] Part 4 - 게임플레이 어빌리티 시스템의 시작 (2/10) (0) | 2024.11.12 |
---|---|
[Study] Part 4 - 언리얼 게임플레이 어빌리티 시스템 개요 (1/10) (1) | 2024.11.11 |
[Study] Part 3 - 게임플로우 다듬기 (14/15) (0) | 2024.11.09 |
[Study] Part 3 - 캐릭터 무브먼트의 확장 (13/15) (2) | 2024.09.10 |
[Study] Part 3 - 물리 움직임 리플리케이션 (12/15) (0) | 2024.08.29 |