기본 콘텐츠로 건너뛰기

[UE] Texture (Material) 색상이나 변수 값을 런타임(실시간)에 변경

    목차

Unreal에서는 Material (Texture)를 실시간에서는 잘 제어가 잘 되지 않는다.

제어하고 싶은 Material을 Source Material로 하는 "Dynamic Material Instance" (UMaterialInstanceDynamic)을 런타임에서 생성. 생성한 "Dynamic Material Instance" 를 이용하여 변수 값을 바꾸어야한다.


Test engine version : 5.3.2

예제 테스트 1


  1. 콘텐츠 브라우저 빈 공간을 우클릭하여 "머티리얼"을 하나 생성한다.
  2. 적절히 이름을 바꾸고 더블클릭하여 블루프린트를 띄운다.
  3. 아래와 같이 원하는 변수를 생성하여 "베이스 컬러" 부분에 연결한다.
    1. (아래 사진은 가능한거 아무거나 생성한 것임)
    2. 빈공간에 우클릭을 한 후, "Constant3Vector, Constant4Vector 또는 TextureSampleParameter2D" 을 선택한다.
    3. ConstantVector로 생성한 노드를 우클릭한 후, "파라미터로 변환"을 클릭한다.
       (텍스쳐의 경우 자동으로 "파라미터" 부분에 추가된다.)





    4. "모두 저장"
    5. 아래 사진과 같이 "머티리얼 인스턴스 생성" 버튼을 이용하여 머티리얼 인스턴스를 생성하여 활용해도 된다.




  4. 콘텐츠 브라우저 빈 공간에 우클릭하여 "블루프린트" → "블루프린트 클래스"를 생성한 후, 더블 클릭하여 블루프린트를 연다.
  5. "컴포넌트" 하단에 "+추가" 버튼을 누른 후, "스피어" 버튼을 누른다. (빈 구체 하나가 추가될 것이다.)
  6. "컴포넌트" 부분에서 생성한 "Sphere"를 선택하면, "디테일" → "머티리얼" → "엘리먼트 0" 부분이 보이게 될 것인데, 이 부분을 위에서 만든 머티리얼로 교체한다.




  7. "이벤트 그래프" 부분에서 아래 사진과 같이 노드를 생성한 후, 실행을 하면 구체가 설정한 색상으로 바뀌게 된다.
    1. "Create Dynamic Material Instance" 노드에서 "Source Material"을 설정하지 않으면, "target"에 설정되어 있는 Material을 이용하여 "Dynamic Material Instance"를 생성하게 된다.
    2. "Parameter Name" 부분은 Material에서 파라미터 부분에서 설정한 이름과 똑같아야 작동한다. (물론 텍스를 한다면, 노드를 "Set Texture Parameter Value"로 해야된다."




예제 테스트 2

  1. 블루프린트 빈 공간 우클릭 → "Add timeline" 입력하여 타임라인 노드 추가


  2. 생성한 타임라인 노드를 더블클릭하면, 타임라인을 편집할 수 있는 탭으로 이동하게 된다.
  3. "+트랙" 버튼 → "Float 트랙 추가", "길이" 부분은 적당히 입력 (초단위), 오른쪽 루프 버튼을 클릭하여 활성화
  4. 그래프 부분을 우클릭하여 "CurveFloat_0에 키 추가"를 클릭하면, 점이 찍힌다.


  5. 아래 사진과 같이 노드를 설정한 후, 실행하면 구체의 색상이 시간 마다 적절히 바뀌게 된다.







주의


UMaterialInstanceDynamic은 C++ 생성자에서 생성하면 안된다. 

  • 해결방법 : C++ 코드 생성자 이외 다른 함수에서 생성
    • 함수 예시 1 : 해결방법은 Blueprint의 "Construct Script" 쪽에서 생성(Blueprint의 생성자는 C++ 생성자보다 늦게 호출된다.)
    • 함수 예시 2 : C++ 코드에서 "PostActorCreated" 함수에서 생성
  • 생성 예시 1 : 생성자에서 ConstructorHelpers::FObjectFinder 함수로 찾은 UMaterialInstance를 전역변수에 저장한 후, 다른 함수에서  전역변수를 이용하여 UMaterialInstanceDynamic을 생성 (포럼 참고 링크)
  • 생성 예시 2 : (생성자 이외에) 다른 함수에서 LoadObject 함수를 사용 (포럼 참고 링크)

참고







댓글