diff --git a/Gameton-06/Assets/Gameton/Resources/GameData/heart.json b/Gameton-06/Assets/Gameton/Resources/GameData/heart.json new file mode 100644 index 00000000..14b9ff7b --- /dev/null +++ b/Gameton-06/Assets/Gameton/Resources/GameData/heart.json @@ -0,0 +1,11 @@ +{ + "items": [ + { + "characterId": 0, + "currentHearts": 3, + "maxHearts": 3, + "heartRechargeTime": 600, + "lastHeartTime": "" + } + ] +} \ No newline at end of file diff --git a/Gameton-06/Assets/Gameton/Resources/GameData/heart.json.meta b/Gameton-06/Assets/Gameton/Resources/GameData/heart.json.meta new file mode 100644 index 00000000..d93ae705 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Resources/GameData/heart.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d14f7b3e0fd4d9f47adfc2efae717bc7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs index 853d27f4..3d47d507 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/CharacterBase.cs @@ -39,7 +39,7 @@ namespace TON public void Initialize() { int playerIndex = PlayerPrefs.GetInt("SelectedPlayerIndex", 0); - PlayerData playerData = PlayerDataManager.Singleton.players[playerIndex]; + PlayerData playerData = PlayerDataManager.Singleton.playersData[playerIndex]; currentHP = maxHP = playerData.hp; currentSP = maxSP = playerData.mp; diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart.meta b/Gameton-06/Assets/Gameton/Scripts/Character/Heart.meta new file mode 100644 index 00000000..d76d25ac --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8fdf4902484ac024db58b4d3bdf63a71 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs new file mode 100644 index 00000000..b4d43113 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace TON +{ + public class HeartDataManager : SingletonBase + { + public List heartDatas { get; private set; } + + [SerializeField] + private HeartData currentHeartData; + private int characterId; + + protected override void Awake() + { + base.Awake(); + LoadHeartData(); + } + + private void LoadHeartData() + { + heartDatas = JSONLoader.LoadFromResources>("Heart"); + if (heartDatas == null) + { + heartDatas = new List(); + } + } + + + public void CreateNewHeartSystem(int characterId) + { + HeartData heartData = new HeartData(characterId); + heartDatas.Add(heartData); + JSONLoader.SaveToFile(heartDatas, "heart"); + Debug.Log($"heartData test:: {heartData.currentHearts}"); + } + + public void SetCurrentUserHeart() + { + characterId = PlayerPrefs.GetInt("SelectedPlayerIndex", -1); + if (characterId > -1) + { + currentHeartData = heartDatas[characterId]; + if (currentHeartData != null) + { + RechargeHearts(); + } + else + { + Debug.Log("하트 정보 불러오기 중 오류 발생 ::: 초기값으로 재정의 합니다."); + CreateNewHeartSystem(characterId); + } + } + else + { + Debug.LogError("유효하지 않은 캐릭터 정보입니다."); + } + + } + + public void SaveHeartData() + { + heartDatas[characterId] = currentHeartData; + JSONLoader.SaveToFile(heartDatas, "heart"); + } + + private void RechargeHearts() + { + if (currentHeartData.currentHearts >= currentHeartData.maxHearts) return; + + DateTime lastTime = DateTime.Parse(currentHeartData.lastHeartTime); + TimeSpan timePassed = DateTime.Now - lastTime; + int heartsToRecover = (int)(timePassed.TotalSeconds / currentHeartData.heartRechargeTime); + + if (heartsToRecover > 0) + { + currentHeartData.currentHearts = Mathf.Min(currentHeartData.currentHearts + heartsToRecover, currentHeartData.maxHearts); + currentHeartData.lastHeartTime = DateTime.Now.ToString(); + SaveHeartData(); + } + } + + public int GetCurrentHearts() => currentHeartData.currentHearts; + + } +} diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs.meta b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs.meta new file mode 100644 index 00000000..246abadb --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartDataManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca4edb88329beff4985e4e7e946cde59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs new file mode 100644 index 00000000..fdae4504 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs @@ -0,0 +1,11 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace TON +{ + public class HeartSystem : MonoBehaviour + { + + } +} diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs.meta b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs.meta new file mode 100644 index 00000000..0486333b --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/Character/Heart/HeartSystem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: da6da2289d3d066469e66212f110b960 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/Character/PlayerSpawner.cs b/Gameton-06/Assets/Gameton/Scripts/Character/PlayerSpawner.cs index a15372b9..fb2f77ff 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Character/PlayerSpawner.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Character/PlayerSpawner.cs @@ -9,7 +9,7 @@ namespace TON public static void SpawnPlayerCharacter() { - List playerDatas = PlayerDataManager.Singleton.players; + List playerDatas = PlayerDataManager.Singleton.playersData; // 저장된 인덱스 가져오기 int selectedIndex = PlayerPrefs.GetInt("SelectedPlayerIndex", 0); diff --git a/Gameton-06/Assets/Gameton/Scripts/Common/PlayerDataManager.cs b/Gameton-06/Assets/Gameton/Scripts/Common/PlayerDataManager.cs index e325d95b..e21e7c41 100644 --- a/Gameton-06/Assets/Gameton/Scripts/Common/PlayerDataManager.cs +++ b/Gameton-06/Assets/Gameton/Scripts/Common/PlayerDataManager.cs @@ -7,7 +7,7 @@ namespace TON public class PlayerDataManager : SingletonBase { // 사용자가 생성해둔 플레이어 데이터를 싱글톤으로 전역 사용하기 위함 - public List players { get; private set; } + public List playersData { get; private set; } protected override void Awake() { @@ -17,11 +17,12 @@ namespace TON private void LoadPlayerData() { - players = JSONLoader.LoadFromResources>("Player"); - if (players == null) + playersData = JSONLoader.LoadFromResources>("Player"); + if (playersData == null) { - players = new List(); + playersData = new List(); } } + } } diff --git a/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs new file mode 100644 index 00000000..e6209c83 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace TON +{ + [System.Serializable] + public class HeartData + { + public int characterId; + public int currentHearts; + public int maxHearts = 3; + public int heartRechargeTime = 600; // 10분 + public string lastHeartTime; + + // 캐릭터 생성시 하트 데이터 생성자 + public HeartData(int characterId) + { + this.characterId = characterId; + currentHearts = maxHearts; + } + // 하트 소모 시 변경할 객체 생성자자 + public void UseHeart() + { + if (currentHearts > 0) + { + currentHearts--; + lastHeartTime = DateTime.UtcNow.ToString(); // 마지막 사용 시간 갱신 + } + else + { + Debug.Log("하트가 부족합니다!"); + } + } + } +} diff --git a/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs.meta b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs.meta new file mode 100644 index 00000000..33956549 --- /dev/null +++ b/Gameton-06/Assets/Gameton/Scripts/GameData/HeartData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e006f5e55c10bc94b873cdacefc572de +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs index 303d5dc6..3601052a 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/CharaterCreateUI.cs @@ -10,6 +10,8 @@ namespace TON { [SerializeField] private Button createButton; // Create 버튼 참조 [SerializeField] private List playerDatas; + [SerializeField] private List heartDatas; + public GameObject characterCreateUI_Modal; @@ -17,7 +19,9 @@ namespace TON private void Start() { - playerDatas = PlayerDataManager.Singleton.players; + playerDatas = PlayerDataManager.Singleton.playersData; + heartDatas = HeartDataManager.Singleton.heartDatas; + // 처음에는 버튼을 비활성화 createButton.interactable = false; } @@ -53,6 +57,10 @@ namespace TON playerDatas.Add(player); JSONLoader.SaveToFile(playerDatas, "player"); + // 하트 시스템을 생성한다 + HeartDataManager.Singleton.CreateNewHeartSystem(playerDatas.Count); + HeartDataManager.Singleton.SetCurrentUserHeart(); + // 씬 변경 UIManager.Hide(UIList.CharaterCreateUI); diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/CharaterSelectUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/CharaterSelectUI.cs index 3f88729f..c2c08c19 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/CharaterSelectUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/CharaterSelectUI.cs @@ -13,6 +13,7 @@ namespace TON [SerializeField] private Button playButton; // Play 버튼 참조 [SerializeField] private List playerDatas; + [SerializeField] private List heartDatas; private int currentSelectCharacterIndex; @@ -23,7 +24,8 @@ namespace TON private void Start() { - playerDatas = PlayerDataManager.Singleton.players; + playerDatas = PlayerDataManager.Singleton.playersData; + heartDatas = HeartDataManager.Singleton.heartDatas; // 캐릭터를 선택한 이후에 버튼 활성화 할 수 있도록 초기 비활성화 적용 playButton.interactable = false; @@ -58,6 +60,7 @@ namespace TON public void OnClickPlayButton() { PlayerPrefs.SetInt("SelectedPlayerIndex", currentSelectCharacterIndex); + HeartDataManager.Singleton.SetCurrentUserHeart(); UIManager.Hide(UIList.CharaterSelectUI); diff --git a/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs b/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs index 91128e7a..865a03e5 100644 --- a/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs +++ b/Gameton-06/Assets/Gameton/Scripts/UI/TitleUI.cs @@ -14,7 +14,7 @@ namespace TON UIManager.Hide(UIList.TitleUI); // 플레이어가 가지고 있는 캐릭터들의 데이터 불러옴 - List players = PlayerDataManager.Singleton.players; + List players = PlayerDataManager.Singleton.playersData; if (players.Count == 0) {