엔티티의 충돌

# 학습 과정 소개

충돌 이벤트와 충돌 처리 방법에 대해 알아봅시다.

##### 참고 가이드

 

# 충돌

충돌이란 충돌체를 포함하는 엔티티'의 충돌 영역이 서로 교차하는 것을 말합니다. 엔티티에 [TriggerComponent](/apiReference/Components/TriggerComponent)나 [HitComponent](/apiReference/Components/HitComponent)를 추가하면 충돌체가 자동 생성됩니다. [png](16353017504515017d335b5e44a63aff4b6c8e8019ea6)

# 충돌체 편집

충돌체의 크기, 위치, 형태 같은 속성들은 충돌체를 제어할 수 있는 컴포넌트들의 프로퍼티로써 편집할 수 있습니다. 대표적으로 [TriggerComponent](/apiReference/Components/TriggerComponent)와 [HitComponent](/apiReference/Components/HitComponent)입니다. TriggerComponent는 충돌 범위를 설정할 때 충돌체를 사용하며, HitComponent는 피격 범위를 설정할 때 충돌체를 사용합니다.

#### 편집 활성화

프로퍼티 에디터에서 [Edit] 버튼을 눌러 편집을 활성화 할 수 있습니다. 활성화되면 충돌 영역 색상이 초록색으로 변경됩니다.

[{"충돌체 편집 비활성화":"[png](1647419996497c2317d38c37c4266a041e44a7962be00)","충돌체 편집 활성화":"[png](16474200145049bb170d059a94a9ebe454f0c79ede8e6)"},{"충돌체 편집 비활성화":"[png](1650933070591cc3f53205067484db1c6e758a07eda52)","충돌체 편집 활성화":"[png](1650933106203672a48645eb14948b2f02f2b115be9ff)"}]

#### 크기 편집

편집이 활성화되면 포인트를 잡아당겨 원하는 크기로 편집할 수 있습니다. [png](1647420159680d2bd972d40cd407cbacb51c32f411bdd)

#### 오프셋 편집

충돌체의 포인트를 드래그해 ColliderOffset을 설정할 수 있습니다. [png](1647420135543c8ede53b0cf54ae9bb8ab318c12134e9)

# ColliderType

충돌체의 형태는 Box, Circle, Polygon 세 가지가 있습니다.

#### Box

충돌체를 사각형 형태로 설정합니다. X는 가로 크기, Y는 세로 크기입니다. [png](16751561869387728a07df928485bafa17874b7bedb30)

#### Circle

충돌체를 원 형태로 설정합니다 CircleRadius은 반지름 값입니다. CircleRadius 값으로 원의 크기를 설정할 수 있습니다. [png](1675156219035249c8c3667a646f8bfbc7b128c1fe38d)

#### Polygon

충돌체를 다각형으로 설정합니다. PolygonPoint를 필요한만큼 추가해 크리에이터가 원하는 충돌체 모양을 만들 수 있습니다. [png](16792881867493ee65f9122fe47dfbb775527e2ea19ff)

# TransformComponent와 충돌체

충돌체는 TransformComponent의 Scale, Rotation 값에 영향을 받습니다.

  * Scale 값만큼 엔티티 크기가 바뀌면 충돌체 크기도 바뀝니다.
  * Rotation 값만큼 엔티티가 회전하면 충돌체도 회전합니다.



아래는 엔티티가 충돌을 감지했을 때 노란색으로 변화되는 예시입니다. Transform의 Scale, Rotation 값이 변경되어 다른 엔티티와 충돌할 때마다 노란색으로 바뀝니다.

Transform.Scale 변화 예시 $$youtube 4Ri0CpWg6RY $$

Transform.Rotation 변화 예시 $$youtube xox3H77CDNg $$

모든 엔티티는 계층구조로 구성되므로 확장된 엔티티의 TransformComponent는 항상 상위 엔티티의 TransformComponent에 영향을 받습니다. 이와 마찬가지로 충돌체도 상위 엔티티의 TransformComponent에 영향을 받습니다. 상위 엔티티가 만들고, 그 엔티티를 확장한 엔티티를 4개 만들어 어떤 영향을 받는지 살펴보겠습니다. 아래와 같이 상위 엔티티를 회전시키면 4개의 확장 엔티티도 회전하며 또 다른 엔티티와 충돌하는 것을 볼 수 있습니다. $$youtube j2ijQUSA3Qg $$

# 충돌 이벤트 이후 액션 추가

충돌 이벤트 이후 액션은 Entity Event System을 활용하거나, 확장된 TriggerComponent 활용합니다. 월드에 TriggerComponent를 포함하는 A와 B, 두 엔티티가 있다고 가정해 봅시다. A와 B가 부딪히면 충돌 이벤트가 발생합니다. 그러나 이후 특별한 변화가 일어나지 않을 것입니다. 충돌 이벤트 발생을 한 뒤 일어날 추가 액션이 없기 때문입니다. TriggerComponent를 활용하면 충돌 이벤트가 발생할 때 일어날 액션을 추가할 수 있습니다. 예를 들어 A와 B가 충돌하면 A와 B의 체력을 깎는다거나, A와 B 중 하나를 없앨 수도 있습니다.

[png](16577114595706becd45fb94840138cab4a6fe2e3fe39)

# Event System 활용

#### 구조

충돌 이벤트가 발생할 때 액션을 수행할 핸들러(또는 리스너)를 엔티티에 추가합니다. 이후 엔티티의 TriggerComponent에 충돌 이벤트가 발생하면 핸들러의 함수를 호출하는 구조입니다. 이 구조가 작동되려면 엔티티에 TriggerComponent와 스크립트 컴포넌트(리액터)를 추가해야 합니다. 예를 들어 A와 B 엔티티가 충돌할 때 A와 B의 HP를 깎고 싶다면, A와 B에 TriggerComponent와 스크립트 컴포넌트를 각각 추가해야 합니다. [png](16576992810031fa86f8de6174662a433379786472c6b)

#### 핸들러 추가

액션을 수행할 핸들러는 스크립트 컴포넌트(리액터)의 Event Handler로 추가할 수 있습니다. 스크립트 컴포넌트를 열고 Event Handler의 [+] 버튼을 눌러 핸들러를 추가합니다. [png](16371497834354f1e725c0f9b43adaf67a6a4a2d8f782)

검색창에 Trigger를 입력하면 다음과 같이 충돌 이벤트 핸들러가 검색됩니다. 수행할 액션의 목적에 맞는 핸들러를 선택합니다. 각 Event의 각 발생 시점을 참고해 필요한 Event를 적절하게 사용합니다.

  * TriggerEnterEvent: 엔티티가 처음 충돌할 때 1회 발생합니다.
  * TriggerStayEvent: 엔티티가 충돌 중이면, 프레임마다 발생합니다.
  * TriggerLeaveEvent: 엔티티가 충돌했다가 충돌이 끝날 때 1회 발생합니다.



[png](16371497944331ae1049930a9446d8f30d3edc24f8530)

#### 충돌 이벤트 센더 설정

핸들러를 선택하면 함수가 추가됩니다. 핸들러 상단에서 센더를 설정할 수 있습니다. [png](16371498027637a7ba3588b494f30a2dfca16bedba70e)

해당 스크립트 컴포넌트(리액터)를 포함하고 있는 엔티티의 충돌 이벤트를 받으려면 센더를 self로 설정합니다. 다른 엔티티의 충돌 이벤트를 받으려면 센더를 entity로 설정하고 원하는 엔티티를 지정합니다. [png](163714981203633674070dae14e1180ec0cc07e6c07ec)

#### 핸들러 구성

이벤트가 발생하면 핸들러가 호출되고, 매개 변수에 충돌 이벤트가 들어옵니다. 매개 변수에 들어온 이벤트에는 해당 이벤트가 발생한 엔티티와 충돌한 상대 엔티티 정보가 들어있습니다. [png](1637149819634e9577aefddb043fda7e86ea02bae286e)

# 확장 TriggerComponent 활용

#### 구조

TriggerComponent에는 엔티티에 충돌 이벤트가 발생했을 때 호출되는 자체 함수가 있습니다. 이 함수를 활용하여 엔티티 충돌 이벤트 이후의 액션을 추가할 수 있습니다. 하지만 TriggerComponent의 함수를 직접 편집할 수 없습니다. 그러므로 TriggerComponent를 확장한 컴포넌트에서 해당 함수를 편집해 충돌 처리를 추가해야 합니다. 확장된 컴포넌트는 원본 컴포넌트의 기능을 포함하고 있으므로, 엔티티에는 확장된 TriggerComponent만 추가하면 됩니다. [png](1657699624889b386c531319b425d99274f1b11566ce2)

#### TriggerComponent 확장하기

Workspace에서 TriggerComponent를 검색하여 선택합니다. 콘텍스트 메뉴에서 Extend를 선택하면 MyDesk 폴더에 TriggerComponent의 확장 컴포넌트가 생성됩니다. [png](1687754755702bcecc1f59a204f3ca931773a1849464d)

#### 함수 오버라이드

다른 스크립트 컴포넌트와는 달리, 확장된 TriggerComponent에는 몇 가지 함수를 오버라이딩할 수 있습니다. 이 함수들은 충돌 이벤트가 발생할 때 호출되는 것입니다. 이 함수를 추가하면 해당 함수의 정의부를 편집하여 오버라이딩할 수 있습니다. [png](1637149832831df2bfe1ef6384f3184ef8f84be296356)

오버라이딩할 수 있는 함수는 총 세 가지입니다. 다음은 함수별 호출 시점입니다.

  * OnEnterTriggerBody :엔티티 간 충돌이 처음 발생했을 때 1회 호출됩니다.
  * OnStayTriggerBody: 엔티티 간 충돌이 발생한 뒤, 두 엔티티가 겹쳐있는 동안 프레임마다 호출됩니다.
  * OnLeaveTriggerBody: 엔티티 간 충돌이 종료될 때 1회 호출됩니다.



#### 매개 변수

매개 변수에 충돌 이벤트가 들어옵니다. 이벤트에는 엔티티와 충돌한 상대 엔티티 정보가 포함되어 있습니다. [png](16371498432816cef0f0507714aac9e2f70d25fb3a5ea)