From 9127ae8ff2cfb1aab8eb4710d01cae06d230775e Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Mon, 17 Mar 2025 23:15:57 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=8A=A4=ED=82=AC=20=EC=BF=A8=ED=83=80?= =?UTF-8?q?=EC=9E=84=20dimd=20=EC=98=81=EC=97=AD=EC=9D=B4=20=EC=A0=95?= =?UTF-8?q?=EC=83=81=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=8F=99=EC=9E=91?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ControllerButtons/Skill Button.prefab | 19 ++--- .../UI/Prefabs/UI.ControllerUI.prefab | 40 +++++------ .../Scripts/Character/CharacterBase.cs | 10 +-- .../Gameton/Scripts/Skill/SkillButtonItem.cs | 43 +++++------ .../Gameton/Scripts/Skill/SkillDataManager.cs | 72 +++++++++++-------- .../Assets/Gameton/Scripts/UI/ControllerUI.cs | 11 ++- .../Gameton/Scripts/UI/SkillSettingUI.cs | 5 +- 7 files changed, 104 insertions(+), 96 deletions(-) diff --git a/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/ControllerButtons/Skill Button.prefab b/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/ControllerButtons/Skill Button.prefab index 395316f2..ef8adca3 100644 --- a/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/ControllerButtons/Skill Button.prefab +++ b/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/ControllerButtons/Skill Button.prefab @@ -142,8 +142,8 @@ MonoBehaviour: m_Calls: [] m_text: m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontAsset: {fileID: 11400000, guid: 5d9cd0b39cc658540aa28f3dcb744199, type: 2} + m_sharedMaterial: {fileID: -3388310998712943579, guid: 5d9cd0b39cc658540aa28f3dcb744199, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -550,8 +550,8 @@ MonoBehaviour: m_MethodName: OnClickSkillButton m_Mode: 2 m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: TON.ControllerUI_SkillButton, Assembly-CSharp + m_ObjectArgument: {fileID: 5964648352921021872} + m_ObjectArgumentAssemblyTypeName: TON.SkillButtonItem, Assembly-CSharp m_IntArgument: 0 m_FloatArgument: 0 m_StringArgument: @@ -573,17 +573,6 @@ MonoBehaviour: coolTimeDimd: {fileID: 561526979871276618} skillIcon: {fileID: 4450630482936255251} lockImage: {fileID: 9104780789004064627} - skillBase: - k__BackingField: - id: - name: - mpConsumption: 0 - damage: 0 - coolDown: 0 - slotNumber: 0 - requiredLevel: 0 - maxHitCount: 0 - k__BackingField: 0 --- !u!1 &9104780789004064627 GameObject: m_ObjectHideFlags: 0 diff --git a/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.ControllerUI.prefab b/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.ControllerUI.prefab index b8b43855..5492fcc1 100644 --- a/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.ControllerUI.prefab +++ b/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.ControllerUI.prefab @@ -69,7 +69,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &5417560988456393388 RectTransform: m_ObjectHideFlags: 0 @@ -557,7 +557,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchorMin.x @@ -565,7 +565,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_SizeDelta.x @@ -605,7 +605,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 120 objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchoredPosition.y @@ -714,7 +714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchorMin.x @@ -722,7 +722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_SizeDelta.x @@ -762,7 +762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 442.5 objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchoredPosition.y @@ -933,7 +933,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchorMin.x @@ -941,7 +941,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_SizeDelta.x @@ -981,7 +981,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 207.5 objectReference: {fileID: 0} - target: {fileID: 7442045083355200288, guid: c4604ffc09f28ed4c8f733a3ba91d6e4, type: 3} propertyPath: m_AnchoredPosition.y @@ -1124,7 +1124,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3622686016877026920, guid: f023329ca96ab444ca7c60781e310d59, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 3622686016877026920, guid: f023329ca96ab444ca7c60781e310d59, type: 3} propertyPath: m_AnchorMin.x @@ -1132,7 +1132,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3622686016877026920, guid: f023329ca96ab444ca7c60781e310d59, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 3622686016877026920, guid: f023329ca96ab444ca7c60781e310d59, type: 3} propertyPath: m_SizeDelta.x @@ -1172,7 +1172,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3622686016877026920, guid: f023329ca96ab444ca7c60781e310d59, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 500 objectReference: {fileID: 0} - target: {fileID: 3622686016877026920, guid: f023329ca96ab444ca7c60781e310d59, type: 3} propertyPath: m_AnchoredPosition.y @@ -1202,14 +1202,6 @@ PrefabInstance: propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target value: objectReference: {fileID: -4577297331876422106} - - target: {fileID: 8637807277690663409, guid: f023329ca96ab444ca7c60781e310d59, type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgument - value: - objectReference: {fileID: 169483457724555279} - - target: {fileID: 8637807277690663409, guid: f023329ca96ab444ca7c60781e310d59, type: 3} - propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName - value: TON.SkillButtonItem, Assembly-CSharp - objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] m_AddedGameObjects: [] @@ -1375,7 +1367,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchorMax.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchorMin.x @@ -1383,7 +1375,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchorMin.y - value: 0 + value: 1 objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_SizeDelta.x @@ -1423,7 +1415,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchoredPosition.x - value: 0 + value: 260 objectReference: {fileID: 0} - target: {fileID: 1465902235892889161, guid: c8f2e3092439b7f409834ac140c97a78, type: 3} propertyPath: m_AnchoredPosition.y diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs index 164dcf8a..b35580f6 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs @@ -257,11 +257,13 @@ namespace TON callback?.Invoke(true); } - public void SkillAttack(string skillId) + public void SkillAttack(SkillBase skillBase) { - SkillBase skillBase = SkillDataManager.Singleton.GetSkillInstance(skillId); + if (skillBase == null) return; + + string skillId = skillBase.SkillData.id; + // 스킬을 사용할 수 있는 스킬포인트가 있는지 판단 - // 스킬 포인트가 부족하다면 스킬을 수행하지 못함 if (currentSP < skillBase.SkillData.mpConsumption) return; // 스킬 매니저에서 스킬을 쏠 수 있는지 여부를 판단 @@ -278,7 +280,7 @@ namespace TON // 스킬 매니저에 스킬 발사 요청 SkillDataManager.Singleton.ExecuteSkill(skillId, firePoint, lastDirection); - // RecoverSP 가 이미 진행중인 경우 이중으로 코루틴을 실행하지 않도록 함함 + // RecoverSP 가 이미 진행중인 경우 이중으로 코루틴을 실행하지 않도록 함 if (!isRecovering) { StartCoroutine(RecoverSP()); diff --git a/Gameton-06/Assets/Gameton/Scripts/Skill/SkillButtonItem.cs b/Gameton-06/Assets/Gameton/Scripts/Skill/SkillButtonItem.cs index 8dfd9c7c..bb203a66 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Skill/SkillButtonItem.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Skill/SkillButtonItem.cs @@ -14,20 +14,13 @@ namespace TON [SerializeField] private GameObject skillIcon; [SerializeField] private GameObject lockImage; - public SkillBase skillBase; + public SkillBase skillBase { get; private set; } public void Initalize(SkillBase skillData) { - if (skillData != null) - { - skillData.OnSkillExecuted -= OnSkillExecuted; - // skillData.OnCooldownCompleted -= OnCooldownCompleted; - } - + // 직접 주어진 skillData 인스턴스 사용 skillBase = skillData; - skillData.OnSkillExecuted += OnSkillExecuted; - // skillData.OnCooldownCompleted += OnCooldownCompleted; skillIcon.SetActive(true); @@ -36,12 +29,6 @@ namespace TON skillIcon.GetComponent().sprite = loadedSkillImage; lockImage.SetActive(false); } - - } - - private void OnSkillExecuted() - { - UpdateCooldownUI(); } private void UpdateCooldownUI() @@ -50,13 +37,27 @@ namespace TON { return; // UI가 삭제되었으면 업데이트 중단 } - - coolTimeText.gameObject.SetActive(skillBase.CurrentCoolDown > 0); // 남은 쿨타임이 있을 때만 표시 - - if (coolTimeText.IsActive()) + if (skillBase == null) { - coolTimeText.text = $"{skillBase.CurrentCoolDown: 0}s"; // 정수 초단위 표시 - coolTimeDimd.fillAmount = skillBase.CurrentCoolDown / skillBase.SkillCoolDown; // 1 → 0 으로 감소 + return; + } + + SkillBase targetSkill = SkillDataManager.Singleton.GetEquippedSkillFromId(skillBase.SkillData.id); + + // 현재 쿨타임 상태 로그 + // Debug.Log($"Skill: {skillBase.SkillData.id}, CurrentCoolDown: {targetSkill.CurrentCoolDown}, SkillCoolDown: {targetSkill.SkillCoolDown}"); + + // 남은 쿨타임이 있을 때만 표시 + coolTimeText.gameObject.SetActive(targetSkill.CurrentCoolDown > 0); + + if (targetSkill.CurrentCoolDown > 0) + { + coolTimeText.text = $"{targetSkill.CurrentCoolDown:0.0}s"; // 소수점 한 자리까지 표시 + coolTimeDimd.fillAmount = targetSkill.CurrentCoolDown / targetSkill.SkillCoolDown; // 1 → 0 으로 감소 + } + else + { + coolTimeDimd.fillAmount = 0; // 쿨타임이 없으면 딤드 효과 제거 } } diff --git a/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs index b6f471f3..feee9cd4 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Skill/SkillDataManager.cs @@ -1,8 +1,6 @@ using System.Collections; using System.Collections.Generic; -using System.Threading.Tasks; using UnityEngine; -using UnityEngine.Assertions; namespace TON { @@ -52,7 +50,12 @@ namespace TON foreach (var skill in equippedSkills) { - UpdateSkillCoolDown(skill.SkillData.id); + if (skill != null) + { + UpdateSkillCoolDown(skill.SkillData.id); + Debug.Log($"Updating cooldown for skill {skill.SkillData.id}: {skill.CurrentCoolDown}"); + } + } } @@ -169,39 +172,55 @@ namespace TON return equippedSkills; } + public SkillBase GetEquippedSkillFromId(string skillId) + { + SkillBase targetSkillBase = null; + foreach (SkillBase skill in equippedSkills) + { + if (skill != null && skill.SkillData.id == skillId) + { + targetSkillBase = skill; + break; + } + } + + return targetSkillBase; + } + // 스킬 슬롯에 적용될 스킬 리스트 초기화 및 업데이트에 사용 public List GetActiveSkillInstance() { - if (equippedSkills != null) + if (equippedSkills == null) + { + equippedSkills = new List(); + } + else { equippedSkills.Clear(); } - foreach (SkillData skill in skillDatas) + for (int slot = 1; slot <= 3; slot++) { - if (skill.slotNumber == 1 || skill.slotNumber == 2 || skill.slotNumber == 3) + SkillData skill = skillDatas.Find(s => s.slotNumber == slot); + if (skill != null && skillInstances.ContainsKey(skill.id)) { - // Debug.Log("GetActiveSkillInstance() : " + skill.id); - equippedSkills.Add(skillInstances.GetValueOrDefault(skill.id)); + // 바로 skillInstances에서 가져옴 + equippedSkills.Add(skillInstances[skill.id]); + } + else + { + equippedSkills.Add(null); // 빈 슬롯을 위해 null 추가 } } - equippedSkills.Sort((a, b) => a.SkillData.slotNumber.CompareTo(b.SkillData.slotNumber)); - return equippedSkills; - } - // 스킬 쿨타임 설정하는 메소드 - public void SetCoolTime(string skillId) - { - if (skillInstances.TryGetValue(skillId, out SkillBase skillBase)) - { - skillBase.SetCurrentCoolDown(); - } + return equippedSkills; } // 스킬 쿨타임 업데이트 메소드 public void UpdateSkillCoolDown(string skillId) { - if (skillInstances.TryGetValue(skillId, out SkillBase skillBase)) + SkillBase skillBase = equippedSkills.Find(skill => skill != null && skill.SkillData.id == skillId); + if (skillBase != null) { skillBase.UpdateSkill(Time.deltaTime); } @@ -226,10 +245,13 @@ namespace TON // 스킬 생성 GameObject effectGameObject = ObjectPoolManager.Instance.GetEffect(skillId); Projectile projectile = effectGameObject.GetComponent(); - SkillBase targetSkillBase = GetSkillInstance(skillId); - // 현재 스킬의 쿨타임 시작 + // equippedSkills에서 해당 스킬 찾기 + SkillBase targetSkillBase = GetEquippedSkillFromId(skillId); + + // 현재 스킬의 쿨타임 시작 targetSkillBase.SetCurrentCoolDown(); + // Debug.Log($"스킬 쿨타임 설정: {skillId}, 쿨타임: {targetSkillBase.CurrentCoolDown}"); // 스킬 투사체 초기화 projectile.Init(targetSkillBase.SkillData.damage, targetSkillBase.SkillData.maxHitCount); @@ -245,16 +267,10 @@ namespace TON Rigidbody2D skillRb = effectGameObject.GetComponent(); skillRb.velocity = new Vector2(lastDirection * 5f, 0f); + // 이벤트 발생 targetSkillBase.OnSkillExecuted?.Invoke(); } - public SkillBase GetSkillInstance(string skillId) - { - // 스킬 베이스가 null일때 방어로직 추가 - SkillBase result = skillInstances.GetValueOrDefault(skillId); - Assert.IsNotNull(result, "SkillDataManager.ExecuteSkill() : targetSkillBase is null"); - return result; - } } diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/ControllerUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/ControllerUI.cs index ac5e1b87..7bae4d0e 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/ControllerUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/ControllerUI.cs @@ -61,9 +61,11 @@ namespace TON SkillButtonItem newSkillButton = Instantiate(skillButtonPrefab, skillButtonGroup); newSkillButton.gameObject.SetActive(true); - if (i < activatedSkills.Count) // 해당 인덱스에 활성화된 스킬이 있을 경우 + if (i < activatedSkills.Count && activatedSkills[i] != null) // 해당 인덱스에 활성화된 스킬이 있을 경우 { + // 직접 equippedSkills의 인스턴스를 전달 newSkillButton.Initalize(activatedSkills[i]); + newSkillButton.GetComponent