From e41dbd5d50d3855328a9a86788a272288f0348c4 Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Thu, 20 Feb 2025 16:10:43 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=8A=A4=ED=82=AC=EB=A1=9C=20=EC=9D=B8?= =?UTF-8?q?=ED=95=9C=20=EB=A7=88=EB=82=98=20=EC=86=8C=EB=AA=A8=20=ED=9B=84?= =?UTF-8?q?=20=EC=9E=90=EC=97=B0=20=ED=9A=8C=EB=B3=B5=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Character/CharacterBase.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs index 2e63ea2c..b5580301 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs @@ -37,6 +37,10 @@ namespace TON public event System.Action OnSPChanged; public event System.Action OnDeathCompleted; // 사망 애니메이션 종료 이벤트 + [SerializeField] private float mpRecoveryRate = 1f; // MP 회복량 + [SerializeField] private float mpRecoveryInterval = 3f; // 회복 간격(초) + [SerializeField] private bool isRecovering = false; + public void Start() { @@ -192,6 +196,26 @@ namespace TON attackCollider.EnableCollider(false); } + + // MP 회복 코루틴 + private IEnumerator RecoverSP() + { + isRecovering = true; + + while (currentSP < maxSP) + { + yield return new WaitForSeconds(mpRecoveryInterval); + + if (currentSP < maxSP) + { + currentSP = Mathf.Min(maxSP, currentSP + mpRecoveryRate); + OnSPChanged?.Invoke(currentSP, maxSP); + } + } + + isRecovering = false; + } + public void SkillAttack(string skillId) { SkillBase skillBase = SkillDataManager.Singleton.GetSkillInstance(skillId); @@ -212,6 +236,12 @@ namespace TON // 스킬 매니저에 스킬 발사 요청 SkillDataManager.Singleton.ExecuteSkill(skillId, firePoint, lastDirection); + + // RecoverSP 가 이미 진행중인 경우 이중으로 코루틴을 실행하지 않도록 함함 + if (!isRecovering) + { + StartCoroutine(RecoverSP()); + } } }