TIL_092 : Object/Trace Channel, TArray 최적화

김펭귄·2026년 1월 8일

Today What I Learned (TIL)

목록 보기
92/104

1. Collision Preset 생성

  • 새로운 Interaction Collision Sphere를 만들거나, Vision Component로 다른 액터의 Visible 여부를 확인하고 싶을 때, 기존에 존재하던 Collision Preset만 이용해서는 한계가 있었다

  • 기존 Preset을 사용하는 것보다 Custom하게 만들어서 사용하는 것이 다른 사람들의 작업에도 영향을 안 줘 좋다

1.1. Obejct/Trace Channels

  • Project Setting에서 Object/Trace Channel 생성 가능
    Default Response는 다른 Channel과 콜리젼을 어떻게 할 건지(Ignore, Overlap, Block)

  • Object Channels : 캡슐, 메시 등 오브젝트가 어떤 종류인지를 나타내는 타입
    Object Type과 동일한 개념

  • Trace Channels : 라인트레이싱, SweepTrace 같이 Trace를 할 때 뭘로 쏠건지에 대한 채널

  • 그리고 밑에 Preset들을 더블클릭해서 해당 타입에 대한 Collision을 다 알맞게 수정해주어야 함
    NoCollision Preset은 Ignore로 해주고, OverlapAll은 Overlap으로 해주고, 다른 Preset들도 보면서 내 Object Channel에 맞게 설정해주기

1.1. Preset

  • Preset 역시 Custom하게 생성 가능

  • Collision Enabled : Query, Physics 설정을 통해 물리효과를 일으킬 건지, 물리효과 없이 이벤트만 발생시킬 건지 등을 서정

  • Object Type : 해당 Preset을 사용하는 Object의 Object Channel. 해당 오브젝트는 이 타입을 가지고 다른 Object/Trace Channel과 반응하게 된다

1.2. DefaultEngine.ini

  • 이렇게 생성/수정한 Collision들은 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 CarECC_GameTraceChannel1로 코드에서 사용 가능

  • 하지만 가시성이 없기에, 프로젝트.h파일에서 이름을 지정해줌

// Tarcopy.h

#define ECC_Car ECollisionChannel::ECC_GameTraceChannel1

1.3. 트레이스

  • 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);
  • Channel 트레이스는 해당 채널과 반응하는 물체를 감지, ObjectType 트레이스는 해당 타입을 감지

2. TArray 최적화

2.1. 메모리 미리 확보

  • Reserve를 통해 메모리를 미리 확보하여, 최적화

  • 요소가 늘어나면서 추가 메모리가 필요하게 되면, 새 메모리를 할당받고, 복사해야하는 비용이 발생하기 때문

2.2. 요소 제거

  • 가운데 요소를 제거하면, 그 이후의 요소를 앞으로 당기는 비용이 발생함

  • 또한, 요소가 줄어드면 더 작은 메모리만 사용하게 하기 위해, 또 다른 작은 메모리를 할당받고 거기로 복사시켜 이동함

  • 이러한 오버헤드를 제거하기 위해, 중간 요소를 마지막 요소와 바꾸고 제거하는 방식으로, 나머지 요소들을 앞으로 당겨야하는 작업을 없앰

// 초기 배열:
// 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

2.3. 추가적인 최적화 방법

참조 링크

profile
반갑습니다

0개의 댓글