ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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쪽에서 처리해주면 된다.

Designed by Tistory.