Unity3D_MMO - 공격 (1)

k_hyun·2022년 10월 19일
0

Unity_MMO_Project

목록 보기
25/33

CursorController.cs

public class CursorController : MonoBehaviour
{
    int _mask = (1 << (int)Define.Layer.Ground) | (1 << (int)Define.Layer.Monster);


    Texture2D _attackIcon;
    Texture2D _handIcon;

    enum CursorType
    {
        None,
        Hand,
        Attack,
    }

    CursorType _cursorType = CursorType.None;

    private void Start()
    {
        _attackIcon = Managers.Resource.Load<Texture2D>("Textures/Cursor/Attack");
        _handIcon = Managers.Resource.Load<Texture2D>("Textures/Cursor/Hand");
    }

    void Update()
    {
        if (Input.GetMouseButton(0))
            return;

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100.0f, _mask))
        {
            if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
            {
                // 깜빡 거림 방지
                if (_cursorType != CursorType.Attack)
                {
                    Cursor.SetCursor(_attackIcon, new Vector2(_attackIcon.width / 5, 0), CursorMode.Auto);
                    _cursorType = CursorType.Attack;
                }
            }
            else
            {
                if (_cursorType != CursorType.Hand)
                {
                    Cursor.SetCursor(_handIcon, new Vector2(_handIcon.width / 3, 0), CursorMode.Auto);
                    _cursorType = CursorType.Hand;
                }
            }
        }
    }

PlayerController에서 구현한 기능을 새로 스크립트를 파서 옮겨주었다.

해당 스크립트는 씬에 붙였다.

Animator


attack이라는 매개변수를 추가하였다.

attack이 true인 경우 Attack Animation으로 넘어간다.

PlayerController.cs

[SerializeField]
    PlayerState _state = PlayerState.Idle;

    public PlayerState State
    {
        get { return _state; }
        set
        {
            _state = value;

            Animator anim = GetComponent<Animator>();

            switch(_state)
            {
                case PlayerState.Die:
                    anim.SetBool("attack", false);
                    break;
                case PlayerState.Idle:
                    anim.SetBool("attack", false);
                    anim.SetFloat("speed", 0);
                    break;
                case PlayerState.Moving:
                    anim.SetBool("attack", false);
                    anim.SetFloat("speed", _stat.MoveSpeed);
                    break;
                case PlayerState.SKill:
                    anim.SetBool("attack", true);
                    break;

            }
        }

State를 프로퍼티로 만들었다.

현재 상태와 재생할 애니메이션을 함께 묶기 위함이다.

void UpdateMoving()
    {
        // 몬스터가 사정거리 내면 공격
        if (_lockTarget != null)
        {
            float dist = (_destPos - transform.position).magnitude;
            if (dist <= 1)
            {
                State = PlayerState.SKill;
                return;
            }
        }
        
        ...
        
    }

UpdateMoving에서 몬스터가 사정거리 안에 있는 경우 플레이어의 상태를 공격으로 수정한다.

실행결과

공격 애니메이션을 완성하였다.

하지만 꾹 눌러도 공격 모션은 한 번만 실행된다는 문제가 생겼다.

0개의 댓글