CollisionSimulator

여러가지 충돌 검사 기능을 제공합니다.

# Methods

[{"index":"Component Overlap(CollisionGroup collisionGroup, Shape shape)","0":"입력한 모양과 겹치는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"Component Overlap(string collisionGroupName, Shape shape)","0":"입력한 모양과 겹치는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"Component Overlap(table groups, Shape shape)","0":"입력한 모양과 겹치는 첫 번째 컴포넌트를 찾아 반환합니다. groups는 CollisionGroups의 요소로 이루어진 순차 테이블입니다."}]

[{"index":"table OverlapAll(CollisionGroup collisionGroup, Shape shape)","0":"입력한 모양과 겹치는 모든 컴포넌트를 찾아 반환합니다."}]

[{"index":"table OverlapAll(string collisionGroupName, Shape shape)","0":"입력한 모양과 겹치는 모든 컴포넌트를 찾아 반환합니다."}]

[{"index":"table OverlapAll(table groups, Shape shape)","0":"입력한 모양과 겹치는 모든 컴포넌트를 찾아 반환합니다. groups는 CollisionGroups의 요소들로 이루어진 순차 테이블입니다."}]

[{"index":"int32 OverlapAllFast(CollisionGroup collisionGroup, Shape shape, table outputList)","0":"입력한 모양과 겹치는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"int32 OverlapAllFast(string collisionGroupName, Shape shape, table outputList)","0":"입력한 모양과 겹치는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"int32 OverlapAllFast(table groups, Shape shape, table outputList)","0":"입력한 모양과 겹치는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다. groups는 CollisionGroups의 요소들로 이루어진 순차 테이블입니다."}]

[{"index":"Component OverlapBox(string collisionGroupName, Vector2 position, Vector2 size, float angle)","0":"입력한 직사각형 충돌체와 겹치는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"table OverlapBoxAll(string collisionGroupName, Vector2 position, Vector2 size, float angle)","0":"입력한 직사각형 충돌체와 겹치는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"int32 OverlapBoxAllFast(string collisionGroupName, Vector2 position, Vector2 size, float angle, table outputList)","0":"입력한 직사각형 충돌체와 겹치는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"Component OverlapCircle(string collisionGroupName, Vector2 position, float radius)","0":"입력한 원형 충돌체와 겹치는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"table OverlapCircleAll(string collisionGroupName, Vector2 position, float radius)","0":"입력한 원형 충돌체와 겹치는 모든 컴포넌트를 찾아 반환합니다."}]

[{"index":"int32 OverlapCircleAllFast(string collisionGroupName, Vector2 position, float radius, table outputList)","0":"입력한 원형 충돌체와 겹치는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"table OverlapLineAll(string collisionGroupName, Vector2 point1, Vector2 point2)","0":"입력한 선과 겹치는 모든 컴포넌트를 찾아 반환합니다."}]

[{"index":"int32 OverlapLineAllFast(string collisionGroupName, Vector2 point1, Vector2 point2, table outputList)","0":"입력한 선과 겹치는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"Component OverlapPoint(CollisionGroup collisionGroup, Vector2 point)","0":"입력한 점을 포함하는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"Component OverlapPoint(string collisionGroupName, Vector2 point)","0":"입력한 점을 포함하는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"Component OverlapPoint(table groups, Vector2 point)","0":"입력한 점을 포함하는 첫 번째 컴포넌트를 찾아 반환합니다. groups는 CollisionGroups의 요소들로 이루어진 순차 테이블입니다."}]

[{"index":"table OverlapPointAll(CollisionGroup collisionGroup, Vector2 point)","0":"입력한 점을 포함하는 모든 컴포넌트를 찾아 반환합니다."}]

[{"index":"table OverlapPointAll(string collisionGroupName, Vector2 point)","0":"입력한 점을 포함하는 모든 컴포넌트를 찾아 반환합니다."}]

[{"index":"table OverlapPointAll(table groups, Vector2 point)","0":"입력한 점을 포함하는 모든 컴포넌트를 찾아 반환합니다. groups는 CollisionGroups의 요소들로 이루어진 순차 테이블입니다."}]

[{"index":"int32 OverlapPointAllFast(CollisionGroup collisionGroup, Vector2 point, table outputList)","0":"입력한 점을 포함하는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"int32 OverlapPointAllFast(string collisionGroupName, Vector2 point, table outputList)","0":"입력한 점을 포함하는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다."}]

[{"index":"int32 OverlapPointAllFast(table groups, Vector2 point, table outputList)","0":"입력한 점을 포함하는 모든 컴포넌트를 찾고, 그 결과를 outputList에 삽입합니다. 결과의 개수를 반환합니다. groups는 CollisionGroups의 요소들로 이루어진 순차 테이블입니다."}]

[{"index":"Component Raycast(CollisionGroup collisionGroup, Vector2 origin, Vector2 direction, float distance = 3.4028235E+38)","0":"origin 위치에서 direction 방향으로 distance 만큼 이동하는 광선을 쏘고, 이 광선과 충돌하는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"Component Raycast(string collisionGroupName, Vector2 origin, Vector2 direction, float distance = 3.4028235E+38)","0":"origin 위치에서 direction 방향으로 distance 만큼 이동하는 광선을 쏘고, 이 광선과 충돌하는 첫 번째 컴포넌트를 찾아 반환합니다."}]

[{"index":"Component Raycast(table groups, Vector2 origin, Vector2 direction, float distance = 3.4028235E+38)","0":"origin 위치에서 direction 방향으로 distance 만큼 이동하는 광선을 쏘고, 이 광선과 충돌하는 첫 번째 컴포넌트를 찾아 반환합니다. groups는 CollisionGroups의 요소들로 이루어진 순차 테이블입니다."}]

# Examples

#### OverlapAll

`TriggerComponent`를 가진 주변 Entity를 파괴하는 예제입니다. `TriggerComponent`의 `CollisionGroup`은 기본적으로 `TriggerBox`입니다.
    
    
    @Component
    script TriggerDestroyer extends Component
        @ExecSpace("ServerOnly")
        method void OnUpdate(number delta)
        local position = self.Entity.TransformComponent.WorldPosition:ToVector2()
        local circleShape = CircleShape(position, 3)
        local simulator = _CollisionService:GetSimulator(self.Entity)
    
        -- 반경 3 이내에 TriggerComponent를 가진 엔티티를 감지합니다.
        local overlaps = simulator:OverlapAll(CollisionGroups.TriggerBox, circleShape)
    
        for i, component in pairs(overlaps) do
        	if component.EnableInHierarchy == false then
        		continue
        	end
    
        	if component.Entity ~= self.Entity then
        		component.Entity:Destroy()
        	end
        end
        end
    end
    

#### OverlapAllFast

주변의 `TriggerComponent`를 가진 엔티티를 파괴하는 예제입니다. `OverlapAllFast()` 함수를 사용하면 테이블을 재사용할 수 있습니다.
    
    
    @Component
    script OverlapDestroyer extends Component
        property any CircleShape = nil
        property table Overlaps = {}
    
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        self.CircleShape = CircleShape(Vector2.zero, 3)
        self.Overlaps = {}
        end
    
        @ExecSpace("ServerOnly")
        method void OnUpdate(number delta)
        local position = self.Entity.TransformComponent.WorldPosition:ToVector2()
        self.CircleShape.Position = position
        local simulator = _CollisionService:GetSimulator(self.Entity)
    
        simulator:OverlapAllFast(CollisionGroups.TriggerBox, self.CircleShape, self.Overlaps)
    
        for i, component in pairs(self.Overlaps) do
        	if component.Entity ~= self.Entity then
        		component.Entity:Destroy()
        	end
        end
        end
    end
    

#### RayCast

화면을 터치하면 엔티티 중심에서 터치한 곳까지 `Raycast()`를 수행하고, 감지한 엔티티를 파괴하는 예제입니다.
    
    
    @Component
    script ScreenTouchDestroyer extends Component
        @ExecSpace("ServerOnly")
        method void RaycastAndDestroyEntity(Vector3 endPoint)
        local startPoint = self.Entity.TransformComponent.WorldPosition
        local diff = endPoint - startPoint
        local distance = diff:Magnitude()
        local direction = diff:Normalize():ToVector2()
        local origin = startPoint:ToVector2()
    
        local simulator = _CollisionService:GetSimulator(self.Entity)
        -- 엔티티의 CollisionGroup이 TriggerBox면 자기 자신이 감지될 수 있습니다.
        -- 플레이에 앞서 CollisionGroup을 적절하게 세팅해야 합니다.
        local component = simulator:Raycast(CollisionGroups.TriggerBox, origin, direction, distance)
    
        if component == nil then
        	return
        end
    
        if component.Entity ~= self.Entity then
        	component.Entity:Destroy()
        end
        end
    
        @EventSender("Service", "InputService")
        handler HandleScreenTouchEvent(ScreenTouchEvent event)
        --------------- Native Event Sender Info ----------------
        -- Sender: InputService
        -- Space: Client
        ---------------------------------------------------------
    
        -- Parameters
        local TouchId = event.TouchId
        local TouchPoint = event.TouchPoint
        ---------------------------------------------------------
    
        local endPoint = _UILogic:ScreenToWorldPosition(TouchPoint):ToVector3()
        self:RaycastAndDestroyEntity(endPoint)
        end
    end
    

# SeeAlso

  * TransformComponent
  * ScreenTouchEvent
  * CircleShape
  * CollisionGroup
  * Entity
  * CollisionService
  * InputService