공부/Game Bootcamp

[TIL] #5. 플레이어 대시 Action : 멋쟁이사자처럼부트캠프 Unity 게임 개발 3기

Ail_ 2025. 4. 24. 21:20

개요

플레이어에게 대시 버튼을 누르면 대시를 할 수 있도록 Action을 추가했다.

 

내용

  • PlayerActionDash.cs 추가
    • CharacterBase에 있는 moveSpeed 이용
  • PlayerController.cs 수정
    • 공격 중에도 회피 취소 가능하도록 구현
    • 추후 UI 바인딩을 위한 DashButtonPressed() 메서드 추가

이번에 추가한 PlayerActionDash 코드는 아래와 같다.

using UnityEngine;

public class PlayerActionDash : IPlayerAction
{
    private PlayerController player;
    private float duration = 0.25f; // 대시 유지 시간
    private float timer; // 대시 경과 시간
    private Vector3 direction; // 대시 방향

    private float dashSpeedMultiplier = 3f; // 기본 이동 속도의 n배
    private float dashSpeed; // 실제 대시 속도(계산한 값)

    public bool IsActive { get; private set; } // 현재 대시 중인지 여부

    public void StartAction(PlayerController player)
    {
        this.player = player;
        IsActive = true;
        timer = 0f;

        // 조이스틱 입력값 있으면 그 방향, 없으면 캐릭터가 바라보는 방향
        direction = player.GetMoveDirectionOrForward().normalized;

        // 대시 속도 = 이동 속도 x 배수
        dashSpeed = player.moveSpeed * dashSpeedMultiplier;

        // TODO: 필요 시 애니메이션 재생
        // player.PlayerAnimator.SetTrigger("Roll");
    }

    public void UpdateAction()
    {
        if (!IsActive) return;

        DoDash();
    }

    private void DoDash()
    {
        timer += Time.deltaTime;
        if (timer < duration)
        {
            player.CharacterController.Move(direction * dashSpeed * Time.deltaTime);
        }
        else
        {
            EndAction();
        }
    }

    public void EndAction()
    {
        IsActive = false;
        player = null;
    }
}

 

그리고 인풋 여부 판별 메서드랑 추후 버튼 눌렀을 때 호출할 메서드는 PlayerController에 만들었다.

#region 대시 관련

    public Vector3 GetMoveDirectionOrForward()
    {
        Vector3 dir = new Vector3(Joystick.Horizontal, 0, Joystick.Vertical);
        return dir.sqrMagnitude > 0.01f ? dir.normalized : transform.forward;
    }

    public void DashButtonPressed()
    {
        if (!_actionDash.IsActive)
        {
            StartDashAction();
        }
    }

    #endregion

 

 

느낀 점

애니메이션은 추후 에셋 구매 후 구현해야지 하는 생각으로 구현 안했는데 흠...고민이 좀 될 것 같다.

거리 대시랑 속력 대시라는 개념이 분리된다는 것도 이번에 새삼 깨달았다. 순간이동과 구르기는 다르지...그치...

오늘도 배웠다!