🎮Unreal4/C++

[UE4] Material 가져오기, Material Color 변경, Timer 설정 (StaticFindObject, Cast<>, Kismet System Library, MakeRandomColor)

공대 컴린이 2023. 2. 27. 17:05
728x90

🚩 Material

이렇게 불러온 Mesh에 Material을 생성해 입혀보기 위해 Material Instance Dynamic 자료형을 선언하여 호출하였다.

 

Material도 CHelpers 클래스에 템플릿화하여 작성하였다. 

 

이전에 Mesh를 생성할 때는 ConstructorHelpers 클래스를 이용하여 ObjectFinder 함수를 사용했는데, Material은 동적으로 초기화되기 때문에 Constuctor 클래스를 사용하지 못한다. 말 그대로 ConstructorHelpers 클래스는 "초기화" 클래스이므로 생성자에서만 사용이 가능하기 때문이다.

 

따라서 동적 오브젝트 생성을 위해 StaticFindObject 함수를 사용하였다. Static이라는 키워드를 사용하여 한번만 호출한 뒤 계속해서 동적으로 사용한다.

 

StaticFindObject 함수의 첫번째 매개변수인 UClass는 Class 타입을 전달해주면 된다. UObject로부터 상속받은 모든 클래스들은 Static Class라는 함수를 가지고 있다. (구조체도 마찬가지로 Static Struct를 가짐)

따라서 Material의 UClass를 가져오기 위해 UMaterialInstanceConstant::StaticClass() 를 호출하면 자기자신의 UClass를 반환해준다.

 

또한 StaticFindObject는 반환값이 UObject 인 최상위 객체이다. 따라서 UObject 객체로 미리 받아두고, 내가 생성하고자 하는 Material 자료형 타입으로 캐스팅하여 다시 사용한다.

이때 캐스팅은 Cast< > 명령어를 사용하고, 이는 블루프린트에서 ~~형변환 노드와 동일한 기능을 구현한다.

 

위와 같은 내용들을 CHelpers 클래스에 템플릿을 이용하여 구현해놓았다.

 

이렇게 에셋에서 Material을 Dynamic으로 가져왔다면 UMaterialInstanceDynamic 클래스의 Create 함수를 통해 객체에 적용할 Material을 초기화 해 주었다.

🚩 Material Color 변경

Material을 성공적으로 만들고 난 뒤에는 Set Timer를 이용해 주기적으로 Material의 색상이 변경하도록 만들어보았다.

 

블루프린트에서 Set Timer 노드를 보면 타깃이 Kismet System Library로 나와있다. 따라서 해당 함수를 C++클래스에서 사용하려면 헤더파일로 Kismet을 추가해줘야 한다. 

 

이때 블루프린트에서 함수들을 확인할 때 타깃이 핀으로 노출되어 있지 않은 함수들은 거의 전역함수라고 보면 된다. (Set Timer 함수도 타깃이 노출되어있지 않고, Kismet이라고 되어있으므로 전역함수이다)

 

Set Timer에 설정할 색상변경 함수로 Set Random Color 함수를 작성하였다.

초기화해둔 Material의 SetVectorParameterValue 함수를 통해 Color값을 변경해주었는데, 이때 FLinearColor의 MakeRandomColor 함수를 이용하면 랜덤색상이 만들어져 반환된다.

 

결과적으로 성공적인 Material의 랜덤 색상 변경 기능이 구현되었다.

 

728x90