게임플레이 동안 에셋의 머티리얼 프로퍼티를 변경하는 것은 플레이어에게 시각적 피드백이나 게임플레이 정보 제공 또는 몰입감을 높이는 유용한 방법입니다. 예를 들면 다음과 같습니다.
플레이어 스킨은 서로 다른 상태 이펙트를 나타내기 위해 외형을 변경할 수 있습니다.
주변에 있는 플레이어의 시선을 끌기 위해 픽업 아이템이 빛나도록 설정할 수 있습니다.
비가 내릴 때 지면을 마른 상태에서 젖은 상태로 변화시켜서 몰입감을 높일 수 있습니다.
이 튜토리얼에서는 블루프린트를 사용하여 인터랙티브 테크 데모에서 런타임 동안 머티리얼 프로퍼티를 변경합니다. 이 데모에서는 플레이어가 레벨 내에서 이리저리 밀고 다니는 동안 바닥을 적시는 워터 볼을 제작합니다.
또한 이미시브 머티리얼, 단순 마스크, 스태틱 스위치를 시험해 보면서 젖은 바닥에 반사되는 세트 드레싱을 제작해 봅니다.
게임 바닥 에셋 생성
이 테크 데모에서 처음 제작할 에셋은 바닥입니다. Lvl_Adventure의 Room 3에서 자리표시자 바닥 메시를 대체할 표면 처리된 게임용 바닥 에셋을 제작합니다.
시작하기 전에 접근 방식을 잠시 살펴보겠습니다. 이전 튜토리얼에서 바닥과 같은 대규모 메시의 표면을 처리할 때는 타일링 텍스처가 비용 효율적인 방법이라는 것을 배웠습니다. 또한 메시의 UV가 텍스처 표현 방식에 영향을 미친다는 점도 배웠습니다.
Room 3의 자리표시자 바닥은 세 개의 메시로 구성되어 있으며, 각 메시마다 서로 다른 UV를 가지고 있습니다.
아래 데모에서는 메시 간에 UV가 일치하지 않아 타일링 텍스처의 크기가 서로 다르게 보이는 것을 확인할 수 있습니다. 이로 인해 바닥의 표면을 일관성 있게 처리하기가 어려워집니다.
이 문제는 트라이플레이너 프로젝션을 사용하여 해결하게 됩니다. 트라이플레이너 프로젝션은 UV를 무시하고 텍스처를 월드 정렬 방식으로 적용하는 표면 처리 기법입니다. 이는 UV를 수정할 수 없거나 UV 매핑이 어려운 지오메트리를 다룰 때 유용합니다.
이 접근 방식을 바탕으로, 표현식을 사용하여 M_Surfaces를 월드 정렬 방식으로 구성합니다. 인스턴스는 부모 머티리얼의 프로퍼티를 상속하므로, MI_Surfaces_Floor 역시 월드 정렬 방식이 됩니다. 그런 다음 자리표시자 메시를 대체할 블루프린트에 MI_Surfaces_Floor를 적용합니다.
UV 문제를 사전에 방지하기 위해, 모델링 소프트웨어에서 모듈형 에셋을 제작할 때 각 에셋의 UV 스케일을 적절히 조절하는 것이 좋습니다.
월드 정렬 머티리얼 생성
부모 머티리얼을 월드 정렬 방식으로 설정하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 All > 콘텐츠 > AdventureGame > Artist > Materials로 이동하고
M_Surfaces를 엽니다.UV Tiling 코멘트 박스 안의 모든 노드와 디퓨즈 맵, 노멀 맵을 선택합니다. 해당 항목을 모두 삭제합니다.
그래프를 우클릭하고 Texture Object를 검색합니다. 이 노드를 두 개 생성합니다.
첫 번째 Texture Object를 선택합니다. 디테일 패널에서 텍스처를 DefaultDiffuse로 설정합니다.
Texture Object를 우클릭하고 파라미터로 변환을 선택합니다. 새 파라미터 이름을
Diffuse로 짓습니다.두 번째 Texture Object를 선택합니다. 디테일(Details) 패널에서 텍스처(Texture)를 DefaultNormal로 설정합니다.
Texture Object를 우클릭하고 파라미터로 변환을 선택합니다. 새 파라미터 이름을
Normal로 짓습니다.Diffuse 노드의 출력에서 드래그하여 World Aligned Texture 노드를 추가합니다.
XYZ 텍스처(XYZ Texture) 출력을 Diffuse Hue 코멘트 박스 안에 있는 Multiply 노드의 A 입력에 연결합니다.
Normal 노드의 출력에서 드래그하여 World Aligned Normal 노드를 추가합니다.
XYZ 텍스처 출력을 M_Surfaces 머티리얼 루트 노드의 노멀(Normal) 입력에 연결합니다.
그래프를 우클릭하고 Scalar Parameter를 검색합니다. 이름을
Texture Scaling으로 짓습니다.디폴트 값(Default Value)을
214로 설정합니다.Texture Scaling의 출력을 두 WorldAligned 노드의 TextureSizeV3 입력에 연결합니다.
머티리얼을 저장합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
다음으로는, 자리표시자 바닥을 대체할 블루프린트를 생성해 보겠습니다.
바닥 블루프린트 생성
블루프린트를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서 All > 콘텐츠 > AdventureGame > Artist 경로로 이동한 후 우클릭하고 새 폴더(New Folder)를 선택합니다.
폴더 이름을
Blueprints로 짓습니다.Blueprints 폴더를 우클릭하고 블루프린트 클래스(Blueprint Class)를 선택한 다음 부모 클래스로 액터(Actor)를 선택합니다.
블루프린트 이름을
BP_Floor로 짓고 더블클릭하여 블루프린트 에디터에서 엽니다.콘텐츠 브라우저에서 All 폴더를 선택하고
SM_Cube를 검색합니다.SM_Cube를 블루프린트 에디터의 컴포넌트(Components) 패널로 드래그하여 BP_Floor의 자손으로 추가합니다.
SM_Cube 이름을
Floor로 짓습니다.디테일 패널에서 스케일이
1.0, 1.0, 1.0인지 확인합니다.머티리얼 > 엘리먼트 0 옆에서 머티리얼을
MI_Surfaces_Floor로 설정합니다.컴포넌트 탭에서 DefaultSceneRoot를 선택하고 추가(Add)를 클릭하여
Box Collision을 추가합니다.박스 콜리전 이름을
Trigger로 짓습니다.디테일 패널에서 트리거의 스케일을
1.5, 1.5, 1.5로 설정합니다.트리거의 위치를
50, 50, 55로 설정합니다.블루프린트를 저장하고 컴파일합니다.
BP_Floor의 인스턴스를 레벨에 드래그하여 배치한 후 위치를 움직여 봅니다. 메시를 이동해도 텍스처가 동일한 위치에 유지되는 것을 확인할 수 있습니다. 이제 이를 스케일 조절해 보면 메시 크기는 변경되지만 텍스처 크기는 변경되지 않습니다.
다음으로는, Room 3의 자리표시자 바닥을 BP_Floor 인스턴스로 대체해 보겠습니다.
자리표시자 메시 대체
이제 Room 3의 자리표시자 메시를 원하는 배치로 BP_Floor로 대체할 수 있습니다. 다음은 자리표시자와 일치하도록 구성한 바닥 예시입니다.
위에 표시된 예시를 그대로 사용하려면 다음 단계에 따라 이 레벨을 복사할 수 있습니다.
위 튜토리얼에 따라
M_Surfaces를 업데이트하고BP_Floor를 생성했는지 검증합니다.아웃라이너에서 Room 3 폴더 안에 있는 모든 항목을 선택하고 Delete 키를 누릅니다.
다음 스니펫을 복사합니다.
Console OutputBegin Map Begin Level Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_2 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/SFEFWFWEEEWEF.SFEFWFWEEEWEF:PersistentLevel.StaticMeshActor_2'" Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/SFEFWFWEEEWEF.SFEFWFWEEEWEF:PersistentLevel.StaticMeshActor_2.StaticMeshComponent0'" End Object Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/SFEFWFWEEEWEF.SFEFWFWEEEWEF:PersistentLevel.StaticMeshActor_2.StaticMeshComponent0'" StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cylinder.SM_Cylinder'" StaticMeshImportVersion=1 bUseDefaultCollision=False StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B2485E57DB4B8EC731318B8215AE8D46FAD400000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0"뷰포트에서 Ctrl+V를 누릅니다.
다음으로는, 워터 볼을 생성하고 다이내믹 머티리얼 인스턴스를 사용하여 바닥을 마른 상태에서 젖은 상태로 변경해 보겠습니다.
플레이어 인터랙션을 사용한 머티리얼 변경
워터 볼은 피직스가 활성화된 오브젝트로, 바닥의 프로퍼티를 변경하여 젖은 것처럼 보이게 합니다.
워터 볼 생성
워터 볼을 생성하고 표면을 설정하려면 다음 단계를 따릅니다.
콘텐츠 브라우저의 Blueprints 폴더에서 우클릭하여 새로운 블루프린트 클래스를 생성합니다.
액터를 부모 클래스로 선택합니다.
새 블루프린트 이름을
BP_WaterBall로 짓고 블루프린트 에디터에서 엽니다.컴포넌트 탭에서 추가를 클릭하고
Sphere를 검색합니다.디테일 패널에서 머티리얼 > 엘리먼트 0을
M_Water로 설정합니다.디테일 패널의 피직스(Physics)에서 피직스 시뮬레이트(Simulate Physics)를 체크합니다.
블루프린트를 저장하고 컴파일합니다.
BP_WaterBall인스턴스를 레벨에 드래그합니다.
뷰포트에서 우클릭하고 여기에서 플레이(Play From Here)를 선택하여 레벨에서 워터 볼을 테스트합니다. 플레이어가 부딪히면 볼이 바닥을 따라 튀어야 합니다.
레벨에 적이 있으면, 플레이어를 추격하지 않도록 최대 속도(Max Speed)를 0으로 설정하거나 적을 제거합니다.
다음으로는, BP_Floor 내부 로직을 사용하여 다이내믹 머티리얼 인스턴스를 생성해 보겠습니다.
다이내믹 머티리얼 인스턴스 생성
다이내믹 머티리얼 인스턴스는 블루프린트와 같은 스크립트에 의해 생성되며, 런타임에서 프로퍼티를 변경할 수 있는 머티리얼 인스턴스입니다.
이 섹션에서는 바닥 메시(MI_Surfaces_Floor)에 할당된 머티리얼을 레퍼런스하여 다이내믹 머티리얼 인스턴스를 생성하고, 새 인스턴스를 바닥에 할당하는 블루프린트 로직을 생성합니다. 그런 다음 다이내믹 머티리얼 인스턴스는 이전 튜토리얼에서 노출한 러프니스 및 디퓨즈 색조 프로퍼티를 변경하여 젖은 바닥 효과를 모방합니다.
런타임 동안 이 교체 작업을 통해 바닥이 얇은 물 레이어에 젖은 것처럼 보이게 됩니다.
다이내믹 머티리얼 인스턴스를 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저에서
BP_Floor를 더블클릭하여 블루프린트 에디터에서 엽니다.이벤트 그래프(EventGraph)에서 Event BeginPlay를 제외한 모든 노드를 삭제합니다.
컴포넌트 탭에서 Floor 인스턴스를 이벤트 그래프로 드래그합니다.
Floor의 출력에서 드래그하고 Get Material을 검색합니다.
Get Material의 반환 값(Return Value) 출력에서 드래그하여 타깃이 키즈멧 머티리얼 라이브러리인 Create Dynamic Material Instance 노드를 추가합니다.
Event BeginPlay의 출력을 Create Dynamic Material Instance의 실행 입력 핀에 연결합니다.
Dynamic Material Instance의 반환 값(Return Value)에서 드래그하고 변수로 승격(Promote to Variable)을 선택합니다.
디테일 패널에서 해당 변수의 이름을
Dynamic Mat Ref로 변경합니다.Floor 인스턴스를 이벤트 그래프로 한 번 더 드래그합니다.
Floor의 출력에서 드래그하고 Set Material을 검색합니다.
Set 노드의 흰색 실행 출력을 Set Material 노드의 실행 입력에 연결합니다.
Set 노드의 파란색 출력을 Set Material 노드의 머티리얼(Material) 입력에 연결합니다.
그래프를 정리하기 위해 모든 노드를 선택하고 C 키를 누릅니다. 코멘트 박스의 이름을
Create Dynamic Material로 짓습니다.저장 및 컴파일합니다.
이제 이벤트 그래프가 다음과 같은 모습이 됩니다.
이벤트 호출
바닥의 젖은 상태 표현을 트리거하려면 BP_Floor가 BP_WaterBall과 오버랩되는지 확인하는 이벤트와 그 결과에 따라 적절한 표현을 호출하는 이벤트가 필요합니다.
다음과 같이 로직을 구성합니다.
액터가
BP_Floor와 오버랩되는 경우:다른 액터가
BP_WaterBall과 동일한지 확인합니다. true인 경우:BP_Floor의 젖은 상태 표현을 호출합니다.
그렇지 않고 false인 경우:
아무 작업도 수행하지 않습니다.
이 로직을 생성하려면 다음 단계를 따릅니다.
BP_Floor의 이벤트 그래프를 우클릭하고 Add Custom Event를 검색합니다. 이 노드의 이름을Call Wet Look으로 짓습니다.컴포넌트 탭에서 트리거(Trigger)를 우클릭하고 이벤트 추가(Add Event) > OnComponentBeginOverlap 추가(Add OnComponentBeginOverlap)를 선택합니다.
OnComponentBeginOverlap이 콜리전을 탐지합니다.
OnComponentBeginOverlap의 기타 액터(Other Actor) 출력에서 드래그하여 Get Class를 생성합니다.
반환 값 출력에서 드래그하여 Equal을 생성합니다.
클래스 선택(Select Class) 입력을 우클릭하고 변수로 승격을 선택합니다.
변수 이름을
WaterBall로 짓고 블루프린트를 컴파일합니다.디테일 패널에서 WaterBall의 디폴트 값을
BP_WaterBall로 설정합니다.Equal 노드의 출력에서 드래그하여 Branch를 생성합니다.
Branch의 True 출력에서 드래그하여 Call Wet Look을 검색합니다.
OnComponentBeginOverlap의 실행 출력을 Branch 노드의 E실행 입력에 연결합니다.
이제 이벤트 그래프가 다음과 같은 모습이 됩니다.
머티리얼 프로퍼티 제어
이제 바닥의 젖은 베리에이션을 구성합니다. 바닥이 돌과 같은 다공성 재질이므로 물을 흡수하면 컬러가 더 어두워져야 합니다(Diffuse Hue). 위에 얇은 물 레이어가 형성되므로 표면은 광택이 있는 것처럼 보여야 합니다(Roughness).
젖은 상태를 표현하기 위한 로직을 구성하려면 다음 단계를 따릅니다.
Dynamic Mat Ref 변수를 이벤트 그래프로 드래그하고 목록에서 Get을 선택합니다.
출력 핀에서 드래그하여 Set Scalar Parameter Value를 생성합니다.
같은 출력 핀에서 드래그하여 Set Vector Parameter Value를 생성합니다.
M_Surfaces에서 노출했던 파라미터를 기억할 것입니다. Roughness는 스칼라 값(단일 값)이고, Diffuse Hue는 벡터 값(세 개의 값, 즉 RGB)입니다.Set Scalar Parameter Value 노드에서 파라미터 이름(Parameter Name)을 우클릭하고 변수로 승격을 선택합니다. 변수 이름을
Roughness로 짓습니다.Set Vector Parameter Value 노드에서 파라미터 이름을 우클릭하고 변수로 승격을 선택합니다. 변수 이름을
Diffuse Hue로 짓습니다.블루프린트를 컴파일하고 각 파라미터 이름에 값을 입력합니다.
Roughness 변수를 선택하고 디폴트 값에
Roughness를 입력합니다.Diffuse Hue 변수를 선택하고 디폴트 값으로
Diffuse Hue를 입력합니다.디폴트 값은
M_Surfaces에 있는 해당 파라미터와 일치해야 합니다.
Set Scalar Parameter Value 노드의 실행 출력 핀을 Set Vector Parameter Value 노드의 실행 입력에 연결합니다.
건조 상태에서 젖은 상태로 변화하는 것뿐만 아니라, 그 변화 속도 또한 로직으로 제어할 수 있습니다. 물질이 포화되는 데에는 시간이 걸리므로, 머티리얼 프로퍼티를 점진적으로 전환합니다. 이 작업은 선형 보간(Lerp) 노드를 사용하여 수행할 수 있습니다.
Lerp 노드는 두 값 사이를 부드럽게 블렌딩(보간)합니다. 한 컬러, 텍스처 또는 이펙트에서 다른 것으로 자연스럽게 전환할 때 유용합니다.
Lerp 노드를 생성하려면 다음 단계를 따릅니다.
Scalar Parameter 노드의 값(Value) 입력에서 드래그하여 Lerp를 생성합니다. 이 노드는 Roughness를 제어합니다.
Lerp에서 A 값을
1.0으로 설정합니다. 이는 건조한 상태에서의 Roughness 값입니다. B 값을0.0으로 유지합니다. 이 값은 젖은 상태를 나타내는 값입니다.이전 튜토리얼에서는 러프니스가 1이면 무광이고 0이면 유광이라는 것을 배웠습니다. 워터 볼 표면이 광택이 있어 보이도록 설정합니다.
Set Vector Parameter Value 노드의 값 입력에서 드래그하여 Lerp (Linear Color)를 생성합니다. 이 노드는 Diffuse Hue를 제어합니다.
새 Lerp의 A 값에서 드래그하여 변수로 승격(선형 컬러)을 선택합니다. 변수 이름을 Unsaturated로 짓습니다.
Lerp의 B 값에서 드래그하여 변수로 승격을 선택합니다. 변수 이름을
Saturated로 짓습니다.블루프린트를 컴파일합니다. 디테일 패널에서 Unsaturated의 디폴트 값을
CDDAFFFF로 설정합니다.디테일 패널에서 Saturated의 디폴트 값을
656C7FFF와 같이 더 어두운 컬러로 설정합니다.
이제 이벤트 그래프가 다음과 같은 모습이 됩니다.
이제 블루프린트 로직을 사용하여 바닥의 새로운 외형을 생성했습니다. 하지만 이 로직을 제어하는 엔진 역할을 하는 요소, 즉 Timeline이 빠져 있습니다.
Timeline으로 로직 제어
애니메이션 소프트웨어의 타임라인과 마찬가지로, Timeline 노드는 시간에 따라 키프레임 사이의 값을 변화시킵니다. 이 노드를 사용하여 지정된 시간 동안 마른 상태와 젖은 상태 사이의 보간을 실행합니다.
타임라인을 생성하려면 다음 단계를 따릅니다.
이벤트 그래프를 우클릭하고 Add Timeline을 검색하여 생성합니다.
Timeline 노드를 더블클릭하여 Timeline_Template 탭을 엽니다.
트랙(Track)을 클릭하고 목록에서 플로트 트랙 추가(Add Float Track)를 선택합니다.
트랙 이름을
Alpha로 짓습니다. 이 트랙 이름은 Timeline 노드의 출력 핀으로 표시됩니다.Timeline의 길이(Length)를
3.0초로 설정합니다.Timeline 내부를 우클릭하고 키 추가(Add Key)를 선택합니다.
파란색으로 하이라이트된 키의 시간(Time) 및 값(Value)을 모두
0.0으로 설정합니다.두 번째 키를 생성하고 시간(Time) 및 값(Value)을
1.0으로 설정합니다.첫 번째 키를 우클릭하고 사용자(User)를 선택합니다.
저장 및 컴파일합니다.
이 타임라인은 이제 3초 동안 0에서 1로 블렌딩되는 값을 출력합니다. 이제 남은 노드를 Timeline에 연결합니다.
이벤트 그래프로 돌아가 Call Wet Look 출력을 Timeline의 재생(Play) 입력에 연결합니다.
Timeline의 업데이트(Update) 출력을 Set Scalar Parameter Value의 실행 입력에 연결합니다.
타임라인 알파(Timeline’s Alpha) 출력을 두 Lerp 노드의 알파(Alpha) 입력에 연결합니다.
노드를 선택하고 C 키를 눌러 코멘트를 추가합니다. 코멘트 박스의 이름을
Lerp Dynamic Materials로 짓습니다.저장 및 컴파일합니다.
완성된 이벤트 그래프는 다음과 같은 모습이 됩니다.
작업을 테스트하려면 레벨에서 우클릭하고 여기에서 플레이를 선택합니다. 워터 볼을 방 안에서 밀고 다니면 바닥이 점차 '잠기는' 효과가 나타납니다.
낮 시간대에는 젖은 표면의 반사 효과가 다소 눈에 띄지 않을 수 있습니다. 바닥의 반사 효과를 강조하기 위해 레벨을 더 어둡게 설정하고 이미시브 머티리얼을 사용하여 라이팅을 추가합니다.
이미시브 머티리얼
이미시브 머티리얼을 사용하면 자체 발광 효과를 비용 효율적으로 구현할 수 있습니다. 이미시브 머티리얼은 캐릭터의 SF 아머에 있는 LED나 자동차 브레이크등 같이, 보다 복잡한 머티리얼에 포함되는 발광 효과를 구현하는 데 사용할 수 있습니다.
이미시브 머티리얼은 루멘 글로벌 일루미네이션 및 리플렉션 시스템과 인터랙션할 수 있으며, 이는 주변 환경에도 영향을 미친다는 의미입니다.
이미시브 머티리얼의 밝기는 0(라이트 없음)에서 1(이미시브 라이트) 또는 1 이상(블룸을 생성하는 이미시브 라이트)까지의 플로트 값으로 제어할 수 있습니다.
이미시브 머티리얼과 리플렉션은 어두운 레벨에서 더욱 두드러집니다. 레벨의 전체 라이팅을 변경하려면 다음 단계를 따릅니다.
아웃라이너에서 디렉셔널 라이트(Directional Light)를 선택합니다.
뷰포트에서 Ctrl+L을 누른 상태로 마우스를 움직여 디렉셔널 라이트의 위치와 해당 레벨에서의 상대적인 시간대를 조정합니다.
이미시브는 일반적으로 환경 라이팅 용도로는 권장되지 않습니다. 이미시브 머티리얼을 라이트 소스로 사용할 경우 의도치 않은 결과가 발생할 수 있습니다. 대신 환경에 적절한 라이트 소스를 사용하는 것이 좋습니다.
이미시브 머티리얼 생성
이 튜토리얼에서는 레벨 곳곳에 배치했을 때 젖은 돌 바닥에 반사되는 네온 사인을 제작합니다. 이를 위해 다음 파라미터를 자손 인스턴스로 전달할 수 있는 유연한 부모 머티리얼을 생성합니다.
이미시브 컬러
이미시브 밝기
텍스처 마스크
이미시브 머티리얼을 생성하려면 다음 단계를 따릅니다.
콘텐츠 브라우저의 All > 콘텐츠 > AdventureGame > Artist > Materials 경로에서 새 머티리얼을 생성합니다.
머티리얼 이름을
M_EmissiveSign으로 짓고 더블클릭하여 머티리얼 에디터에서 엽니다.머티리얼 그래프에서 머티리얼 루트 노드의 이미시브 컬러(Emissive Color) 입력에서 드래그하고 선택 목록에서 Multiply 노드를 추가합니다.
Multiply 노드의 A 입력에서 드래그하여 Constant3Vector를 추가합니다.
Constant3Vector를 우클릭하고 파라미터로 변환(Convert to Parameter)을 선택합니다.
파라미터 이름을
Color로 변경합니다.색 견본을 더블클릭하여 이미시브에 사용할 컬러를 선택합니다.
Multiply 노드의 B 입력에서 드래그하여 선택 목록에서 Constant 노드를 추가합니다.
Constant를 파라미터로 변환하고 이름을
Brightness로 짓은 다음 값을25로 설정합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
범위제한을 사용한 파라미터 제한
이미시브 밝기에는 상한이 없지만, 부모 머티리얼에서 범위제한을 사용하여 최소 및 최대 밝기에 대해 커스텀 한도를 설정할 수 있습니다. 범위제한을 사용하면 슬라이더로 값을 조정할 때, 특히 작은 값을 다루거나 민감하게 조정할 때 더 수월해집니다.
다른 파라미터와 마찬가지로 범위제한은 머티리얼 인스턴스에도 전달됩니다.
Brightness 파라미터를 범위제한하려면 다음 단계를 따릅니다.
머티리얼 그래프에서 Brightness 파라미터를 선택합니다.
디테일 패널에서 슬라이더 최대(Slider Max)를
50으로 설정합니다.
다음으로는, 텍스처 마스크를 사용하여 네온 사인 콘텐츠를 구성해 보겠습니다.
단순 마스크 생성
텍스처 마스크는 그레이스케일(알파) 또는 단일 채널 텍스처 맵으로, 머티리얼의 특정 영역을 표시하거나 숨기는 데 사용됩니다. 알파 마스크는 일종의 레이어라고 생각할 수 있는데, 흰색 영역은 아래 레이어에 정보를 드러내고 검은색 영역은 이를 가립니다.
이미시브 머티리얼에서 알파 마스크를 사용하여 발광 영역을 드러내거나 차단함으로써 네온 사인의 콘텐츠를 생성합니다.
M_Emissive 부모 머티리얼 안에 마스크를 생성하려면 다음 단계를 따릅니다.
어떤 노드도 선택하지 않은 상태에서 디테일 패널로 이동합니다. 블렌드 모드(Blend Mode) 옆의 드롭다운 메뉴를 클릭하고 마스크드(Masked)을 선택합니다.
이벤트 그래프에서 우클릭하고 Texture Sample을 생성합니다.
디테일 패널의 텍스처(Texture) 옆에서
T_UE_Logo_M을 검색합니다.이 텍스처는 언리얼 엔진에 기본적으로 포함되어 있으므로 별도로 다운로드하거나 생성할 필요가 없습니다.
Texture Sample의 RGB 출력을 머티리얼 루트 노드의 오파시티 마스크(Opacity Mask) 입력에 연결합니다.
Texture Sample을 우클릭하고 파라미터로 변환을 선택합니다. 파라미터 이름을
LED Sign으로 짓습니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
이제 네온 사인을 모방한 머티리얼을 생성했습니다. 다음으로는, 마스크를 반전시켜 부모 머티리얼의 유연성과 생성 가능한 고유 에셋 수를 한층 늘려 보겠습니다.
이를 위해 반전된 마스크와 반전되지 않은 마스크를 위한 고유한 머티리얼 인스턴스를 각각 생성할 수도 있습니다. 대신 M_EmissiveSign에서 생성된 모든 머티리얼 인스턴스 내부에서 반전을 토글할 수 있도록 스태틱 스위치(Static Switch)를 사용합니다.
스태틱 스위치를 사용한 파라미터 토글
이전 튜토리얼에서 배운 것처럼, 머티리얼 전파 계층구조에서는 자손 인스턴스가 부모 머티리얼의 프로퍼티를 상속합니다.
스태틱 스위치를 사용하지 않는 한, 인스턴스는 상속된 파라미터를 커스터마이징할 수 있지만 완전히 무시할 수는 없습니다. 부모 머티리얼에 설정된 스태틱 스위치는 자손 인스턴스에서 파라미터를 설정 또는 해제로 토글할 수 있도록 합니다.
토글이 해제된 파라미터는 컴파일되지 않으므로, 스태틱 스위치를 사용하면 런타임 퍼포먼스를 향상할 수 있습니다. 그러나 각 불린 값은 새로운 셰이더 순열을 생성하므로 머티리얼의 복잡도에 따라 컴파일 타임이 크게 증가할 수 있습니다. 스위치의 효용성은 사용 방식과 프로젝트의 개발 요구 사항에 따라 달라집니다.
런타임은 게임이 실행 중인 기간을 의미합니다. 컴파일 타임은 게임이 런타임 이전에 컴파일되는 단계를 의미합니다.
마스크 반전을 제어하는 스태틱 스위치를 생성하려면 다음 단계를 따릅니다.
머티리얼 그래프에서 LED Sign 노드를 선택하고 Ctrl+D를 눌러 복제합니다.
새 노드 이름을
Screen으로 변경합니다.Screen의 RGB 출력에서 드래그하여 One Minus를 검색합니다.
그래프를 우클릭하고 Static Switch Parameter를 검색합니다. 스위치 이름을
Flip Mask?로 짓습니다.One Minus의 출력을 스위치의 False 입력에 연결합니다.
LED Sign의 RGB 출력을 스위치의 True 입력에 연결합니다.
스위치의 출력을 머티리얼 루트 노드의 오파시티 마스크 입력에 연결합니다.
머티리얼을 저장합니다.
이제 머티리얼 그래프가 다음과 같은 모습이 됩니다.
이제 M_EmissiveSign에서 머티리얼 인스턴스를 생성하여 밝기, 컬러, 텍스처 맵, 마스크 반전을 개별적으로 제어할 수 있습니다.
레벨의 새 메시 또는 기존 메시에 M_EmissiveSign 인스턴스를 적용하여 원하는 씬을 생성합니다. 레벨에서 워터 볼을 굴리면, 기본적으로 활성화되어 있는 루멘의 글로벌 일루미네이션 및 리플렉션 시스템을 통해 네온 사인이 젖은 바닥에 반사됩니다. 다음 튜토리얼에서는 루멘 및 기타 리플렉션 시스템에 대해 더 자세히 배우게 됩니다.
다음 순서
다음 튜토리얼에서는 포스트 프로세스 볼륨 내부의 리플렉션, 일루미네이션 시스템, 그리고 레벨에 다양한 인카메라 이펙트를 적용하는 방법을 배우게 됩니다.