2026-04-13 스킬,퀵슬롯 시스템 수정중
This commit is contained in:
@@ -18,6 +18,7 @@ public class SkillModule : MonoBehaviour
|
||||
|
||||
private SkillInstance[] _equippedSkills;
|
||||
private ISkillEffect[] _skillEffects;
|
||||
private SkillData[] _equippedSkillDataCache; // 장착 순서 보존용
|
||||
|
||||
// 차지
|
||||
private int _chargingSlot = -1;
|
||||
@@ -49,13 +50,6 @@ public class SkillModule : MonoBehaviour
|
||||
|
||||
private Dictionary<WeaponType, WeaponSkillSet> _dicSkills = new Dictionary<WeaponType, WeaponSkillSet>();
|
||||
|
||||
// 슬롯 이름 → 런타임 매핑 (Dispatcher 테이블)
|
||||
private Dictionary<string, IUseableRuntime> _skillBindData = new Dictionary<string, IUseableRuntime>();
|
||||
|
||||
// 퀵슬롯에 바인딩할 슬롯 이름 목록 (스킬용)
|
||||
private static readonly string[] SkillSlotNames =
|
||||
{ "UseSlot_Q", "UseSlot_E", "UseSlot_R", "UseSlot_T" };
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
_stateMachine = GetComponent<PlayerStateMachine>();
|
||||
@@ -64,6 +58,7 @@ private void Awake()
|
||||
|
||||
_equippedSkills = new SkillInstance[_maxSlots];
|
||||
_skillEffects = new ISkillEffect[_maxSlots];
|
||||
_equippedSkillDataCache = new SkillData[_maxSlots];
|
||||
}
|
||||
|
||||
private void Start()
|
||||
@@ -74,46 +69,17 @@ private void Start()
|
||||
_dicSkills[wss.WeaponType] = wss;
|
||||
}
|
||||
|
||||
// 현재 장착 무기의 스킬셋 로드 (무기 미장착 시 스킬 없음)
|
||||
// 현재 장착 무기의 스킬셋만 "장착 상태"로 로드 (퀵슬롯 자동 바인딩 없음)
|
||||
if (_equippedWeapon != null
|
||||
&& _dicSkills.TryGetValue(_equippedWeapon.WType, out WeaponSkillSet out_wss)
|
||||
&& out_wss != null)
|
||||
{
|
||||
LoadWeaponSkills(out_wss);
|
||||
RegisterSkillsToQuickslot(out_wss);
|
||||
}
|
||||
|
||||
// 각 슬롯에 dispatcher를 한 번만 바인딩 (이후 내용물만 _skillBindData로 교체)
|
||||
foreach (string slotName in SkillSlotNames)
|
||||
{
|
||||
string captured = slotName;
|
||||
GameManager.Instance.Level.BindSlotAction(captured, (state) => DispatchSlot(captured, state));
|
||||
}
|
||||
}
|
||||
|
||||
private void DispatchSlot(string slotName, InputState state)
|
||||
{
|
||||
if (!_skillBindData.TryGetValue(slotName, out IUseableRuntime runtime) || runtime == null)
|
||||
return;
|
||||
|
||||
runtime.Execute(new UseContext
|
||||
{
|
||||
Caster = gameObject,
|
||||
Target = null,
|
||||
UseInputState = state
|
||||
});
|
||||
}
|
||||
|
||||
private void RegisterSkillsToQuickslot(WeaponSkillSet wss)
|
||||
{
|
||||
for (int i = 0; i < SkillSlotNames.Length; i++)
|
||||
{
|
||||
if (i < wss.Skills.Count && wss.Skills[i] != null)
|
||||
_skillBindData[SkillSlotNames[i]] = wss.Skills[i].CreateRuntime();
|
||||
else
|
||||
_skillBindData.Remove(SkillSlotNames[i]);
|
||||
}
|
||||
}
|
||||
// 장착된 스킬 목록 반환 (스킬창 UI에서 사용)
|
||||
public IReadOnlyList<SkillData> GetEquippedSkillDatas() => _equippedSkillDataCache;
|
||||
|
||||
private void Update()
|
||||
{
|
||||
@@ -133,11 +99,13 @@ public void LoadWeaponSkills(WeaponSkillSet skillSet)
|
||||
{
|
||||
_equippedSkills[i] = new SkillInstance(skillSet.Skills[i]);
|
||||
_skillEffects[i] = ResolveEffect(skillSet.Skills[i].TargetType);
|
||||
_equippedSkillDataCache[i] = skillSet.Skills[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
_equippedSkills[i] = null;
|
||||
_skillEffects[i] = null;
|
||||
_equippedSkillDataCache[i] = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user