[UE4] WidgetComponent에서 DynamicMaterialInstance를 사용하려고 할 때 막힌 이야기

2869 단어 위 4UnrealEngine

개요



WidgetComponent에서 DynamicMaterialInstance를 사용하려고하면 막혔으므로 솔루션의 메모로.
환경은 UE4.24.

시도한 일



Widget의 외형 변경을, Widget의 애니메이션이나 표시 전환을 사용하지 않고, WidgetComponent의 Material만으로 하려고 했다.
※Material로 외형을 바꾼 경우, Widget의 외형을 RenderTarget에 재묘화하는 처리가 들어가지 않기 때문에, 파트가 많은 Widget의 경우 경량화를 전망할 수 있다.

이번에는 표본으로, 텍스트의 Color를 바꾼다.
어쨌든 Widget으로 텍스트를 배치하고 빨간색 Material을 WidgetComponent에 할당했습니다.


문제 발생



여기까지는 순조로웠지만, 막상 파라미터를 Material에 건네려고 했더니 문제가 발생했다.

UE4에서 Material에 파라미터를 전달하고 동적으로 외형을 변경하는 경우 DynamicMaterialInstance를 만들어야 한다.
StaticMeshComponent 등에서 사용할 때와 마찬가지로 BeginPlay에서 WidgetComponent의 DynamicMaterialInstance를 만들었다.


그러자 조금 전까지 표시되어 있던 텍스트가 디폴트 머티리얼의 외형이 되어 버렸다.


원인



혹시 미대응인지 생각하면서 로그를 보면 아래와 같은 로그가 출력되고 있었다.LogMaterial: Warning: MaterialInstanceDynamic MaterialInstanceDynamic_2 is not a valid parent for MaterialInstanceDynamic MaterialInstanceDynamic_3. Only Materials and Material InstanceConstants are valid parents for a material instance.
이것만이라면 뭐라고 하는 느낌이지만, 로그를 출력하고 있는 개소로부터 처리를 쫓아 보면, 원인을 알 수 있었다.

WidgetComponent는, RenderTarget에 렌더링 하기 위해서 원래 DynamicMaterialInstance를 변수에 보관 유지하고 있어, 그것이 UWidgetComponent::SetMaterial 가 불릴 때마다 갱신된다.
DynamicMaterialInstance를 만들 경우 SetMaterial도 불리기 때문에, 유지하고 있던 묘화용의 DynamicMaterialInstance도 갱신되지만, 여기서 문제가 발생한다.

현재의 Material을 바탕으로 DynamicMaterialInstance를 작성해, 묘화용의 변수를 갱신하려고 하지만, 현재의 Material은 스스로 만든 DynamicMaterialInstance가 되어 있으므로, DynamicMaterialInstance를 부모로 하여 DynamicMaterialInstance를 만드는 것이다.
이것에 대응하지 않는 것 같고, 결과적으로 위에 붙인 로그가 출력된다. (DynamicMaterialInstance는 DynamicMaterialInstance의 유효한 부모가 아닙니다)

결론



WidgetComponent에서 DynamicMaterialInstance를 사용하고 싶은 경우는, 그리기용으로 DynamicMaterialInstance가 마음대로 만들어져 있으므로, 그것을 참조하는 것만으로 좋다.UWidgetComponent::GetMaterialInstance 에서 참조 할 수 있으며 Blueprint에서도 호출 할 수 있습니다.


무사한 색을 바꿀 수 있었다.

좋은 웹페이지 즐겨찾기