게임이 하드코어 해질수록 테스트가 힘들어지기 때문에 후반부 맵이나 보스 기믹을 테스트해야 하는데, 배터리가 모자라서, 혹은 몬스터에게 죽어서 1층부터 다시 파밍 하는 것은 엄청난 시간 낭비였다. 이를 해결하기 위해 나만의 커스텀 치트 시스템을 엔진 깊숙이 심었다.
1. 개발자용 콘솔 명령어(UFUNCTION(Exec)) 도입
언리얼 엔진의 강력한 기능 중 하나인 Exec 매크로를 AOblivioCharacter 클래스에 도입했다.
- 이를 통해 게임 플레이 도중 ~ (백틱) 키를 눌러 콘솔 창을 열고, 코드에 선언해둔 함수 이름을 타이핑하면 즉시 해당 기능이 토글(Toggle)되도록 만들었다. 별도의 디버그 UI를 띄우지 않아도 되어서 접근성이 매우 뛰어나다.
2. 3대 치트 시스템 구현 로직
가장 테스트를 방해하는 세 가지 요소를 제어하는 치트를 완성했다.
- CheatFreeCraft (크래프팅 무제한): 맵에 장애물 배치를 테스트해야 하는데 나무와 철을 줍고 다닐 수가 없었다. 이 치트가 켜지면 크래프팅 검사(CanAfford)가 즉시 true를 반환하고, 인벤토리 차감 함수가 아예 실행되지 않도록 예외 처리했다.
- CheatInfiniteBattery (배터리 고정): 손전등 포커스를 오래 테스트할 때 쓰기 위해, UpdateStatus의 배터리 감소 연산(DeltaTime * DepleteRate)을 무시하도록 조건문을 달았다.
- CheatGodMode (무적 모드): 몬스터의 어그로 범위나 추적 AI를 안전하게 관찰하기 위해, 피격 시 데미지를 차감하는 ApplyHealth 함수의 맨 앞에 if (bCheatGodMode) return; 한 줄을 추가해 캐릭터를 불사신으로 만들었다.
코드:
1. 치트 활성화 및 무적 모드 연동 (OblivioCharacter.cpp)
// 콘솔 명령어용 치트 토글 함수 (UFUNCTION(Exec) 처리)
void AOblivioCharacter::CheatGodMode()
{
bCheatGodMode = !bCheatGodMode;
}
void AOblivioCharacter::ApplyHealth(float Damage)
{
// [치트 적용] 무적 모드이거나 이미 죽었다면 데미지 무시
if (bIsDead || bCheatGodMode) return;
CurrentHealth = FMath::Clamp(CurrentHealth - Damage, 0.0f, MaxHealth);
// ... (사망 처리 로직 생략) ...
}
2. 크래프팅 무한 치트 연동 (OblivioCrafting.cpp)
bool UOblivioCrafting::CanAfford(AObstacleBase* TargetObstacle)
{
if (!TargetObstacle) return false;
AOblivioCharacter* Player = Cast<AOblivioCharacter>(GetOwner());
if (!Player || !Player->InventoryComponent) return false;
// [치트 적용] 크래프팅 무제한 치트가 켜져 있으면 자원 검사 없이 즉시 True 반환
if (Player->bCheatFreeCraft) return true;
int32 RequiredWood = TargetObstacle->GetWoodCost();
int32 RequiredIron = TargetObstacle->GetIronCost();
// ... (이후 일반적인 인벤토리 수량 비교 로직 생략) ...
}