새로운 Interaction Collision Sphere를 만들거나, Vision Component로 다른 액터의 Visible 여부를 확인하고 싶을 때, 기존에 존재하던 Collision Preset만 이용해서는 한계가 있었다
기존 Preset을 사용하는 것보다 Custom하게 만들어서 사용하는 것이 다른 사람들의 작업에도 영향을 안 줘 좋다

Object Channels : 캡슐, 메시 등 오브젝트가 어떤 종류인지를 나타내는 타입
Object Type과 동일한 개념
Trace Channels : 라인트레이싱, SweepTrace 같이 Trace를 할 때 뭘로 쏠건지에 대한 채널
그리고 밑에 Preset들을 더블클릭해서 해당 타입에 대한 Collision을 다 알맞게 수정해주어야 함
NoCollision Preset은 Ignore로 해주고, OverlapAll은 Overlap으로 해주고, 다른 Preset들도 보면서 내 Object Channel에 맞게 설정해주기


Collision Enabled : Query, Physics 설정을 통해 물리효과를 일으킬 건지, 물리효과 없이 이벤트만 발생시킬 건지 등을 서정
Object Type : 해당 Preset을 사용하는 Object의 Object Channel. 해당 오브젝트는 이 타입을 가지고 다른 Object/Trace Channel과 반응하게 된다
config\DefaultEngine.ini파일에 저장됨// DefaultEngine.ini
-Profiles=(Name="NoCollision",CollisionEnabled=NoCollision,ObjectTypeName="WorldStatic",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="No collision",bCanModify=False)
+EditProfiles=(Name="OverlapAll",CustomResponses=((Channel="Enemy",Response=ECR_Overlap),(Channel="PlayerAttack",Response=ECR_Overlap),(Channel="Car",Response=ECR_Overlap),(Channel="EnemyAttack",Response=ECR_Overlap),(Channel="DeadEnemy",Response=ECR_Overlap)))
+EditProfiles=(Name="OverlapAllDynamic",CustomResponses=((Channel="Enemy",Response=ECR_Overlap),(Channel="PlayerAttack",Response=ECR_Overlap),(Channel="Car",Response=ECR_Overlap),(Channel="EnemyAttack",Response=ECR_Overlap),(Channel="DeadEnemy",Response=ECR_Overlap)))
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False,Name="Car")
-는 기존 프로필을 제거, +로 다시 추가
새롭게 추가한 Object Type Car는 ECC_GameTraceChannel1로 코드에서 사용 가능
하지만 가시성이 없기에, 프로젝트.h파일에서 이름을 지정해줌
// Tarcopy.h
#define ECC_Car ECollisionChannel::ECC_GameTraceChannel1
LineTraceSingleByChannel로 Channel을 쏠 때는, 해당 Channel로 다른 Object들과의 Hit를 감지하겠다는 것// Visibility 채널로 다른 오브젝트를 Hit 검사
LineTraceSingleByChannel(Hit, Start, End, ECC_Visibility, Params)
// 새로 생성한 Car라는 Object Channel로 다른 Object와 Hit 나는지를 검사
LineTraceSingleByChannel(Hit, Start, End, ECC_Car, Params)
LineTraceSingleByObjectType는 해당 오브젝트 타입을 감지하는 것.FCollisionObjectQueryParams ObjectQuery(ECC_Car); // Car 타입만
LineTraceSingleByObjectType(Hit, Start, End, ObjectQuery, Params);
Reserve를 통해 메모리를 미리 확보하여, 최적화
요소가 늘어나면서 추가 메모리가 필요하게 되면, 새 메모리를 할당받고, 복사해야하는 비용이 발생하기 때문
가운데 요소를 제거하면, 그 이후의 요소를 앞으로 당기는 비용이 발생함
또한, 요소가 줄어드면 더 작은 메모리만 사용하게 하기 위해, 또 다른 작은 메모리를 할당받고 거기로 복사시켜 이동함
이러한 오버헤드를 제거하기 위해, 중간 요소를 마지막 요소와 바꾸고 제거하는 방식으로, 나머지 요소들을 앞으로 당겨야하는 작업을 없앰
// 초기 배열:
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
// (인덱스 3 위치의 엘리먼트를 제거하고, 마지막 엘리먼트와 맞바꿀 수 있도록 합니다)
Array.RemoveAtSwap(3);
// 엘리먼트 제거중인 임시 상태
// 0, 1, 2, _, 4, 5, 6, 7, 8, 9
// 엘리먼트 9 와 기존 3 이 있던 자리를 맞바꿉니다.
// 0, 1, 2, 9, 4, 5, 6, 7, 8