오늘은 플레이어에게 스킬 기능을 추가하는 작업을 하였다. 어제부로 플레이어에게 필요한 상태구현 와 그에 상응하는 작용을 하는 UI까지 완성하였다면, 오늘은 스킬을 추가하여 스킬키를 입력하면 해당 스킬이 실행되고 스킬 UI에도 영향을 끼치는 작업을 했다.
먼저 플레이어 스킬 구현을 어떻게 할지 고민하다가, 아무래도 스테이트 머신을 사용하고 있기도 하고 여러가지 참고하면서 작성할 수 있는 코드가 많기 때문에 각 스킬상황에 맞는 스테이트 머신을 따로 만들어서 연결하는 것으로 정했다.
하지만 스테이트 머신 구조가 세분화되어있는 만큼 한 가지 스테이트가 추가되면 그에 맞춰서 다양한 곳에서 참조가 일어나기 때문에 코드 수정을 굉장히 많이 해야 한다는 단점이 있었다. 그래서 여러 번의 코드수정과 거듭된 실행오류를 통해 완성을 하긴 했다.
먼저 플레이어 스킬창 UI 두개를 생성한 뒤 Health, Stamina, Hunger를 같이 관리하고 있는 PlayerConditions 스크립트에 스킬과 궁극기 스킬인 PowerUp을 만들고 UI와 배치시켜 준다.
PlayerConditions 수정
public Condition skill;
public Condition powerUp;
skill.curValue = skill.startValue;
powerUp.curValue = powerUp.startValue;
skill.Add(skill.regenRate * Time.deltaTime);
powerUp.Add(powerUp.regenRate * Time.deltaTime);
skill.uiBar.fillAmount = skill.GetPercentage();
powerUp.uiBar.fillAmount = powerUp.GetPercentage();
public bool UseSkill(float amount)
{
if(skill.curValue - amount < 0)
return false;
skill.Subtract(amount);
return true;
}
public bool ActivePowerUp(float amount)
{
if(powerUp.curValue != powerUp.maxValue)
return false;
powerUp.Subtract(powerUp.maxValue);
return true;
}
그리고 스킬과 궁극기 스크립트는 GroundState를 베이스로 생성하고 애니메이션이 출력이 되도록 스크립트를 작성한다.
<PlayerSkillState>
public class PlayerSkillState : PlayerGroundState
{
public PlayerSkillState(PlayerStateMachine playerStateMachine) : base(playerStateMachine)
{
}
public override void Enter()
{
base.Enter();
StartAnimation(stateMachine.Player.AnimationData.SkillParameterHash);
stateMachine.Player.Playerconditions.UseSkill(10);
}
public override void Exit()
{
base.Exit();
StopAnimation(stateMachine.Player.AnimationData.SkillParameterHash);
}
}
<PlayerPowerUpState>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerPowerUpState : PlayerGroundState
{
public PlayerPowerUpState(PlayerStateMachine playerStateMachine) : base(playerStateMachine)
{
}
public override void Enter()
{
base.Enter();
StartAnimation(stateMachine.Player.AnimationData.PowerUpParameterHash);
stateMachine.Player.Playerconditions.ActivePowerUp(100);
}
public override void Exit()
{
base.Exit();
StopAnimation(stateMachine.Player.AnimationData.PowerUpParameterHash);
}
}
PlayerAnimationData 수정
[SerializeField] private string SkillParameterName = "Skill";
[SerializeField] private string PowerUpParameterName = "PowerUp";
public int SkillParameterHash { get; private set; }
public int PowerUpParameterHash { get; private set;
SkillParameterHash = Animator.StringToHash(SkillParameterName);
PowerUpParameterHash = Animator.StringToHash(PowerUpParameterName);
PlayerGroundState 수정
input.PlayerActions.Skill.started += OnSkillStarted;
input.PlayerActions.PowerUp.started += OnPowerUpStarted;
input.PlayerActions.Skill.started -= OnSkillStarted;
input.PlayerActions.PowerUp.started -= OnPowerUpStarted;
protected virtual void OnSkillStarted(InputAction.CallbackContext context)
{
stateMachine.ChangeState(stateMachine.SkillState);
}
protected virtual void OnPowerUpStarted(InputAction.CallbackContext context)
{
stateMachine.ChangeState(stateMachine.PowerUpState);
}
스테이트 머신을 추가하면 여러 군데에서 고쳐야 실행이 되기 때문에 꽤나 까다로운 듯하다. 하지만 이로써 해당 스테이트에 진입할 시 애니메이션과 UI상태창의 시각적인 요소는 구현이 완료되었다. 내일은 필요한 조건들과 애니메이션을 조금 가다듬고 소소한 버그들을 고쳐서 좀 더 완성도 있게 만들고, 추가적인 기능 구현도 생각해 봐야겠다.
'TIL (since 2023.08.07 ~ )' 카테고리의 다른 글
2023-11-06 TIL(Unity 최종 프로젝트 11일차) (0) | 2023.11.07 |
---|---|
2023-11-03 TIL(Unity 최종 프로젝트 10일차) (0) | 2023.11.03 |
2023-11-01 TIL(Unity 최종 프로젝트 8일차) (0) | 2023.11.01 |
2023-10-31 TIL(Unity 최종 프로젝트 7일차) (1) | 2023.10.31 |
2023-10-30 TIL(Unity 최종 프로젝트 6일차) (0) | 2023.10.30 |