From ac551330ea19a36fa5af0db74d33271730a4aabb Mon Sep 17 00:00:00 2001 From: "aube.lee" Date: Wed, 19 Feb 2025 14:12:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20IngameUI=EC=9D=98=20=EC=BA=90=EB=A6=AD?= =?UTF-8?q?=ED=84=B0=20stat=20=EB=B3=80=EA=B2=BD=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Resources/UI/Prefabs/UI.InGameUI.prefab | 13 +++--- .../Scripts/Character/CharacterBase.cs | 17 +++++++- .../Scripts/Character/CharacterController.cs | 7 ---- .../Gameton/Scripts/Scenes/StageScene.cs | 11 ++++- .../Assets/Gameton/Scripts/UI/IngameUI.cs | 41 +++++++++++-------- 5 files changed, 55 insertions(+), 34 deletions(-) diff --git a/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.InGameUI.prefab b/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.InGameUI.prefab index a36ad55c..fb384d9e 100644 --- a/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.InGameUI.prefab +++ b/Gameton-06/Assets/Gameton/Resources/UI/Prefabs/UI.InGameUI.prefab @@ -65,11 +65,11 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 + m_Sprite: {fileID: 21300000, guid: 7155d9d3c459a1945a29adc40045dc25, type: 3} + m_Type: 3 m_PreserveAspect: 0 m_FillCenter: 1 - m_FillMethod: 4 + m_FillMethod: 0 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 @@ -310,6 +310,7 @@ MonoBehaviour: monsterHp: {fileID: 5427279369348982334} monsterHpBar: {fileID: 713119143775663342} monsterImage: {fileID: 3115676712305369735} + character: {fileID: 0} --- !u!1 &2837283741072849140 GameObject: m_ObjectHideFlags: 0 @@ -870,11 +871,11 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 + m_Sprite: {fileID: 21300000, guid: 7155d9d3c459a1945a29adc40045dc25, type: 3} + m_Type: 3 m_PreserveAspect: 0 m_FillCenter: 1 - m_FillMethod: 4 + m_FillMethod: 0 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs index 8c01d1b2..c4b5d0f7 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs @@ -28,6 +28,9 @@ namespace TON private VariableJoystick joystick; public Rigidbody2D rb; + public event System.Action OnHPChanged; + public event System.Action OnSPChanged; + public void Start() { @@ -35,7 +38,6 @@ namespace TON joystick = ControllerUI.Instance.joystick; ControllerUI.Instance.linkedCharactor = this; - attackCollider.EnableCollider(false); // 기본 공격 Enable 비활성화 Initialize(); @@ -49,6 +51,9 @@ namespace TON currentHP = maxHP = playerData.hp; currentSP = maxSP = playerData.mp; + + OnHPChanged?.Invoke(currentHP, maxHP); + OnSPChanged?.Invoke(currentSP, maxSP); } @@ -170,6 +175,14 @@ namespace TON public void SkillAttack(string skillId) { + SkillBase skillBase = SkillDataManager.Singleton.GetSkillInstance(skillId); + // 스킬을 사용할 수 있는 스킬포인트가 있는지 판단 + // 스킬 포인트가 부족하다면 스킬을 수행하지 못함 + if (currentSP < skillBase.SkillData.mpConsumption) return; + + currentSP -= skillBase.SkillData.mpConsumption; + OnSPChanged?.Invoke(currentSP, maxSP); + // 스킬 매니저에서 스킬을 쏠 수 있는지 여부를 판단 bool canExecute = SkillDataManager.Singleton.CanExecuteSkill(skillId); if (canExecute) @@ -189,6 +202,8 @@ namespace TON currentHP -= damage; currentHP = Mathf.Clamp(currentHP, 0, maxHP); + OnHPChanged?.Invoke(currentHP, maxHP); + // 체력이 0 아래로 떨어지고 현 상태가 IsAlive 일때만 동작하도록 함 if (currentHP <= 0f && prevHP > 0) { diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterController.cs b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterController.cs index 38c53f73..67d8b399 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterController.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterController.cs @@ -15,12 +15,5 @@ namespace TON linkedCharactor = GetComponent(); } - private void Start() - { - IngameUI.Instance.SetHP(linkedCharactor.currentHP, linkedCharactor.maxHP); - IngameUI.Instance.SetSP(linkedCharactor.currentSP, linkedCharactor.maxSP); - IngameUI.Instance.SetPlayerImage(PlayerDataManager.Singleton.player.type); - } - } } diff --git a/Gameton-06/Assets/Gameton/Scripts/Scenes/StageScene.cs b/Gameton-06/Assets/Gameton/Scripts/Scenes/StageScene.cs index 4eea6fb9..24179431 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Scenes/StageScene.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Scenes/StageScene.cs @@ -42,10 +42,17 @@ namespace TON } // 선택된 캐릭터에 맞는 오브젝트를 생성하거나 적용하는 코드 작성 - PlayerSpawner.SpawnPlayerCharacter(); + if (!PlayerSpawner.SpawnPlayerCharacter()) + { + Debug.LogError("Failed to spawn player character!"); + // 에러 UI를 표시하거나 씬을 다시 로드하는 등의 처리 + // UIManager.Show(UIList.ErrorUI); + // 또는 SceneManager.LoadScene("ErrorScene"); 등 + yield break; + } + SkillDataManager.Singleton.Initalize(); StageManager.Singleton.StartStage(stageId); - UIManager.Show(UIList.IngameUI); UIManager.Show(UIList.OptionUI); UIManager.Show(UIList.ControllerUI); diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/IngameUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/IngameUI.cs index 10a7c46b..d5078d64 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/IngameUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/IngameUI.cs @@ -21,36 +21,43 @@ namespace TON public Image monsterImage; - private float currentHP; - private float maxHP; - private float currentSP; - private float maxSP; private string playerType; + [SerializeField] private CharacterBase character; + + private void OnEnable() { + character = GameObject.FindWithTag("Player").GetComponent(); + playerType = PlayerDataManager.Singleton.player.type; + + if (character != null) + { + character.OnHPChanged += UpdateHPBar; + character.OnSPChanged += UpdateSPBar; + } + // UI가 활성화될 때 저장된 값들로 업데이트 RefreshUI(); } - public void SetHP(float current, float max) + private void OnDisable() { - currentHP = current; - maxHP = max; - if (gameObject.activeInHierarchy) + if (character != null) { - hpBar.fillAmount = current / max; + character.OnHPChanged -= UpdateHPBar; + character.OnSPChanged -= UpdateSPBar; } } - public void SetSP(float current, float max) + private void UpdateHPBar(float current, float max) { - currentSP = current; - maxSP = max; - if (gameObject.activeInHierarchy) - { - spBar.fillAmount = current / max; - } + hpBar.fillAmount = current / max; + } + + private void UpdateSPBar(float current, float max) + { + spBar.fillAmount = current / max; } public void SetPlayerImage(string type) @@ -64,8 +71,6 @@ namespace TON private void RefreshUI() { - if (maxHP > 0) SetHP(currentHP, maxHP); - if (maxSP > 0) SetSP(currentSP, maxSP); if (!string.IsNullOrEmpty(playerType)) UpdatePlayerImage(); }