[언리얼] CheatManger 사용하기

KWONYEONGMIN·2024년 8월 8일

언리얼

목록 보기
1/11
post-thumbnail

치트 매니저


치트 매니저란

치트 매니저는 콘솔 명령어를 통해 게임의 상태를 실시간으로 조작하거나 재현하여, 디버깅과 테스트를 용이하게 하는 중앙 관리 시스템입니다. 개발 중에만 사용되며, 게임의 효율적인 문제 해결을 지원합니다.치트 매니저의 함수 이름과 매개변수를 언리얼 콘솔에 입력하면 치트가 적용됩니다.

라이라 치트 매니저 분석

구현하기에 앞서, Lyra Starter Project의 CheatManager를 분석하여 프로젝트에 적용하였습니다.

라이라 프로젝트 치트 매니저 분석



치트 매니저 구현


개요

  • 언리얼 엔진에서 데디케이트 서버를 이용한 네트워크 멀티 플레이 게임을 개발하는 중, 공격 및 HP 동기화에서 버그가 발생하여 디버깅을 하기 위해 구현하였습니다.
  • XZPlayerController와 XZCheatManager 클래스를 기반으로 하여, 게임 내에서 플레이어 및 타겟에 대한 조작을 간편하게 디버깅할 수 있도록 도와주는 기능 구현

CheatManager 역할

주로 플레이어와 타겟 캐릭터의 상태 변화에 초점을 맞추고 있습니다

  • 자신 및 타겟의 체력 조작: 체력을 회복하거나 피해를 주는 기능
  • 모든 플레이어에게 치트 명령어 전파: 특정 치트 명령어를 게임 내 모든 플레이어에게 적용하는 기능
  • 치트 명령어의 서버-클라이언트 전송: 치트 명령어가 서버에서 실행되도록 클라이언트에서 전송하고 처리하는 기능
  • 자동 치트 실행(개발 예정): 게임 시작 시 특정 치트를 자동으로 실행

PlayerController와 Cheat Manager의 연동

PlayerController는 클라이언트-서버 구조에서 클라이언트가 치트 명령어를 서버로 전송하거나, 모든 플레이어에게 치트 명령을 전달하는 데 중요한 역할을 합니다. 이때 ServerCheatServerCheatAll 함수를 사용하여, 서버와 클라이언트 간의 상호작용을 관리합니다.

Cheat Manager 기능 및 함수 명세

플레이어와 타겟의 체력 조작하는 기능을 통해 플레이어와 타겟 캐릭터의 상태를 변화시킵니다.

// 콘솔 창에 텍스트를 출력하는 함수. 
CheatOutputText(FString TextToOutput)

// 입력받은 치트 명령어를 서버에 전송하는 함수.
Cheat(FString Msg)

// 모든 플레이어에게 치트 명령어를 전송하는 함수.
CheatAll(FString Msg)

// 플레이어 자신에게 지정된 양의 피해를 주는 함수.
DamageSelf(float DamageAmount)

// 플레이어가 바라보고 있는 타겟에게 지정된 양의 피해를 주는 함수.
DamageTarget(float DamageAmount)

// 플레이어 자신을 지정된 양만큼 치유하는 함수.
HealSelf(float HealAmount)

// 플레이어가 바라보고 있는 타겟을 지정된 양만큼 치유하는 함수.
HealTarget(float HealAmount)

DamageTarget 함수

  • 플레이어가 타겟 캐릭터에게 피해를 주는 함수
  • 타겟이 서버에 있든 클라이언트에 있든 상관없이 작동할 수 있으며, 클라이언트에서 서버로 명령을 전송하여 처리가능합니다.
  • 서버에서 타겟의 체력을 감소시키도록 되어있습니다.
  • GetTarget 함수는 CheatManager에서 제공하는 함수로, 카메라 위치, 회전에서 LineTraceSingleByChannel를 쏴서 Trace되는 Actor를 return 합니다.
void UXZCheatManager::DamageTarget(float DamageAmount)
{
	if (AXZPlayerController* XZPC = Cast<AXZPlayerController>(GetOuterAPlayerController()))
	{
		if (XZPC->GetNetMode() == NM_Client)
		{
			// 클라이언트일 경우 자동으로 서버에 치트 명령어를 전송
			XZPC->ServerCheat(FString::Printf(TEXT("DamageTarget %.2f"), DamageAmount));
			return;
		}

		FHitResult TargetHitResult;
        // LineTraceSingleByChannel를 쏴서 Trace되는 Actor를 return한다.
		if (AActor* TargetActor = GetTarget(XZPC, TargetHitResult))
		{
			if (AXZCharacter* TargetCharacter = Cast< AXZCharacter>(TargetActor))
			{
				if (UXZStatComponent* StatComponent = GetStatComponent(TargetCharacter))
				{
					// 타겟의 체력을 감소
					StatComponent->DecreaseHealth(DamageAmount);
				}
			}
		}
	}
}

결과

  • 콘솔 입력창에 DamageSelf와 매개변수인 DamageAmount를 입력하면,자신에게 입력한 매개변수 만큼의 피해를 주어 HP가 줄어드는 것을 볼 수 있습니다.
profile
Hello World

1개의 댓글

comment-user-thumbnail
2024년 10월 1일

좋은 글 감사합니다. 덕분에 배워갑니다 ㅎㅎ

답글 달기