
치트 매니저는 콘솔 명령어를 통해 게임의 상태를 실시간으로 조작하거나 재현하여, 디버깅과 테스트를 용이하게 하는 중앙 관리 시스템입니다. 개발 중에만 사용되며, 게임의 효율적인 문제 해결을 지원합니다.치트 매니저의 함수 이름과 매개변수를 언리얼 콘솔에 입력하면 치트가 적용됩니다.
구현하기에 앞서, Lyra Starter Project의 CheatManager를 분석하여 프로젝트에 적용하였습니다.
- 언리얼 엔진에서 데디케이트 서버를 이용한 네트워크 멀티 플레이 게임을 개발하는 중, 공격 및 HP 동기화에서 버그가 발생하여 디버깅을 하기 위해 구현하였습니다.
- XZPlayerController와 XZCheatManager 클래스를 기반으로 하여, 게임 내에서 플레이어 및 타겟에 대한 조작을 간편하게 디버깅할 수 있도록 도와주는 기능 구현
주로 플레이어와 타겟 캐릭터의 상태 변화에 초점을 맞추고 있습니다
- 자신 및 타겟의 체력 조작: 체력을 회복하거나 피해를 주는 기능
- 모든 플레이어에게 치트 명령어 전파: 특정 치트 명령어를 게임 내 모든 플레이어에게 적용하는 기능
- 치트 명령어의 서버-클라이언트 전송: 치트 명령어가 서버에서 실행되도록 클라이언트에서 전송하고 처리하는 기능
- 자동 치트 실행(개발 예정): 게임 시작 시 특정 치트를 자동으로 실행
PlayerController는 클라이언트-서버 구조에서 클라이언트가 치트 명령어를 서버로 전송하거나, 모든 플레이어에게 치트 명령을 전달하는 데 중요한 역할을 합니다. 이때
ServerCheat와ServerCheatAll함수를 사용하여, 서버와 클라이언트 간의 상호작용을 관리합니다.
플레이어와 타겟의 체력 조작하는 기능을 통해 플레이어와 타겟 캐릭터의 상태를 변화시킵니다.
// 콘솔 창에 텍스트를 출력하는 함수.
CheatOutputText(FString TextToOutput)
// 입력받은 치트 명령어를 서버에 전송하는 함수.
Cheat(FString Msg)
// 모든 플레이어에게 치트 명령어를 전송하는 함수.
CheatAll(FString Msg)
// 플레이어 자신에게 지정된 양의 피해를 주는 함수.
DamageSelf(float DamageAmount)
// 플레이어가 바라보고 있는 타겟에게 지정된 양의 피해를 주는 함수.
DamageTarget(float DamageAmount)
// 플레이어 자신을 지정된 양만큼 치유하는 함수.
HealSelf(float HealAmount)
// 플레이어가 바라보고 있는 타겟을 지정된 양만큼 치유하는 함수.
HealTarget(float HealAmount)
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);
}
}
}
}
}

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