본문 바로가기

언리얼엔진

29. 맵(Map) / Create Dynamic Material Instance

언리얼에서의 변수 유형

- 단일변수

- 배열

- 세트(Set) : 특정 원소가 컨테이너 안에 있는지 없는지 검사를 위한 목적

- 맵(Map) 또는 딕셔너리 라고 부른다.


맵(Map)

맵 - 대응시킨다는 뜻으로 Key와 Value값이 서로 대응하는 관계라고 할 수 있다. Key값을 통해 Value에 접근하는 것이다.

 

C++ 에서의 Map은 RB(Red Black) Tree(자가균형 이진탐색트리)의 일종이다.

- 데이터를 절반씩 날리면서 찾기 때문에 빠르다.

 

언리얼에서의 Map은 (Hash)Map으로 되어있다.

- Hash - 잘게 다지다 라는 느낌으로, 특정 데이터를 해시하는 과정을 거쳐서 인티저 형태로 변형시킨다.

그렇게 변형시킨 Key값을 테이블에 저장한다. 그리고 해시한 Key값을 끼리 비교하여 데이터를 빠르게 찾을 수 있다.

따라서 Set / Map 둘 다 Hash를 사용하고 있다.

 

* Hash는 비가역적 연산으로, 한번 변형시키면 다시 원본 데이터로 되돌릴 수 없는 특징이 있다.

* 서로 다른 두 개의 데이터를 변형시킨 값이 같을 수도 있는데 이를 해시 충돌이라고 한다.


공격에 피격 시 Character가 깜빡이도록 효과 만들기

피격 시 캐릭터가 빨간색으로 순간 깜빡이는 효과를 만들어줄 것이다. 때문에 캐릭터의 Material을 건들여줄 것이다.

우리가 색을 바꿔줘야할 파라미터는 BodyColor이다.

하지만 머티리얼은 런타임중에 변경해줄 수 없기 때문에 다른 방법을 사용한다.

머티리얼 내부의 파라미터 중 BodyColor를 바꿀 것이다.


Create Dynamic Material Instance

프로그래밍에서의 Static은 컴파일 때, Dynamic은 런타임일 때를 말한다고 할 수 있다.

따라서 런타임 중에 바꿔줄 머티리얼을 만들기 위해 CreateDynamicMaterialInstance 함수를 사용해본다.

여기서 일반 함수와 Mesh에서 뽑아온 함수의 차이가 있다.

- CreateDynamicMaterialInstance(일반) : 그냥 인스턴스만 만들고 끝난다.

- CreateDynamicMaterialInstance (Mesh에서 뽑음) : 인스턴스를 만들고 그 자리를 대체해준다.

 

BeginPlay이벤트에서 로직을 구현해줄 것이다. 가로로 더 길어지는 것을 방지하기 위해서 이번에도 시퀀스 노드를 이용하여 Then 1 실행핀에 연결해주었다.

Mesh의 Materials를 가져와서 For Each Loop로 원소 갯수만큼 돌리면서 인스턴스를 만듬과 동시에 자리를 대체해준다.

 

*머티리얼을 대체하면서 기존에 있던 것들은 언리얼에서 자동으로 가비시컬렉션이 회수한다.

BP_Character의 이벤트그래프의 BeginPlay이벤트


Linear Color

이제 이렇게 만든 인스턴스를 통해 AnyDamage 이벤트 발생 시 색을 바꿔줄 것이다.

BodyColor라는 변수 하나를 추가해주면서, Linear Color라는 변수 유형을 적용시켜준다.

 

Linear(선형적인) Color는 0.0 ~ 1.0 float형으로 값을 받을 수 있고 선형적으로 색의 비율을 말해준다.

그냥 Color가 아닌 Linear Color


다음으로 Set Color 함수를 생성하여 이 함수를 통해 머티리얼의 색을 바꿔줄 것이다.

입력 값으로  Color만 추가해주고, 마찬가지로 Linear Color로 설정해줬다.

함수의 입력값

 

Mesh에서 Get Materials로 가져온 머티리얼 인스턴스는 머티리얼의 최상위 클래스라고 할 수 있다.

따라서 MaterialInstanceDynamic으로 형변환 시켜주고, Set Vector Parameter Value를 통해 BodyColor의 값을 바꿔준다.

Set Color 함수의 내부로직


BP_Character의 이벤트그래프 AnyDamage 이벤트 함수에서 시퀀스 Then 2 실행핀에 추가해줌

맞음과 동시에 Set Color 함수로 색을 바꿔주고, Delay를 통해 0.1초 뒤에 다시 원래 Enemy의 검은색으로 돌려줬다.