fix: 스킬 쿨타임 dimd 영역이 정상적으로 동작하지 않는 오류 수정

This commit is contained in:
aube.lee
2025-03-17 23:15:57 +09:00
parent 4a97375d4d
commit 9127ae8ff2
7 changed files with 104 additions and 96 deletions

View File

@@ -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:
<SkillData>k__BackingField:
id:
name:
mpConsumption: 0
damage: 0
coolDown: 0
slotNumber: 0
requiredLevel: 0
maxHitCount: 0
<CurrentCoolDown>k__BackingField: 0
--- !u!1 &9104780789004064627
GameObject:
m_ObjectHideFlags: 0

View File

@@ -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

View File

@@ -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());

View File

@@ -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<Image>().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; // 쿨타임이 없으면 딤드 효과 제거
}
}

View File

@@ -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<SkillBase> GetActiveSkillInstance()
{
if (equippedSkills != null)
if (equippedSkills == null)
{
equippedSkills = new List<SkillBase>();
}
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<Projectile>();
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<Rigidbody2D>();
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;
}
}

View File

@@ -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<Button>().interactable = true;
}
else
{
@@ -79,7 +81,7 @@ namespace TON
{
userItem = PlayerDataManager.Singleton.userItem;
// 게임 진입 시 포션 초기 수량 세팅
// 게임 진입 시 포션 초기 수량 세팅
hpPotion = userItem.hpPotion >= potionLimit ? potionLimit : userItem.hpPotion;
mpPotion = userItem.mpPotion >= potionLimit ? potionLimit : userItem.mpPotion;
@@ -141,7 +143,10 @@ namespace TON
public void OnClickSkillButton(SkillButtonItem button)
{
linkedCharactor.SkillAttack(button.skillBase.SkillData.id);
if (button.skillBase != null)
{
linkedCharactor.SkillAttack(button.skillBase);
}
}
}

View File

@@ -68,7 +68,10 @@ namespace TON
Dictionary<int, SkillBase> skillMap = new Dictionary<int, SkillBase>();
foreach (var skill in activatedSkills)
{
skillMap[skill.SkillData.slotNumber - 1] = skill;
if (skill != null)
{
skillMap[skill.SkillData.slotNumber - 1] = skill;
}
}
for (int i = 0; i < 3; i++)