1 분 소요

Intro

이번 포스팅에서는 TurtleShell 몬스터의 공격을 구현해보았습니다.

공격은 Raycast를 사용하여 구현하였습니다.

image

SphereCast

몬스터가 둥글둥글하게 생겨서 RayCast 방식중 SphereCast를 사용하기로했습니다.

SphereCast는 다음 몇가지 파라미터를 받아 실행됩니다.

bool SphereCast(Vector3 origin, float radius, Vector3 direction, out RaycastHit hitInfo, 
                    float maxDistance, int layerMask)

/*
    1. origin - SphereCast가 시작되는 지점. 구체의 중심좌표
       
    2. radius - 구체의 반지름
        
    3. direction - SphereCast가 이동할 방향
        * 구체가 이 방향으로 이동하며 충돌을 탐지
    4. hitInfo - 충돌시 충돌 정보를 저장하는 출력변수

    5. maxDistance - SphereCast가 이동할 최대 이동거리

    6. layerMask - 어떤 레이어에 속한 오브젝트를 감지할지 결정
        * 특정레이어만 감지할 수 있도록해줌
*/

이제 몬스터의 공격 애니메이션에 맞춰 AnimationEvent로 SphereCast를 실행하여, 플레이어와 충돌했는지 검사하여

플레이어에게 데미지를 입히는방식으로 공격을 구현합니다.

Monster

Monster 클래스에서는 몬스터의 공격력을 추가합니다.

    #region ** Monster Status **
    [Header("#Monster Stats")]
    public int maxHp;
    public int curHp;
    public float speed;
    public float maxDistance;                       // 플레이어와의 거리(복귀하기위한 최대거리)
    public float idleThreshold;                     // 복귀후 처음 위치와의 차이
    public float attackDelay;                       // 공격속도
    public float damage;                            // 공격력
    #endregion

TurtleShell

몬스터의 개별적인 공격은 개별 몬스터클래스에서 작성합니다.

    private void InitValues()
    {
        // TurtleShell 능력치 초기화
        ...
        damage = 5f;
    }

    // 근접공격
    public void MeleeAttack()
    {
        // Raycast할 위치, 방향
        Vector3 origin = transform.position + new Vector3(0, 0.5f, 0);
        Vector3 direction = transform.forward;

        // Raycast 결과
        RaycastHit hit;

        // SphereRayCast로 플레이어에 닿았는지 확인
        if(Physics.SphereCast(origin, 0.5f,direction,out hit,1f, LayerMask.GetMask("Player")))
        {
            if(hit.collider.CompareTag("Player"))
            {
                // 플레이어에게 데미지입힘
                PlayerData playerData = DataManager.Instance.GetPlayerData();
                playerData.GetDamaged(damage);
            }
        }
    }

몬스터의 위치에서 살짝 위에서 앞으로 SphereCast를 시도합니다.

만약 Player와 충돌했다면, 플레이어의 체력을 damage만큼 닳게합니다.

애니메이션 이벤트 설정

Windows - Animation - Animation 창을 열고, 하이라키뷰에서 몬스터를 선택한뒤, 공격애니메이션을 선택합니다.

image

오른쪽 타임라인의 하얀 막대를 드래그하여 움직여보면 프레임단위의 애니메이션을 볼 수 있습니다.

원하는타이밍에 Add event 버튼(빨간동그라미)을 눌러 애니메이션 이벤트를 추가할 수 있습니다.

image

플레이어 태그, 레이어 설정

플레이어를 선택한 뒤 인스펙터창에서 태그와 레이어를 “Player”로 바꾸어줍니다.

없다면 추가합니다.

image

댓글남기기