충돌 그룹 만들기

# 학습 과정 소개

충돌 그룹을 만들고, 엔티티끼리의 충돌 여부를 설정하는 방법을 알아봅시다. 충돌 그룹을 사용해 특정 그룹끼리만 충돌할 수 있거나, 충돌을 무시할 수 있게 만들 수 있습니다.

# 충돌 그룹 기능

충돌 그룹은 메이플스토리 월드에 있는 여러 가지 충돌체를 특정 그룹 단위로 묶고, 그룹 간에 충돌 발생을 제어할 수 있는 기능입니다. 기본 충돌 그룹은 Default, TriggerBox, HitBox가 있으며 크리에이터가 만든 충돌 그룹을 포함해 최대 15개까지 만들 수 있습니다.

  * Default : 충돌 그룹을 지정할 때 기본으로 지정되는 그룹, 충돌 그룹을 찾을 수 없을 때 Default로 지정됩니다.
  * TriggerBox : TriggerComponent에 기본으로 지정되는 충돌 그룹
  * HitBox : HitComponent에 기본으로 지정되는 충돌 그룹



충돌 그룹을 사용하면, 스크립트마다 충돌을 감지하는 컴포넌트를 사용해 충돌 감지 조건을 작성하지 않아도 되므로 최적화된 월드를 만드는 데 도움이 됩니다.

[png](16587411005021f66cd226b1743c290d9e27eadfba017)

만약 TriggerEnterEvent을 활용해 플레이어가 아이템을 주울 수 있게 하려면 아래와 같은 조건을 작성해야 합니다. 하지만 충돌 그룹을 활용하면 아래의 조건을 작성할 필요가 없습니다. 엔티티마다 다른 충돌 그룹을 지정하고 두 그룹끼리만 충돌하도록 설정하면 되기 때문입니다.
    
    
    @Component
    script PlayerTriggerFilter extends Component
        @ExecSpace("ServerOnly")
        @EventSender("Self")
        handler HandleTriggerEnterEvent(TriggerEnterEvent event)
        -- Parameters
        local TriggerBodyEntity = event.TriggerBodyEntity
        --------------------------------------------------------
        if not TriggerBodyEntity.PlayerComponent then
            return
        end
        end
    end
    

또한, 원하는 그룹끼리만 충돌할 수 있는 특성을 활용해 물리 시스템에 충돌 그룹을 적용할 수 있습니다. 물리에 대한 자세한 내용은 [물리 적용하기](/docs?postId=757)를 참고하세요.

#### 충돌체

충돌체(Collider)는 엔티티가 충돌을 발생시키기 위해 필요합니다. 충돌체는 원형(Circle), 사각형(Box) 형태를 사용할 수 있습니다. 크리에이터가 생성한 엔티티에 충돌체 크기와 오프셋 위치를 조정할 수 있습니다. 자세한 내용은 [엔티티의 충돌](/docs/?postId=175)을 참고하세요.

[png](1658731042366f8819537a3d742f99d669f5070219681)

#### 충돌 그룹 생성, 삭제

  1. Panels - Collision Groups를 선택합니다. [png](165879872581169fd5a2cac2641078636ce0eb587c817)   

  2. [Add Collision Group] 버튼을 눌러 새로운 충돌 그룹을 생성하고, 이름을 변경합니다. [png](16584743118836fa224b41e3445d79cdc7f15cf2a3886)   

  3. 오른쪽의 [-] 버튼을 클릭하여 충돌 그룹을 삭제할 수 있습니다.



#### 충돌 그룹 지정하기

충돌을 발생시키거나, 감지하는 컴포넌트마다 충돌 그룹을 지정할 수 있습니다. 대표적으로 TriggerComponent, HitComponent, PhysicsColliderComponent에서 충돌 그룹을 사용합니다. 이 중 HitComponent에서 충돌 그룹을 지정하는 방법을 살펴봅시다.

  1. 충돌 그룹을 설정할 엔티티에 HitComponent 혹은 확장한 HitComponent를 추가합니다.
  2. CollisionGroup 프로퍼티에서 충돌 그룹을 지정합니다.   
[png](16644408634092cedbdbd0396471b85eb4a2b71e7547c)



> Tip. CollisionGroup 옆  [패널 열기] 버튼을 눌러 CollisionGroup 패널을 열 수 있습니다.

#### 충돌 그룹 매트릭스

충돌 그룹 매트릭스(Matrix)는 충돌 그룹끼리의 충돌을 허용할지 말지를 결정할 때 사용합니다. 충돌 그룹을 생성하면 매트릭스에 자동으로 새로운 충돌 그룹이 생성됩니다. 충돌 그룹끼리의 충돌 허용 여부는 체크 박스를 선택해서 간단하게 설정할 수 있습니다. 매트릭스에 적힌 충돌 그룹끼리의 관계를 확인하고 충돌을 허용하고 싶다면 체크 박스를 [png](checkbox) 활성화합니다.

  1. Panels - Collision Groups - Matrix를 선택합니다.  
[png](1658474513854b268965254e847a4933ae4b9a65b9c19)
  2. 가로 세로의 그룹명을 확인한 뒤 충돌을 허용하면 체크 박스를 [png](checkbox) 활성화합니다.



# 활용 예제

플레이어 캐릭터는 떨어진 동전과 충돌할 수 있지만, 몬스터는 충돌할 수 없는 상황을 만들어 봅시다.

[gif](165872039921972bcfdc780bd46d3858e48a54e7f080c)

> Tip. 예제에 설명되지 않은 Player와 Monster의 공격과 피격 구현은 만들기 - 새로 만들기 - 기본에서 확인할 수 있습니다. [png](1663811465383f02d22699b7c4a378f4de49425cc96ec)

  1. 새로운 충돌 그룹 Player, Monster, Item을 생성하고, 아래처럼 매트릭스를 설정합니다. [png](1658799000407ba127c7e1c444484b8b1c91e8a0892cf)

  2. DefaultPlayer에서 TriggerComponent와 PlayerHit의 CollisionGroup을 Player로 지정합니다. [png](16587303515703643b6e021f0420084a25b41f08825ea)

  3. Preset List - Monster에서 원하는 모델을 선택하고 콘텍스트 메뉴를 열어 Add to Workspace를 누릅니다.

  4. 선택한 Monster 모델에서 TriggerComponent, HitComponent의 CollisionGroup을 Monster로 변경합니다. [png](16587300227457fa8146e6bd3466bb179b865a3a40ca1)

  5. Coin 모델에 TriggerComponent를 추가하고 CollisionGroup을 Item으로 지정합니다. [png](165873019590583fa187d2e8a4b6ba01551f193284baf)

  6. 새로운 스크립트 컴포넌트인 ItemComponent를 생성하고 Coin 모델에 추가합니다. 아래처럼 PlayerComponent와 부딪혔을 때만 코인이 사라질 수 있도록 작성합니다.
         
         @Component
         script AutoDestroyTrigger extends Component
         @ExecSpace("ServerOnly")
         @EventSender("Self")
         handler HandleTriggerEnterEvent(TriggerEnterEvent event)
         -- Parameters
         local TriggerBodyEntity = event.TriggerBodyEntity
         --------------------------------------------------------
         self.Entity:Destroy()
         end
         end