언리얼에서의 변수 유형
- 단일변수
- 배열
- 세트(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이다.
하지만 머티리얼은 런타임중에 변경해줄 수 없기 때문에 다른 방법을 사용한다.
Create Dynamic Material Instance
프로그래밍에서의 Static은 컴파일 때, Dynamic은 런타임일 때를 말한다고 할 수 있다.
따라서 런타임 중에 바꿔줄 머티리얼을 만들기 위해 CreateDynamicMaterialInstance 함수를 사용해본다.
여기서 일반 함수와 Mesh에서 뽑아온 함수의 차이가 있다.
- CreateDynamicMaterialInstance(일반) : 그냥 인스턴스만 만들고 끝난다.
- CreateDynamicMaterialInstance (Mesh에서 뽑음) : 인스턴스를 만들고 그 자리를 대체해준다.
BeginPlay이벤트에서 로직을 구현해줄 것이다. 가로로 더 길어지는 것을 방지하기 위해서 이번에도 시퀀스 노드를 이용하여 Then 1 실행핀에 연결해주었다.
Mesh의 Materials를 가져와서 For Each Loop로 원소 갯수만큼 돌리면서 인스턴스를 만듬과 동시에 자리를 대체해준다.
*머티리얼을 대체하면서 기존에 있던 것들은 언리얼에서 자동으로 가비시컬렉션이 회수한다.
Linear Color
이제 이렇게 만든 인스턴스를 통해 AnyDamage 이벤트 발생 시 색을 바꿔줄 것이다.
BodyColor라는 변수 하나를 추가해주면서, Linear Color라는 변수 유형을 적용시켜준다.
Linear(선형적인) Color는 0.0 ~ 1.0 float형으로 값을 받을 수 있고 선형적으로 색의 비율을 말해준다.
다음으로 Set Color 함수를 생성하여 이 함수를 통해 머티리얼의 색을 바꿔줄 것이다.
입력 값으로 Color만 추가해주고, 마찬가지로 Linear Color로 설정해줬다.
Mesh에서 Get Materials로 가져온 머티리얼 인스턴스는 머티리얼의 최상위 클래스라고 할 수 있다.
따라서 MaterialInstanceDynamic으로 형변환 시켜주고, Set Vector Parameter Value를 통해 BodyColor의 값을 바꿔준다.
맞음과 동시에 Set Color 함수로 색을 바꿔주고, Delay를 통해 0.1초 뒤에 다시 원래 Enemy의 검은색으로 돌려줬다.
'언리얼엔진' 카테고리의 다른 글
31. Dodging, 원거리 무기 충돌 수정 / 스킬 구현 (0) | 2023.06.18 |
---|---|
30. MatLayerBlend_Emissive / Delay 종류 / Time Dilation (0) | 2023.06.15 |
28. 세트 컨테이너 / 시퀀스 노드 / 공격 시 충돌 수정 (0) | 2023.06.13 |
27. 충돌판정 수정하기 / AnimNotifyState (2) | 2023.06.11 |
26. 콜리전 프리셋 / Object Type / Apply Damage / AnyDamage (1) | 2023.06.09 |