-
[TIL] 12주차 5일 유니티 스킬 장착, 스킬 슬롯 로직개발일지/스파르타 코딩클럽 부트캠프 2024. 7. 5. 20:35
최종프로젝트를 진행하면서
많은 기능을 구현하게 되었는데 지금은
A,S,D에 스킬을 장착하고 F로 스킬슬롯 변경을 해서 총 6개의 스킬을 사용할 수 있는 로직을 짜려고한다.
using UnityEngine; [CreateAssetMenu (fileName ="PlayerSkill", menuName = "Characters/PlayerSkill")] public class PlayerSkillSO : ScriptableObject { [field: Range(0f, 25f)] public float CoolTime; [field: Range(0f, 10f)] public float DamageMultipleValue; public float MPCost; public string AnimationName; }
먼저 PlayerSKillSO 스크립터블 오브젝트를 만들어준다.
그 후 PlayerInput에서 키 지정을 해준다.
protected virtual void AddInputActionCallbacks() { PlayerController input = stateMachine.Player.Input; input.PlayerActions.Movement.canceled += OnMovementCanceled; input.PlayerActions.Jump.started += OnJumpStarted; input.PlayerActions.Attack.performed += OnAttackPerformed; input.PlayerActions.Attack.canceled += OnAttackCanceled; input.PlayerActions.Dodge.started += OnDodgeStarted; input.PlayerActions.FirstSkill.started += OnFirstSkillStarted; input.PlayerActions.SecondSkill.started += OnSecondSkillStarted; input.PlayerActions.ThirdSkill.started += OnThirdSkillStarted; input.PlayerActions.SkillSlotSwap.started += OnSkillSlotSwap; } protected virtual void OnFirstSkillStarted(InputAction.CallbackContext context) { } protected virtual void OnSecondSkillStarted(InputAction.CallbackContext context) { } protected virtual void OnThirdSkillStarted(InputAction.CallbackContext context) { } protected virtual void OnSkillSlotSwap(InputAction.CallbackContext context) { if (firstSkillSlot == true) { firstSkillSlot = false; Debug.Log("Switched to Second Skill Slot, firstSkillSlot: " + firstSkillSlot); } else if (!firstSkillSlot) { firstSkillSlot = true; Debug.Log("Switched to First Skill Slot, firstSkillSlot: " + firstSkillSlot); } }
PlayerBaseState에서 Input 적용과 F를 눌렀을 때 불값이 바뀌도록 구성했다.
public List<PlayerSkillSO> playerEquipSkill = new List<PlayerSkillSO>();
그 후 Player에서 PlayerSkillSO를 담을 수 있는 리스트를 생성
public class PlayerFirstSkillState : PlayerSkillState { public int SkillHash { get; set;} public PlayerFirstSkillState(PlayerStateMachine stateMachine) : base(stateMachine) { } public override void Enter() { base.Enter(); if (firstSkillSlot == true) { SkillAnimationSelect(0); Debug.Log("Selected Skill 0"); } else if (firstSkillSlot == false) { SkillAnimationSelect(3); Debug.Log("Selected Skill 3"); } stateMachine.IsSkillActive = true; } public override void Exit() { base.Exit(); if (firstSkillSlot == true) { StopSkillState(0); } else if(firstSkillSlot == false) { StopSkillState(3); } stateMachine.IsSkillActive = false; } public override void Update() { if (firstSkillSlot == true) { if (stateMachine.Player.IsAnimationFinished(stateMachine.Player.playerEquipSkill[0].AnimationName)) { stateMachine.ChangeState(stateMachine.IdleState); } } else { if (stateMachine.Player.IsAnimationFinished(stateMachine.Player.playerEquipSkill[3].AnimationName)) { stateMachine.ChangeState(stateMachine.IdleState); } } } public void SkillAnimationSelect(int index) { string skillString = stateMachine.Player.playerEquipSkill[index].AnimationName; SkillHash = Animator.StringToHash(skillString); StartAnimation(SkillHash); } public void StopSkillState(int index) { string skillString = stateMachine.Player.playerEquipSkill[index].AnimationName; SkillHash = Animator.StringToHash(skillString); StopAnimation(SkillHash); } }
PlayerFirstSkillState에서 A를 누르면 인덱스 0또는 3의 스킬이 나가도록 구현해준다. ( 슬롯 변화에 따라서 )
이제 어느 칸에 장착해주고 장착 여부 체크를 UI쪽에서 처리해주면 된다.
'개발일지 > 스파르타 코딩클럽 부트캠프' 카테고리의 다른 글
[TIL] 13주차 2일 FSM에서 신경써야 할 부분 ( 트러블 슈팅 ) (2) 2024.07.09 [TIL] 13주차 1일 유니티 2D 플레이어 피격 구현 ( OnTriggerEnter2D, Action ) (0) 2024.07.08 [TIL] 12주차 3일 기술면접 대비 (0) 2024.07.05 [TIL] 12주차 4일 ( Raycast2D로 연속점프 방지하기 _ 트러블슈팅 ) (0) 2024.07.04 [TIL] 12주차 2일 기술 면접 대비 (0) 2024.07.03