몬스터가 일정 HP 이하로 떨어지면 하드닝(HardenShell) 상태에 진입하면서 색상이 변하도록 구현하려고 했다.
목표는 다음과 같았다.
이를 위해 PotatoHardenShellComponent에서 Material Instance Dynamic(MID)를 생성하고 머티리얼 파라미터를 변경하도록 구현했다.
MID->SetVectorParameterValue(TEXT("ShellTint"), HardenTint);
MID->SetScalarParameterValue(TEXT("TintStrength"), 1.0f);
하지만 실제 게임에서는 다음과 같은 문제가 발생했다.
즉, 의도했던 “검보라색으로 덮이는 느낌”이 제대로 나타나지 않았다.
문제를 단계적으로 분석하면서 다음 원인들을 확인했다.
먼저 코드에서 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)
즉
머티리얼에서 Emissive Color에 강한 Multiply 값이 연결되어 있었고, 이로 인해 색상이 하얗게 포화되는 현상이 발생할 가능성이 있었다.
하지만 Emissive 연결을 완전히 제거한 이후에도 문제가 동일하게 발생했다.
따라서 Emissive가 직접적인 원인은 아니었다.
머티리얼 그래프에서 Tint 적용 방식이 다음과 같은 형태였다.
BaseColor + Tint
또는
BaseColor * Tint
이 방식은 다음과 같은 문제가 있다.
결과적으로
머티리얼에서 TintStrength를 다음과 같이 사용하고 있었다.
Lerp(BaseColor, TintColor, TintStrength)
이 구조에서는
TintStrength = 0 → 원래 색TintStrength = 1 → TintColor즉 강도를 조절하는 값이 아니라 스위치처럼 사용할 수도 있는 구조였다.
최종적으로 다음 방식으로 구조를 단순화했다.
핵심은
TintStrength를 강도 값이 아니라 ON/OFF 스위치처럼 사용하는 것이다.
머티리얼에서 BaseColor를 다음 방식으로 구성했다.
FinalColor = Lerp(BaseColor, ShellTint, TintStrength)
이 구조의 특징
즉 색상을 완전히 덮는 효과를 간단하게 구현 가능
하드닝 상태 진입 시
MID->SetVectorParameterValue(TEXT("ShellTint"), FLinearColor(0.1f, 0.02f, 0.15f, 1));
MID->SetScalarParameterValue(TEXT("TintStrength"), 1.0f);
하드닝이 해제되거나 기본 상태일 때
MID->SetScalarParameterValue(TEXT("TintStrength"), 0.0f);
즉
으로 간단하게 제어할 수 있도록 정리했다.
최종적으로 다음과 같은 동작이 구현되었다.
또한 TintStrength를 0 / 1 스위치 방식으로 단순화하면서
결과적으로 TintStrength를 0/1 상태값으로 사용하는 구조로 정리하면서 문제를 해결할 수 있었다.