
오늘의 코드카타
오늘의 공부
학습한 강의
- 상태 머신을 활용한 AI 행동 패턴 설계
(2) 애니메이션 블루프린트 세팅 (Movement 기반 변수 세팅 및 애님 그래프 설정)
(3) 애니메이션에 대응하는 효과음 디자인 (애님 노티파이 활용) 및 어테뉴에이션 세팅
- Unreal Engine의 Behavior Tree 기초 학습
(1) Behavior Tree를 설정할 AI Character, AI Controller 클래스 생성
(2) AI Controller와 비헤이비어 트리, 블랙보드 연결 - 기초적인 이동 로직 구현
(3) 상호작용 가능한 물체를 찾고, 상호작용하는 BTTask 작성 - AnimMontage에서 AnimNotify로 상호작용 실행
몰랐던 내용 정리
Attenuation 세팅
- Attenuation이란?
- 거리 등에 비례하여 소리의 크기가 달라지도록 디자인하는 기능
- Attenuation 모델
- 선형 (Linear)
- 정비례 감소 모델. 거리에 따란 볼륨이 선형적으로 감소
- 소리가 균일하게 멀어질 때 사용

- 로그 (Logarithmic)
- 빠르게 감소하다가 근원에서 멀어질수록 감소 속도가 줄어듦
- 더 현실감 있는 오디오 경험을 제공하고자 할 때 사용

- 인버스 (Inverse)
- 거리에 반비례하여 볼륨 감소
- 사운드가 넓게 퍼지는 효과를 모방할 때 사용

- 로그 리버스 (Log Reverse)
- 완만히 감소하다 특정 시점부터 급격히 감소함
- 사운드를 선명하게 유지하다가, 원거리에서 급격히 감소시키는 방식으로 제어할 때 사용

- 내추럴 사운드 (Natural Sound)
- 자연에서의 사운드 전파 방식을 최대한 모방한 모델
- 로그와 인버스의 중간 그래프
- 큰 공간에서의 오디오 디자인에 적합. 멀리서부터 가까워지거나 멀어지는 효과 연출시 유용

- 커스텀 (Custom)
- 사용자가 직접 감쇠 곡선을 디자인 할 수 있음
- 표준 모델로는 구현하기 어려운 사운드 효과를 만들어야 할 때 사용

- 사용법
- [Audio] - [Sound Attenuation]를 통해 블루프린트 에셋 생성
- Attenuation 설정에서 에셋 설정
- 이외에도 다양한 기능 있음
- 주의사항
- 범위 밖에서 범위 안으로 들어오면 들리지 않게 됨
-> 처음에 들을 수 있는 액터를 지정해서 사운드를 들을 수 있게 하기 때문임
-> 이를 해결하기 위해서는 Meta Sound를 사용해야 함
오늘의 CS
TSet
- C++ 표준 라이브러리(
std::unordered_set)에 해당하는 언리얼 엔진의 컨테이너
- 특징
- 해시 테이블 기반 : 내부적으로 해시 테이블 구조를 사용하여 구현됨
- 고유성 :
TSet에 저장되는 요소는 모두 고유함
- 시간 복잡도 : 삽입, 삭제, 탐색이 모두 평균
O(1)의 시간 복잡도를 가짐
- 비정렬 : 요소가 해시 값에 따라 저장되어, 키 순서대로 정렬되어 있지 않음

- 언리얼 엔진의 컨테이너이기 때문에 언리얼 엔진의 기능들을 제공함
- 직렬화 및 저장/로드 : 직렬화 기능 및 자동으로 저장 및 로드가 가능
- 가비지 컬렉션 지원 : UObject 파생 클래스 포인터를 저장하면 GC 시스템에 노출하여 추적 가능
- 리플렉션 시스템 통합 : 에디터 수정, 블루프린트 노출
- 내부적으로
TSparseArray와 버킷 배열(TArray<int32>)를 통해 구현되어 있음
TSparseArray는 실제로 데이터를 저장하는 저장소 (물리적인 저장소)
- 버킷 배열(
TArray<int32>)은 정수 인덱스를 통해 저장된 실제 데이터에 접근하게 해주는 논리적인 인덱스 저장소
- 위와 같이 분리하는 이유는 버킷 배열에 큰 데이터가 아닌 작은 인덱스만 저장하게 되어 효율적
- 버킷 배열을 재할당해야 할 때, 데이터는 이동하지 않고 인덱스만 새로 계산을 하면 되기 때문에 매우 효율적

- 해시 충돌 처리는 인덱스 기반 체이닝을 통해 관리됨
TSparseArray를 통해 TSetElement가 관리되는데 여기서 HashNextId를 통해 다음 인덱스를 체이닝하는 방식을 취하고 있음
- LIFO 방식으로 최근에 추가된 것이 가장 처음에 연결되도록 함

TSparseArray
- 언리얼 엔진에서
TArray의 메모리 연속성과 TSet/TMap의 빠른 제거 성능을 결합하기 위해 설계된 특수한 동적 배열
- 특징
- 메모리 연속성 :
TArray와 동일하게 연속적 (단, 데이터 사이에 구멍이 있을 수 있음)
- 요소 제거 시 : 제거된 위치를 빈 슬롯으로 표시하고 이동 없음
- 시간 복잡도 : 요소를 제거할 때 데이터를 이동시키지 않고, 해당 인덱스를 재활용 가능한 슬롯으로 표시하기 때문에
O(1)의 시간복잡도를 가지게 됨
- TSet이 TSparseArray를 사용하는 이유
- 캐시 효율성 확보
- 비록 빈 구멍이 있을 수 있더라도, 데이터는 여전히 연속적인 메모리 블록에 저장됨
- 메모리 지역성이 더 뛰어나져서 CPU 캐시 효율성이 올라감
- 제거 성능 확보
TSet이 TArray를 사용했다면, 요소 제거 시 배열의 요소를 이동시키는 O(N)의 비용이 발생함
TSparseArray를 사용하면 빈 슬롯을 표시만 하기 때문에, 평균 O(1)의 성능을 유지함
- 내부적으로
TArray와 TBitArray를 통해 구현되어 있음
TArray : 실제 데이터 저장소
TBitArray : 유효한 데이터가 저장되어 있는지 검사하는 유효성 플래그
