본문 바로가기

TIL (since 2023.08.07 ~ )

2023-11-03 TIL(Unity 최종 프로젝트 10일차)

 

오늘은 어제까지 완성했던 플레이어의 UI와 관련된 버그 픽스를 했다. 하루종일 고민하고 다양한 방법을 시도하다가도 안되어서 결국 팀원분들께 도움을 요청했는데 생각보다 손쉽게 해결해 주셔서 다행이었다. 

 

버그리포트

플레이어에 연결해둔 UI의 게이지와 쿨타임 관련해서 이슈가 많았는데, 해당 기능을 구현해야 하는 위치는 구조를 거슬러 올라가다 보니 알게 됐지만 어떻게 추가해야 할지 방법을 몰라서 고민을 많이 했다. 조건문을 작성하는 건 알겠는데, 어디에 있는 정보를 가져와서 넣어야 할지가 막막했는데 팀장님께서 차근차근 변수를 거슬러 올라가면서 상속되는 관계를 살펴보시면서 해결을 해주셨다.(그저 빛)

 

우선 PlayerGroundData에 구를때 소모되는 스태미나, 스킬사용 시 소모되는 게이지, 필살기 발동 시 소모되는 게이지 별로 설정을 한다.

 

PlayerGroundData 수정

[field: SerializeField][field: Range(0f, 20f)] public float StaminaCost { get; private set; } = 20f;

[field: SerializeField][field: Range(0f, 10f)] public float SkillCost { get; private set; } = 10f;

[field: SerializeField][field: Range(0f, 100f)] public float PowerUpCost { get; private set; } = 100f;

 

그리고 RollState와 SkillState, PowerUpState에 들어가있던 변수를 해당 부분으로 할당한다.

 

PlayerRollState 수정

public override void Enter()
    {
        stateMachine.MovementSpeedModifier = 0;
        base.Enter();
        StartAnimation(stateMachine.Player.AnimationData.RollParameterHash);
        TryApplyForce();
        stateMachine.Player.Playerconditions.UseStamina(groundData.StaminaCost);
    }

 

 

PlayerSkillState 수정

public override void Enter()
    {
        base.Enter();
        StartAnimation(stateMachine.Player.AnimationData.SkillParameterHash);
        stateMachine.Player.Playerconditions.UseSkill(groundData.SkillCost);
    }

 

 

PlayerPowerUpState 수정

public override void Enter()
    {
        base.Enter();
        StartAnimation(stateMachine.Player.AnimationData.PowerUpParameterHash);
        stateMachine.Player.Playerconditions.ActivePowerUp(groundData.PowerUpCost);
    }

 

 

그리고 해당 스테이트들은 GroundState에 연결되어 있고, 각각의 스테이트로 들어가기 전에 코스트가 충분한지 체크하는 부분을 GroundState에서 관리해주어야 한다. 이 부분에서 오랫동안 고민했는데 팀장님께서 잘 도와주셔서 해결했다.

 

PlayerGroundState 수정

protected virtual void OnRollStarted(InputAction.CallbackContext context)
    {
        if (stateMachine.Player.Playerconditions.stamina.curValue < groundData.StaminaCost)
            return;
        stateMachine.ChangeState(stateMachine.RollState);
    }

    protected virtual void OnSkillStarted(InputAction.CallbackContext context)
    {
        if(stateMachine.Player.Playerconditions.skill.curValue < groundData.SkillCost)
            return;
        stateMachine.ChangeState(stateMachine.SkillState);
    }

    protected virtual void OnPowerUpStarted(InputAction.CallbackContext context)
    {
        if(stateMachine.Player.Playerconditions.powerUp.curValue < groundData.PowerUpCost)
            return;
        stateMachine.ChangeState(stateMachine.PowerUpState);
    }

 

각각의 스테이트에 진입하기 전에 조건문으로 만족해야 하는 조건을 설정해 두고 진입을 해야 게이지의 역할을 할 수 있다.

이것으로 어느정도 플레이어의 스킬구현에 가닥이 잡힌 것 같다. 나머지 해야 하는 작업은 스킬 대미지와 궁극기를 썼을 때 능력치가 올라가는 것을 구현해야 한다. 

오늘도 혼자 고민하다가 시간이 많이 흘렀고 고민하는 시간만큼 성과가 잘 나오지 않아서 많이 지쳤었는데, 팀원분들께서도 다 같이 해결하자고 말씀하면서 도와주시니 정말 금방 해결되었다. 혼자 고민하고 공부하는 시간도 분명 필요하지만, 문제를 같이 공유하다 보면 더 확실한 공부가 된다는 걸 느꼈다.