HitComponent

엔티티의 충돌 영역을 설정하고, AttackComponent의 공격을 받았을 때 피격 동작을 구현할 수 있는 인터페이스를 제공합니다.

# Properties

[{"index":"Vector2 BoxOffset (Deprecated) (Sync)","0":"IsLegacy가 true인 이전 시스템에서 사용할 수 있습니다. 엔티티를 기준으로 충돌체 직사각형의 중심점 위치를 설정합니다."}]

[{"index":"Vector2 BoxSize (Sync)","0":"직사각형 충돌체의 너비와 높이를 지정합니다."}]

[{"index":"float CircleRadius (Sync)","0":"원형 충돌체의 반지름입니다. ColliderType이 Circle일 때 유효합니다."}]

[{"index":"string ColliderName (Deprecated) (ReadOnly) (HideFromInspector)","0":"더는 사용하지 않는 프로퍼티입니다. CollisionGroup을 사용하세요."}]

[{"index":"Vector2 ColliderOffset (Sync)","0":"Entity를 기준으로 충돌체의 중심점 위치를 설정합니다. IsLegacy가 false인 신규 시스템에서 사용할 수 있습니다."}]

[{"index":"ColliderType ColliderType (Sync)","0":"충돌체의 타입을 설정합니다. IsLegacy가 false인 신규 시스템에서 사용할 수 있습니다."}]

[{"index":"CollisionGroup CollisionGroup (Sync)","0":"충돌 그룹을 설정합니다."}]

[{"index":"boolean IsLegacy (ReadOnly)","0":"이 Component가 이전의 시스템으로 동작하는지 여부입니다. 신규 시스템은 충돌체가 TransformComponent의 회전과 크기의 적용을 받습니다. 또한 ColliderType을 설정해 원 모양 충돌체를 사용할 수 있습니다."}]

[{"index":"SyncList PolygonPoints (Sync)","0":"다각형 충돌체를 이루는 점들의 위치입니다. ColliderType이 Polygon일 때 유효합니다."}]

##### inherited from Component:

[{"index":"boolean Enable (Sync)","0":"컴포넌트 활성화 여부를 확인합니다."}]

[{"index":"boolean EnableInHierarchy (ReadOnly) (HideFromInspector)","0":"계층 구조상에서 이 컴포넌트가 Enable 상태인지를 반환합니다. Enable이 true일지라도 엔티티의 Enable이 false라면 false를 반환합니다."}]

[{"index":"Entity Entity (ReadOnly)","0":"이 컴포넌트를 소유한 엔티티입니다."}]

# Methods

[{"index":"boolean IsHitTarget(string attackInfo) (ScriptOverridable)","0":"엔티티가 AttackComponent의 공격을 받을지 말지 여부를 판단합니다. 기본 동작으로 true를 반환합니다.attackInfo는 AttackComponent로부터 전달된 사용자 정의 데이터입니다."}]

[{"index":"void OnHit(Entity attacker, integer damage, boolean isCritical, string attackInfo, int32 hitCount) (ScriptOverridable)","0":"엔티티가 피격되었을 때 호출됩니다. 기본 동작으로 HitEvent를 발생시킵니다.attacker는 공격한 Entity, attackInfo는 AttackComponent로부터 전달된 사용자 정의 데이터, hitCount는 대미지 분할 재생 횟수입니다."}]

##### inherited from Component:

[{"index":"boolean IsClient()","0":"현재 실행 환경이 클라이언트인지 아닌지의 여부를 반환합니다."}]

[{"index":"boolean IsServer()","0":"현재 실행 환경이 서버인지 아닌지의 여부를 반환합니다."}]

# Events

[{"index":"HitEvent","0":"엔티티가 피격되었을 때 발생하는 이벤트입니다."}]

# Examples

다음은 몬스터가 플레이어의 공격을 받을 때마다 `HitComponent`의 BoxSize를 남은 체력에 반비례하게 키우는 예제입니다.
    
    
    @Component
    script VulnerabilityScaler extends Component
        @Sync
        property number Health = 1000
        property number InitialHealth = 0
        property Vector2 InitialBoxSize = Vector2(0,0)
    
        @ExecSpace("ServerOnly")
        method void OnBeginPlay()
        self.InitialHealth = self.Health
        self.InitialBoxSize = self.Entity.HitComponent.BoxSize:Clone()
        end
    
        @ExecSpace("ServerOnly")
        @EventSender("Self")
        handler HandleHitEvent(HitEvent event)
        -- Parameters
        local AttackCenter = event.AttackCenter
        local AttackerEntity = event.AttackerEntity
        local Damages = event.Damages
        local Extra = event.Extra
        local FeedbackAction = event.FeedbackAction
        local IsCritical = event.IsCritical
        local TotalDamage = event.TotalDamage
        --------------------------------------------------------
    
        local hitComponent = self.Entity.HitComponent
    
        self.Health = self.Health - TotalDamage
        self.Health = math.max(self.Health, 0.0)
    
        if self.Health > 0.0 then
        	local ratio = 10 - ((10 - 1) / self.InitialHealth) * self.Health
        	hitComponent.BoxSize = self.InitialBoxSize * ratio
        else
        	_EntityService:Destroy(self.Entity)
        end
        end
    end
    

`HitComponent`를 확장해 피격 여부 판정과 피격 시 동작을 직접 구현할 수 있습니다. 다음은 기본 제공 스크립트인 PlayerHit 스크립트의 IsHitTarget 함수입니다. 피격 시 1초간 플레이어를 무적 상태로 만듭니다.
    
    
    @Component
    script HitImmunityManager extends Component
        property number ImmuneCooldown = 1
        property number LastHitTime = 0
    
        override method boolean IsHitTarget()
        local currentTime = _UtilLogic.ElapsedSeconds
        	if self.LastHitTime + self.ImmuneCooldown < currentTime then
        	self.LastHitTime = _UtilLogic.ElapsedSeconds
        return true
        end
    
        return false
        end
    end
    

# SeeAlso

  * AttackComponent
  * UtilLogic
  * EntityService
  * [공격과 피격](/docs?postId=206)