diff --git a/Assets/JAY/Scripts/PlayerAction/PlayerActionAttack.cs b/Assets/JAY/Scripts/PlayerAction/PlayerActionAttack.cs index 154d9f60..faed4253 100644 --- a/Assets/JAY/Scripts/PlayerAction/PlayerActionAttack.cs +++ b/Assets/JAY/Scripts/PlayerAction/PlayerActionAttack.cs @@ -12,6 +12,7 @@ public class PlayerActionAttack : IPlayerAction { [SerializeField] private float comboDuration = 0.7f; private int maxComboStep = 4; + public bool IsActive { get; private set; } public int CurrentComboStep => comboStep; @@ -35,7 +36,7 @@ public class PlayerActionAttack : IPlayerAction { comboQueued = true; } - if (comboTimer >= comboDuration) { + if (comboTimer >= comboDuration-player.attackSpeedLevel) { ProceedComboOrEnd(); } } diff --git a/Assets/JAY/Scripts/PlayerController.cs b/Assets/JAY/Scripts/PlayerController.cs index b3720cfe..a9b5403b 100644 --- a/Assets/JAY/Scripts/PlayerController.cs +++ b/Assets/JAY/Scripts/PlayerController.cs @@ -29,6 +29,12 @@ public class PlayerController : CharacterBase, IObserver private IPlayerState _currentStateClass { get; set; } private IPlayerAction _currentAction; public IPlayerAction CurrentAction => _currentAction; + + // 강화 관련 + private float attackPowerLevel; + private float moveSpeedLevel; + private float dashCoolLevel; + public float attackSpeedLevel; // 상태 관련 private PlayerStateIdle _playerStateIdle; @@ -49,6 +55,13 @@ public class PlayerController : CharacterBase, IObserver public CharacterController CharacterController => _characterController; public bool IsBattle => _isBattle; public Transform DashEffectAnchor => dashEffectAnchor; + + //대시 쿨타임 관련 + [SerializeField] private float dashCooldownDuration = 1.5f; + private float dashCooldownTimer = 0f; + public bool IsDashOnCooldown => dashCooldownTimer > 0f; + public float DashCooldownRatio => dashCooldownTimer / dashCooldownDuration; + private void Awake() { @@ -72,6 +85,20 @@ public class PlayerController : CharacterBase, IObserver hitEffectController = GetComponentInChildren(); PlayerInit(); + + //강화 수치 적용 + //attackPowerLevel = 1 + (float)UpgradeManager.Instance.upgradeStat.CurrentUpgradeLevel(StatType.AttackPower) / 2; + attackPowerLevel = 1.1f; + //moveSpeedLevel = 1 + (float)UpgradeManager.Instance.upgradeStat.CurrentUpgradeLevel(StatType.MoveSpeed) / 2; + moveSpeedLevel = 1.1f; + //dashCoolLevel = (float)UpgradeManager.Instance.upgradeStat.CurrentUpgradeLevel(StatType.DashCoolDown)/5; + dashCoolLevel = 0.2f; + //attackSpeedLevel = (float)UpgradeManager.Instance.upgradeStat.CurrentUpgradeLevel(StatType.AttackSpeed)/10; + attackSpeedLevel = 0.1f; + + attackPower *= attackPowerLevel; + moveSpeed *= moveSpeedLevel; + dashCooldownDuration -= dashCoolLevel; } private void Update() @@ -81,6 +108,10 @@ public class PlayerController : CharacterBase, IObserver _playerStates[CurrentState].Update(); } + //대시 쿨타임 진행 + if (dashCooldownTimer > 0f) + dashCooldownTimer -= Time.deltaTime; + // Hit 상태거나 게임 끝났을 땐 땐 입력 무시 if (CurrentState == PlayerState.Hit || CurrentState == PlayerState.Dead || CurrentState == PlayerState.Win) return; @@ -231,6 +262,13 @@ public class PlayerController : CharacterBase, IObserver { if (!_isBattle) return; + // 쿨타임 중이면 무시 + if (IsDashOnCooldown) + { + Debug.Log("대시 쿨타임 중"); + return; + } + // 만약 공격 중이면 강제로 공격 종료 if (_currentAction == _attackAction && _attackAction.IsActive) { @@ -244,6 +282,9 @@ public class PlayerController : CharacterBase, IObserver _currentAction = _actionDash; _actionDash.StartAction(this); + + // 쿨타임 시작 + dashCooldownTimer = dashCooldownDuration; } public void OnActionEnded(IPlayerAction action) diff --git a/Assets/KJM/KJM.unity b/Assets/KJM/KJM.unity index c0fd141b..1f6c84d0 100644 --- a/Assets/KJM/KJM.unity +++ b/Assets/KJM/KJM.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4246afb41d86d6a92c3bcf1325630d7871a5e59255be61a927c5994dfc1ea81 -size 75255 +oid sha256:37fc211c69de9c0d422fd90c9cc44437d015cfb19a6598ca1063b6a56b335ada +size 76745 diff --git a/Assets/KJM/KJM_Test/Save/TestScript.cs b/Assets/KJM/KJM_Test/Save/TestScript.cs index 1d863d71..3fc705ff 100644 --- a/Assets/KJM/KJM_Test/Save/TestScript.cs +++ b/Assets/KJM/KJM_Test/Save/TestScript.cs @@ -64,15 +64,15 @@ public class TestScript : MonoBehaviour,ISaveable // heartLevel = save.dungeonSave.heartLevel; // moveSpeedLevel = save.dungeonSave.moveSpeedLevel; // dashCoolDownLevel = save.dungeonSave.dashCoolDownLevel; - stageLevel = save.dungeonSave.stageLevel; + //stageLevel = save.dungeonSave.stageLevel; } if (save?.homeSave != null) { - time = save.homeSave.time; - currentDay = save.homeSave.currentDay; - health = save.homeSave.health; - reputation = save.homeSave.reputation; + //time = save.homeSave.time; + //currentDay = save.homeSave.currentDay; + //health = save.homeSave.health; + //reputation = save.homeSave.reputation; mealCount = save.homeSave.mealCount; houseworkCount = save.homeSave.houseworkCount; @@ -95,16 +95,16 @@ public class TestScript : MonoBehaviour,ISaveable // heartLevel = this.heartLevel, // moveSpeedLevel = this.moveSpeedLevel, // dashCoolDownLevel = this.dashCoolDownLevel, - stageLevel = this.stageLevel, + //stageLevel = this.stageLevel, }, homeSave = new HomeSave { - time = this.time, - currentDay = this.currentDay, - health = this.health, - reputation = this.reputation, + //time = this.time, + //currentDay = this.currentDay, + //health = this.health, + //reputation = this.reputation, mealCount = this.mealCount, houseworkCount = this.houseworkCount } diff --git a/Assets/KJM/KJM_Test/Upgrade/Prefabs/UpgradeTestObject.prefab b/Assets/KJM/KJM_Test/Upgrade/Prefabs/UpgradeTestObject.prefab new file mode 100644 index 00000000..013aaa3e --- /dev/null +++ b/Assets/KJM/KJM_Test/Upgrade/Prefabs/UpgradeTestObject.prefab @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f35cb2acb26a2809ebafa5f001d8297a00968f0c75a13ad3e2c144555bd8c42d +size 2003 diff --git a/Assets/KJM/KJM_Test/Upgrade/Prefabs/UpgradeTestObject.prefab.meta b/Assets/KJM/KJM_Test/Upgrade/Prefabs/UpgradeTestObject.prefab.meta new file mode 100644 index 00000000..77d19355 --- /dev/null +++ b/Assets/KJM/KJM_Test/Upgrade/Prefabs/UpgradeTestObject.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e3768143d1fc350408bf60fc9e748b56 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/KJM/KJM_Test/Upgrade/UpgradeManager.cs b/Assets/KJM/KJM_Test/Upgrade/UpgradeManager.cs index f7bf555e..7598fd85 100644 --- a/Assets/KJM/KJM_Test/Upgrade/UpgradeManager.cs +++ b/Assets/KJM/KJM_Test/Upgrade/UpgradeManager.cs @@ -18,7 +18,6 @@ public enum StatType public class UpgradeManager : Singleton { - //캔버스 프리팹 사용..? Canvas canvas; public GameObject backgroundPanel; @@ -157,8 +156,19 @@ public class UpgradeManager : Singleton //배경 패널 비활성화 StartCoroutine(CoFade(backgroundRectTransform.gameObject, 0.7f,0f,0.2f)); + + if (SceneManager.GetActiveScene().name == "ReDungeon") + { + StartCoroutine(DelayedSceneChange()); // n초 대기 후 전환 + } } + //씬 전환 대기 코루틴 + private IEnumerator DelayedSceneChange() + { + yield return new WaitForSeconds(2f); + GameManager.Instance.ChangeToHomeScene(); + } /// /// 페이드 애니메이션 코루틴 @@ -232,7 +242,8 @@ public class UpgradeManager : Singleton protected override void OnSceneLoaded(Scene scene, LoadSceneMode mode) { - + if(canvas == null) + canvas = FindObjectOfType(); } } diff --git a/Assets/KSH/DungeonLogic.cs b/Assets/KSH/DungeonLogic.cs index 1bc28af7..9a1251c0 100644 --- a/Assets/KSH/DungeonLogic.cs +++ b/Assets/KSH/DungeonLogic.cs @@ -114,8 +114,6 @@ public class DungeonLogic : MonoBehaviour // TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동 GameManager.Instance.PanelManager.GetPanel("ClearPanelBG"); - - StartCoroutine(DelayedSceneChange()); // 5초 대기 후 전환 } } diff --git a/Assets/KSH/DungeonPanelController.cs b/Assets/KSH/DungeonPanelController.cs index 684b3e7a..e4aa34f3 100644 --- a/Assets/KSH/DungeonPanelController.cs +++ b/Assets/KSH/DungeonPanelController.cs @@ -10,6 +10,27 @@ public class DungeonPanelController : MonoBehaviour [SerializeField] private Image[] _playerHealthImages; // color 값 white / black 로 조정 private int _countHealth = 0; + private int visibleHeartCount = 3; // 강화 레벨로 설정됨 + + + void Start() + { + //int level = UpgradeManager.Instance.upgradeStat.CurrentUpgradeLevel(StatType.Heart); // 1~3 + int level = 2; + + visibleHeartCount = 3 + (level - 1); // level 1=3개, 2=4개, 3=5개 + + for (int i = 0; i < _playerHealthImages.Length; i++) + { + var color = _playerHealthImages[i].color; + color.a = (i < visibleHeartCount) ? 1f : 0f; + color = (i < visibleHeartCount) ? Color.white : new Color(1,1,1,0); + _playerHealthImages[i].color = color; + } + + _countHealth = 0; + } + public void SetBossHealthBar(float hp) // hp: 0~300 { float normalizedHp = hp / 300f; // 0~1 사이 값으로 조정 @@ -21,15 +42,15 @@ public class DungeonPanelController : MonoBehaviour { StartCoroutine(WaitForOneSecond()); // out of index error 방지 - if (_countHealth > _playerHealthImages.Length - 1) return false; + if (_countHealth >= visibleHeartCount) return false; _playerHealthImages[_countHealth].color = Color.black; _countHealth++; - return _countHealth <= _playerHealthImages.Length - 1; + return _countHealth < visibleHeartCount; } IEnumerator WaitForOneSecond() { yield return new WaitForSeconds(1.0f); } -} +} \ No newline at end of file diff --git a/Assets/KSH/PlayerStats.cs b/Assets/KSH/PlayerStats.cs index ea614d58..31ed93c6 100644 --- a/Assets/KSH/PlayerStats.cs +++ b/Assets/KSH/PlayerStats.cs @@ -5,7 +5,7 @@ using UnityEngine; using UnityEngine.SceneManagement; using Random = UnityEngine.Random; -public class PlayerStats : MonoBehaviour +public class PlayerStats : MonoBehaviour, ISaveable { public class StatsChangeData // 변경된 스탯 데이터 { @@ -385,4 +385,31 @@ public class PlayerStats : MonoBehaviour } #endregion + + public void ApplySaveData(Save save) + { + if (save?.homeSave != null) + { + TimeStat = save.homeSave.time; + HealthStat = save.homeSave.health; + ReputationStat = save.homeSave.reputation; + //mealCount = save.homeSave.mealCount; + //houseworkCount = save.homeSave.houseworkCount; + } + } + + public Save ExtractSaveData() + { + return new Save + { + homeSave = new HomeSave + { + time = this.TimeStat, + health = this.HealthStat, + reputation = this.ReputationStat, + //mealCount = this.mealCount, + //houseworkCount = this.houseworkCount + } + }; + } } diff --git a/Assets/KSH/ReDungeon.unity b/Assets/KSH/ReDungeon.unity index 2eff2973..f98982ac 100644 --- a/Assets/KSH/ReDungeon.unity +++ b/Assets/KSH/ReDungeon.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:908889f0158f1e1ef86cf9a7ddeb607c5fab7b4afebf4418be91f18329a97003 -size 35082 +oid sha256:e4a5d73fa44bbe32e063a06feceaa87ffb6b9fb899137aab6308e3ec24686255 +size 47132 diff --git a/Assets/KSH/ReHousing.unity b/Assets/KSH/ReHousing.unity index eb32bdf3..d7b2d465 100644 --- a/Assets/KSH/ReHousing.unity +++ b/Assets/KSH/ReHousing.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8807affa9b2db75e9fd8568f3c15d629e1ba75392574134de08d6e970296acc3 -size 43883 +oid sha256:becc72e7dedbc45c9ff4f450d1175d663921ccbdd726b7e0027757fd32272863 +size 46382 diff --git a/Assets/LYM/Scripts/ClearPanelController.cs b/Assets/LYM/Scripts/ClearPanelController.cs index e79991d5..8de3197a 100644 --- a/Assets/LYM/Scripts/ClearPanelController.cs +++ b/Assets/LYM/Scripts/ClearPanelController.cs @@ -61,5 +61,6 @@ public class ClearPanelController : PanelController, IPointerClickHandler { onCompleted?.Invoke(); Hide(); + UpgradeManager.Instance.StartUpgrade(); } } \ No newline at end of file diff --git a/Assets/Scripts/Common/GameManager.cs b/Assets/Scripts/Common/GameManager.cs index 871d1795..57ee12af 100644 --- a/Assets/Scripts/Common/GameManager.cs +++ b/Assets/Scripts/Common/GameManager.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; -public partial class GameManager : Singleton +public partial class GameManager : Singleton, ISaveable { // 게임 진행 상태 private int currentDay = 1; // 날짜 @@ -109,4 +109,33 @@ public partial class GameManager : Singleton { // TODO: 게임 종료 시 로직 추가 } + + public void ApplySaveData(Save save) + { + if (save?.dungeonSave != null) + { + stageLevel = save.dungeonSave.stageLevel; + } + + if (save?.homeSave != null) + { + currentDay = save.homeSave.currentDay; + } + } + + public Save ExtractSaveData() + { + return new Save + { + dungeonSave = new DungeonSave() + { + stageLevel = this.stageLevel, + }, + + homeSave = new HomeSave + { + currentDay = this.currentDay, + } + }; + } }