AttackComponent

HitComponent와 연동해 공격 기능을 구현할 수 있는 인터페이스를 제공합니다.

# Properties

##### 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":"table Attack(Shape shape, string attackInfo, CollisionGroup collisionGroup = nil)","0":"shape 영역 안에 있는 HitComponent의 OnHit(Entity, Integer, boolean, string, int32) 함수를 호출하고 HitEvent를 발생시킵니다. 공격 대상으로 판정된 HitComponent를 모두 반환합니다.attackInfo는 사용자 정의 데이터로 공격을 직접 구현할 때 크리에이터가 원하는 용도에 맞게 활용할 수있습니다. 활용 시 함수를 재정의해야 합니다."}]

[{"index":"table Attack(Vector2 size, Vector2 offset, string attackInfo, CollisionGroup collisionGroup = nil)","0":"사각형 영역을 지정할 수 있는 Attack 함수입니다. size는 사각형의 크기, offset은 엔티티 사각형의 중심 위치입니다."}]

[{"index":"void AttackFast(Shape shape, string attackInfo, CollisionGroup collisionGroup = nil)","0":"반환 값이 없는 Attack 함수입니다. 불필요한 table 객체 생성을 줄여 월드 성능을 개선할 수 있습니다."}]

[{"index":"table AttackFrom(Vector2 size, Vector2 position, string attackInfo, CollisionGroup collisionGroup = nil)","0":"사각형 영역을 지정할 수 있는 Attack 함수입니다. size는 사각형의 크기, position은 월드 좌표 기준 사각형의 중심 위치입니다."}]

[{"index":"boolean CalcCritical(Entity attacker, Entity defender, string attackInfo) (ScriptOverridable)","0":"크리티컬 공격 여부를 결정합니다. 기본 동작은 항상 false를 반환하므로 크리티컬 공격을 하지 않습니다."}]

[{"index":"integer CalcDamage(Entity attacker, Entity defender, string attackInfo) (ScriptOverridable)","0":"대미지 값을 결정합니다. 기본 동작은 항상 1을 반환합니다."}]

[{"index":"float GetCriticalDamageRate() (ScriptOverridable)","0":"크리티컬 공격일 경우, 기본 대미지 대비 몇 배의 대미지를 줄 것인지 결정합니다. 기본 동작은 항상 2를 반환합니다."}]

[{"index":"int32 GetDisplayHitCount(string attackInfo) (ScriptOverridable)","0":"한 번의 공격을 몇 개의 히트로 분할하여 표시할 지 결정합니다. 기본 동작은 항상 1을 반환합니다."}]

[{"index":"boolean IsAttackTarget(Entity defender, string attackInfo) (ScriptOverridable)","0":"defender가 공격 대상인지 판단합니다. false를 반환하면 Attack(), AttackFrom(), AttackFast() 함수의 공격 대상에서 제외됩니다. 기본 동작은 defender의 StateComponent의 현재 상태가 'DEAD'인 경우, 본인과 상대가 모두 플레이어면서 상대 PlayerComponent의 PVPMode 프로퍼티 값이 false인 경우에 false를 반환합니다."}]

[{"index":"void OnAttack(Entity defender) (ScriptOverridable)","0":"이 엔티티가 공격할 때 호출되는 함수입니다."}]

##### inherited from Component:

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

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

# Events

[{"index":"AttackEvent","0":"엔티티가 공격할 때 발생하는 이벤트입니다. AttackComponent에서 발생합니다."}]

# Examples

AttackComponent를 재정의 해 크리에이터가 공격 방식을 직접 구현할 수 있습니다.사각형 영역에 들어온 몬스터에게 공격을 가하는 예제입니다.
    
    
    @Component
    script PlayerAttack extends Component
        @ExecSpace("ServerOnly")
        method void AttackNormal()
        local attackSize = Vector2(1,1)
        local playerController = self.Entity.PlayerControllerComponent
    
        if playerController ~= nil then
        local attackOffset = Vector2(0.5 * playerController.LookDirectionX, 0.5)
        	self:Attack(attackSize, attackOffset, nil, CollisionGroups.Monster)
        end
        end
    
        override method integer CalcDamage(Entity attacker, Entity defender, string attackInfo)
        return 50
        end
    
        override method boolean CalcCritical(Entity attacker, Entity defender, string attackInfo)
        return _UtilLogic:RandomDouble() < 0.3
        end
    
        override method number GetCriticalDamageRate()
        return 2
        end
    
        @EventSender("Self")
        handler HandlePlayerActionEvent(PlayerActionEvent event)
        -- Parameters
        local ActionName = event.ActionName
        local PlayerEntity = event.PlayerEntity
        --------------------------------------------------------
        if self:IsClient() then return end
    
        if ActionName == "Attack" then
        	self:AttackNormal()
        end
        end
    end
    

# SeeAlso

  * HitComponent
  * PlayerControllerComponent
  * CollisionService
  * [공격과 피격](/docs?postId=206)