using UnityEngine; using UnityEngine.InputSystem; using Unity.Netcode; using Colosseum.Skills; namespace Colosseum.Player { /// /// 플레이어 스킬 입력 처리. /// 논타겟 방식: 입력 시 즉시 스킬 시전 /// public class PlayerSkillInput : NetworkBehaviour { [Header("Skill Slots")] [Tooltip("각 슬롯에 등록할 스킬 데이터 (6개)")] [SerializeField] private SkillData[] skillSlots = new SkillData[6]; [Header("References")] [Tooltip("SkillController (없으면 자동 검색)")] [SerializeField] private SkillController skillController; private InputSystem_Actions inputActions; public SkillData[] SkillSlots => skillSlots; public override void OnNetworkSpawn() { if (!IsOwner) { enabled = false; return; } // SkillController 참조 확인 if (skillController == null) { skillController = GetComponent(); if (skillController == null) { Debug.LogError("PlayerSkillInput: SkillController not found!"); enabled = false; return; } } InitializeInputActions(); } private void InitializeInputActions() { inputActions = new InputSystem_Actions(); inputActions.Player.Enable(); // 스킬 액션 콜백 등록 inputActions.Player.Skill1.performed += _ => OnSkillInput(0); inputActions.Player.Skill2.performed += _ => OnSkillInput(1); inputActions.Player.Skill3.performed += _ => OnSkillInput(2); inputActions.Player.Skill4.performed += _ => OnSkillInput(3); inputActions.Player.Skill5.performed += _ => OnSkillInput(4); inputActions.Player.Skill6.performed += _ => OnSkillInput(5); } public override void OnNetworkDespawn() { if (inputActions != null) { inputActions.Player.Skill1.performed -= _ => OnSkillInput(0); inputActions.Player.Skill2.performed -= _ => OnSkillInput(1); inputActions.Player.Skill3.performed -= _ => OnSkillInput(2); inputActions.Player.Skill4.performed -= _ => OnSkillInput(3); inputActions.Player.Skill5.performed -= _ => OnSkillInput(4); inputActions.Player.Skill6.performed -= _ => OnSkillInput(5); inputActions.Disable(); } } /// /// 스킬 입력 처리 /// private void OnSkillInput(int slotIndex) { if (slotIndex < 0 || slotIndex >= skillSlots.Length) return; SkillData skill = skillSlots[slotIndex]; if (skill == null) { Debug.Log($"Skill slot {slotIndex + 1} is empty"); return; } // 논타겟: 타겟 없이 스킬 시전 bool success = skillController.ExecuteSkill(skill); if (!success) { Debug.Log($"Cannot execute skill: {skill.SkillName}"); } } /// /// 스킬 슬롯 접근자 /// public SkillData GetSkill(int slotIndex) { if (slotIndex < 0 || slotIndex >= skillSlots.Length) return null; return skillSlots[slotIndex]; } /// /// 스킬 슬롯 변경 /// public void SetSkill(int slotIndex, SkillData skill) { if (slotIndex < 0 || slotIndex >= skillSlots.Length) return; skillSlots[slotIndex] = skill; } /// /// 남은 쿨타임 조회 /// public float GetRemainingCooldown(int slotIndex) { SkillData skill = GetSkill(slotIndex); if (skill == null) return 0f; return skillController.GetRemainingCooldown(skill); } /// /// 스킬 사용 가능 여부 /// public bool CanUseSkill(int slotIndex) { SkillData skill = GetSkill(slotIndex); if (skill == null) return false; return !skillController.IsOnCooldown(skill) && !skillController.IsExecutingSkill; } } }