- 목차
Unreal에서는 Material (Texture)를 실시간에서는 잘 제어가 잘 되지 않는다.
제어하고 싶은 Material을 Source Material로 하는 "Dynamic Material Instance" (UMaterialInstanceDynamic)을 런타임에서 생성. 생성한 "Dynamic Material Instance" 를 이용하여 변수 값을 바꾸어야한다.
Test engine version : 5.3.2
예제 테스트 1
- 콘텐츠 브라우저 빈 공간을 우클릭하여 "머티리얼"을 하나 생성한다.
- 적절히 이름을 바꾸고 더블클릭하여 블루프린트를 띄운다.
- 아래와 같이 원하는 변수를 생성하여 "베이스 컬러" 부분에 연결한다.
- (아래 사진은 가능한거 아무거나 생성한 것임)
- 빈공간에 우클릭을 한 후, "Constant3Vector, Constant4Vector 또는 TextureSampleParameter2D" 을 선택한다.
- ConstantVector로 생성한 노드를 우클릭한 후, "파라미터로 변환"을 클릭한다.
(텍스쳐의 경우 자동으로 "파라미터" 부분에 추가된다.) - "모두 저장"
- 아래 사진과 같이 "머티리얼 인스턴스 생성" 버튼을 이용하여 머티리얼 인스턴스를 생성하여 활용해도 된다.
- 콘텐츠 브라우저 빈 공간에 우클릭하여 "블루프린트" → "블루프린트 클래스"를 생성한 후, 더블 클릭하여 블루프린트를 연다.
- "컴포넌트" 하단에 "+추가" 버튼을 누른 후, "스피어" 버튼을 누른다. (빈 구체 하나가 추가될 것이다.)
- "컴포넌트" 부분에서 생성한 "Sphere"를 선택하면, "디테일" → "머티리얼" → "엘리먼트 0" 부분이 보이게 될 것인데, 이 부분을 위에서 만든 머티리얼로 교체한다.
- "이벤트 그래프" 부분에서 아래 사진과 같이 노드를 생성한 후, 실행을 하면 구체가 설정한 색상으로 바뀌게 된다.
- "Create Dynamic Material Instance" 노드에서 "Source Material"을 설정하지 않으면, "target"에 설정되어 있는 Material을 이용하여 "Dynamic Material Instance"를 생성하게 된다.
- "Parameter Name" 부분은 Material에서 파라미터 부분에서 설정한 이름과 똑같아야 작동한다. (물론 텍스를 한다면, 노드를 "Set Texture Parameter Value"로 해야된다."
예제 테스트 2
- 블루프린트 빈 공간 우클릭 → "Add timeline" 입력하여 타임라인 노드 추가
- 생성한 타임라인 노드를 더블클릭하면, 타임라인을 편집할 수 있는 탭으로 이동하게 된다.
- "+트랙" 버튼 → "Float 트랙 추가", "길이" 부분은 적당히 입력 (초단위), 오른쪽 루프 버튼을 클릭하여 활성화
- 그래프 부분을 우클릭하여 "CurveFloat_0에 키 추가"를 클릭하면, 점이 찍힌다.
- 아래 사진과 같이 노드를 설정한 후, 실행하면 구체의 색상이 시간 마다 적절히 바뀌게 된다.
주의
UMaterialInstanceDynamic은 C++ 생성자에서 생성하면 안된다.
- 해결방법 : C++ 코드 생성자 이외 다른 함수에서 생성
- 함수 예시 1 : 해결방법은 Blueprint의 "Construct Script" 쪽에서 생성(Blueprint의 생성자는 C++ 생성자보다 늦게 호출된다.)
- 함수 예시 2 : C++ 코드에서 "PostActorCreated" 함수에서 생성
- 생성 예시 1 : 생성자에서 ConstructorHelpers::FObjectFinder 함수로 찾은 UMaterialInstance를 전역변수에 저장한 후, 다른 함수에서 전역변수를 이용하여 UMaterialInstanceDynamic을 생성 (포럼 참고 링크)
- 생성 예시 2 : (생성자 이외에) 다른 함수에서 LoadObject 함수를 사용 (포럼 참고 링크)
참고
- 참고 1 : https://www.versluis.com/2020/09/change-material-colour-ue4/
- 참고 2 : https://forums.unrealengine.com/t/how-to-get-a-materials-base-color-parameter-from-a-static-mesh/471973?u=kesio20
- 참고 3 : https://www.youtube.com/watch?v=uvJYKCVnr0M
- 참고 4 : https://forums.unrealengine.com/t/how-do-i-get-the-rgb-value-of-a-mesh-at-runtime/448367/3?u=kesio20
댓글
댓글 쓰기