Unreal 개발 본 캠프 61일차

HappyCircle·2026년 2월 27일

Unreal 개발

목록 보기
78/163

📘TIL- 가시거북 특수기믹 버그 수정

문제 상황

몬스터가 일정 HP 이하로 떨어지면 하드닝(HardenShell) 상태에 진입하면서 색상이 변하도록 구현하려고 했다.

목표는 다음과 같았다.

  • HP가 일정 비율 이하로 떨어지면 하드닝 발동
  • 데미지 감소 적용
  • 몬스터 머티리얼이 검보라색 분위기로 덮이는 연출 발생

이를 위해 PotatoHardenShellComponent에서 Material Instance Dynamic(MID)를 생성하고 머티리얼 파라미터를 변경하도록 구현했다.

MID->SetVectorParameterValue(TEXT("ShellTint"), HardenTint);
MID->SetScalarParameterValue(TEXT("TintStrength"), 1.0f);

하지만 실제 게임에서는 다음과 같은 문제가 발생했다.

  • 색상이 거의 변하지 않거나
  • 단순히 톤이 어두워지는 느낌만 발생
  • 일부 경우 하얀색으로 포화되는 현상

즉, 의도했던 “검보라색으로 덮이는 느낌”이 제대로 나타나지 않았다.


문제 원인 분석

문제를 단계적으로 분석하면서 다음 원인들을 확인했다.


1. Material Parameter 적용 여부 확인

먼저 코드에서 MID가 정상적으로 생성되고 파라미터가 실제로 변경되는지 확인했다.

UE_LOG(LogTemp, Warning, TEXT("[Harden] Mat[%d] MID=%s"), i, *GetNameSafe(MID));

로그 결과

MID_TurtleShellPBR_MAT_0

또한 파라미터 변경 로그도 정상적으로 확인되었다.

Before=(1,1,1)
After=(0.4,0.4,0.45)

  • MID 생성 정상
  • 파라미터 적용 정상
  • 코드 로직 문제는 아님

2. Emissive Color 영향 여부

머티리얼에서 Emissive Color에 강한 Multiply 값이 연결되어 있었고, 이로 인해 색상이 하얗게 포화되는 현상이 발생할 가능성이 있었다.

하지만 Emissive 연결을 완전히 제거한 이후에도 문제가 동일하게 발생했다.

따라서 Emissive가 직접적인 원인은 아니었다.


3. Tint 적용 방식 문제

머티리얼 그래프에서 Tint 적용 방식이 다음과 같은 형태였다.

BaseColor + Tint
또는
BaseColor * Tint

이 방식은 다음과 같은 문제가 있다.

  • Multiply → 색이 어두워지는 방향으로만 변화
  • Add → 밝은 부분이 쉽게 Saturate 되어 흰색으로 변함

결과적으로

  • 보라색이 “덮이는” 느낌이 아니라
  • 단순히 톤이 어두워지거나 밝기가 변화하는 정도로만 표현되었다.

4. TintStrength 값 구조

머티리얼에서 TintStrength를 다음과 같이 사용하고 있었다.

Lerp(BaseColor, TintColor, TintStrength)

이 구조에서는

  • TintStrength = 0 → 원래 색
  • TintStrength = 1 → TintColor

강도를 조절하는 값이 아니라 스위치처럼 사용할 수도 있는 구조였다.


해결 방법

최종적으로 다음 방식으로 구조를 단순화했다.

핵심은

TintStrength를 강도 값이 아니라 ON/OFF 스위치처럼 사용하는 것이다.


1. Material 구조

머티리얼에서 BaseColor를 다음 방식으로 구성했다.

FinalColor = Lerp(BaseColor, ShellTint, TintStrength)

이 구조의 특징

  • TintStrength = 0 → 원래 색상
  • TintStrength = 1 → TintColor로 덮임

색상을 완전히 덮는 효과를 간단하게 구현 가능


2. 코드 적용 방식

하드닝 상태 진입 시

MID->SetVectorParameterValue(TEXT("ShellTint"), FLinearColor(0.1f, 0.02f, 0.15f, 1));
MID->SetScalarParameterValue(TEXT("TintStrength"), 1.0f);

하드닝이 해제되거나 기본 상태일 때

MID->SetScalarParameterValue(TEXT("TintStrength"), 0.0f);

  • 0 → 기본 상태
  • 1 → 하드닝 색상

으로 간단하게 제어할 수 있도록 정리했다.


결과

최종적으로 다음과 같은 동작이 구현되었다.

  • HP가 일정 비율 이하가 되면 HardenShell 상태 진입
  • 데미지 감소 적용
  • 몬스터 색상이 검보라색으로 확실하게 덮이는 시각 효과 발생

또한 TintStrength를 0 / 1 스위치 방식으로 단순화하면서

  • 머티리얼 제어 로직이 단순해졌고
  • 코드에서도 상태 제어가 명확해졌다.

정리

  • Material 파라미터가 적용되지 않는 것이 아니라 그래프 구조 때문에 원하는 시각 효과가 나오지 않을 수 있다
  • Multiply 기반 Tint는 색상 변화 체감이 약하다
  • Overlay 느낌이 필요할 경우 Lerp 구조가 가장 직관적이고 안정적이다
  • Material 파라미터는 강도 값보다는 상태 스위치로 사용하는 것이 관리가 쉽다

결과적으로 TintStrength를 0/1 상태값으로 사용하는 구조로 정리하면서 문제를 해결할 수 있었다.

profile
개발합시다!

0개의 댓글