Chams ESP, Glow ESP라고 불리는 ESP를 만들어보겠습니다.
아래 사진처럼 캐릭터 UMaterial를 바꿔 벽뒤쪽에서도 볼 수 있게 해 줍니다.

Mesh 찾기
Mesh는 ACharacter에서 찾을 수 있습니다.
APawn은 ACharacter로 캐스팅됩니다.
// APlayerState에서 APawn찾기
UEngine->
UGameViewportClient* GameViewport->
UWorld* World->
AGameStateBase* GameState->
APlayerState* PlayerArray->
APawn* PawnPrivate->
ACharacter로 캐스팅->
USkeletalMeshComponent* Mesh
// AActor에서 APawn찾기
UEngine->
UGameViewportClient* GameViewport->
UWorld* World->
ULevel* Levels->
AActor* NearActors->
APawn* Instigator->
ACharacter로 캐스팅->
USkeletalMeshComponent* Mesh
Chams ESP 소스코드
// 플레이어 메쉬찾기
auto pawn = actor->Instigator;
auto mesh = reinterpret_cast<ACharacter*>(pawn)->Mesh;
// Material를 찾아줍니다.
UMaterial* material = reinterpret_cast<UMaterial*>(ObjectArray->FindObject("Material WireframeMaterial.WireframeMaterial"));
// 플레이어 메쉬를 가져옵니다.
auto mesh = reinterpret_cast<ACharacter*>(pawn)->Mesh;
// 불투명한 픽셀 뒤에 있더라도 그 위에 그릴지 여부입니다.
// 반투명에 대해서만 의미가 있습니다.
material->bDisableDepthTest = true;
// 다른 픽셀 앞에 렌더링할 때
// 엔진이 머티리얼(원본색)과 이미 프레임 버퍼에 있는 것(대상색)을 합치는 방식을 조절하는 것
material->BlendMode = 5;
// mesh에 있는 재료 요소의 수를 반환합니다.
int materialsnum = mesh->GetNumMaterials();
for (int s = 0; s < materialsnum; s++) {
// 메쉬의 요소에 적용된 재질을 변경합니다.
mesh->SetMaterial(s, material);
}
소스코드 설명하겠습니다.
1. Material WireframeMaterial.WireframeMaterial 오브젝트를 찾습니다.
다른 UMaterial은 적용이 안 됐습니다.
덤퍼에서 찾을 수 있습니다. (Wireframe가 키워드)


2. UMaterial 구조체에 bDisableDepthTest, BlendMode를 수정해 줍니다.
bDisableDepthTest : Material이 벽을 뚫고 렌더링 되려면 True로 설정해야 합니다.
BlendMode : Material의 출력이 배경에 이미 그려져 있는 것과 어떻게 블렌딩 되는지를 설명
- 정수로 설정하고 3~5까지가 벽을 뚫고 렌더링 됐습니다.
- 0~7까지 존재하는 것 같습니다.
2, 7 = 투명
3, 4, 5 = 빛 (5가 보기 좋았습니다.)
그 외 효과 없었습니다.
// 덤퍼참조
struct UMaterial : UMaterialInterface {
{...}
char BlendMode; // 0x151(0x01)
char bDisableDepthTest : 1; // 0x1f8(0x01)
{...}
};
3. UPrimitiveComponent에 있는 함수 SetMaterial(), GetNumMaterials()를 사용합니다.
SetMaterial() : Mesh의 요소에 적용된 Material를 변경합니다.
GetNumMaterials() : Mesh에 있는 Material요소의 수를 반환합니다.
GetNumMaterials()로 플레이어 Mesh에 있는 Material 요소의 수를 가져옵니다.
플레이어 Material 요소의 수와 처음에 찾은 Material 오브젝트를
SetMaterial()로 플레이어 Material를 변경해 줍니다.
mesh는 USkeletalMeshComponent지만 상속으로 PrimitiveComponent 함수를 사용할 수 있습니다.
USkeletalMeshComponent->USkinnedMeshComponent->UMeshComponent->UPrimitiveComponent->USceneComponent (맨 뒤에서부터 부모)
struct UPrimitiveComponent : USceneComponent {
void SetMaterial(int32_t ElementIndex, struct UMaterialInterface* Material); // Function Engine.PrimitiveComponent.SetMaterial // (Native|Public|BlueprintCallable) // @ game+0x2c04170
int32_t GetNumMaterials(); // Function Engine.PrimitiveComponent.GetNumMaterials // (Native|Public|BlueprintCallable|BlueprintPure|Const) // @ game+0x2c00760
};
매우 간단한 코드입니다.

참고
UPrimitiveComponent::GetNumMaterials (영문) | 언리얼 엔진 문서 (unrealengine.com)
UMeshComponent::SetMaterial | Unreal Engine Documentation
머티리얼 블렌드 모드 | 언리얼 엔진 4.27 문서 (unrealengine.com)
'게임해킹 > 언리얼 엔진 해킹' 카테고리의 다른 글
언리얼 엔진 콘솔 활성화 핵, 치트 키 핵 만드는 방법 [Unreal Engine Console Enabler Cheat] (0) | 2024.05.17 |
---|---|
[Unreal engine] StaticConstructObject_Internal 찾는 법 (0) | 2024.05.17 |
언리얼 엔진 벽 뚫기 핵, 충돌 무시 핵 (No Collision cheat) (1) | 2024.05.15 |
언리얼 엔진 Bone ESP 만들기 ComponentToWorld 및 BoneArray 찾기와 사용 (0) | 2024.05.13 |
언리언 덤퍼 사용법 (언리얼 엔진 게임해킹 하는 방법) (0) | 2022.09.11 |