DEG-124 [Feat] 씬 이동 구현

This commit is contained in:
Sehyeon 2025-05-02 14:20:31 +09:00
parent e198af6c19
commit c3a7814c94
9 changed files with 73 additions and 68 deletions

View File

@ -90,7 +90,10 @@ public class DungeonLogic : MonoBehaviour
_dungeonPanelController.SetBossHealthBar(0.0f); // 보스 체력 0 재설정 _dungeonPanelController.SetBossHealthBar(0.0f); // 보스 체력 0 재설정
_player.SetState(PlayerState.Win); _player.SetState(PlayerState.Win);
// TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동 // TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동
StartCoroutine(DelayedSceneChange()); // 3초 대기 후 전환
} }
} }

BIN
Assets/KSH/DungeonTestScene.unity (Stored with Git LFS)

Binary file not shown.

View File

@ -36,16 +36,30 @@ public class PlayerStats : MonoBehaviour
private float previousAddHealth = 0f; private float previousAddHealth = 0f;
private void Start() public static PlayerStats Instance;
private void Awake()
{ {
_gameConstants = new GameConstants(); if (Instance == null)
_valueByAction = new ValueByAction(); {
_valueByAction.Initialize(); // 값 초기화 Instance = this;
DontDestroyOnLoad(gameObject); // 데이터값 유지용
}
else
{
Destroy(gameObject);
}
_gameConstants = new GameConstants();
HealthStat = _gameConstants.baseHealth; HealthStat = _gameConstants.baseHealth;
TimeStat = _gameConstants.baseTime; TimeStat = _gameConstants.baseTime;
ReputationStat = _gameConstants.baseReputation; ReputationStat = _gameConstants.baseReputation;
} }
private void Start()
{
_valueByAction = new ValueByAction();
_valueByAction.Initialize(); // 값 초기화
}
// 현재 체력으로 해당 행동이 가능한 지 확인 // 현재 체력으로 해당 행동이 가능한 지 확인
public bool CanPerformByHealth(ActionType actionType) public bool CanPerformByHealth(ActionType actionType)

BIN
Assets/KSH/ReHousing.unity (Stored with Git LFS)

Binary file not shown.

View File

@ -22,59 +22,57 @@ public class StatPanelController : MonoBehaviour
[Header("Day")] [Header("Day")]
[SerializeField] private TMP_Text dayCountText; [SerializeField] private TMP_Text dayCountText;
[Header("Player Stat Class")]
[SerializeField] private PlayerStats playerStats;
private GameConstants _gameConstants = new GameConstants(); private GameConstants _gameConstants = new GameConstants();
private void Start() private void Start()
{ {
if (playerStats == null) PlayerStats.Instance.OnStatsChanged += UpdateStat;
{
playerStats = FindObjectOfType<PlayerStats>();
}
playerStats.OnStatsChanged += UpdateStat;
GameManager.Instance.OnDayChanged += UpdateDay; GameManager.Instance.OnDayChanged += UpdateDay;
InitStats(); InitStats();
} }
private void OnDisable()
{
// 이벤트 구독 해제
PlayerStats.Instance.OnStatsChanged -= UpdateStat;
GameManager.Instance.OnDayChanged -= UpdateDay;
}
private void InitStats() private void InitStats()
{ {
healthBarImage.fillAmount = _gameConstants.baseHealth / _gameConstants.maxHealth; var nowHealth = PlayerStats.Instance.HealthStat;
healthText.text = $"{_gameConstants.baseHealth}/{_gameConstants.maxHealth}"; var nowReputation = PlayerStats.Instance.ReputationStat;
var nowTime = PlayerStats.Instance.TimeStat;
reputationBarImage.fillAmount = _gameConstants.baseReputation / _gameConstants.maxReputation; SetStat(nowTime, nowReputation, nowHealth);
reputationText.text = $"{_gameConstants.baseReputation}/{_gameConstants.maxReputation}";
clockTimeText.text = $"{_gameConstants.baseTime}:00";
ampmText.text = "AM";
} }
private void UpdateStat(PlayerStats.StatsChangeData statData) private void UpdateStat(PlayerStats.StatsChangeData statData)
{ {
var timeVlaue = statData.Time; SetStat(statData.Time, statData.Reputation, statData.Health);
var reputationVlaue = statData.Reputation; }
var heathVlaue = statData.Health;
healthBarImage.fillAmount = heathVlaue / _gameConstants.maxHealth;
healthText.text = $"{heathVlaue}/{_gameConstants.maxHealth}";
reputationBarImage.fillAmount = reputationVlaue / _gameConstants.maxReputation;
reputationText.text = $"{reputationVlaue}/{_gameConstants.maxReputation}";
if (timeVlaue > 12) // 오후, 13부터 private void SetStat(float time, float reputation, float health)
{
healthBarImage.fillAmount = health / _gameConstants.maxHealth;
healthText.text = $"{health}/{_gameConstants.maxHealth}";
reputationBarImage.fillAmount = reputation / _gameConstants.maxReputation;
reputationText.text = $"{reputation}/{_gameConstants.maxReputation}";
if (time > 12) // 오후, 13부터
{ {
timeVlaue -= 12; time -= 12;
clockTimeText.text = $"{timeVlaue}:00"; clockTimeText.text = $"{time}:00";
ampmText.text = "PM"; ampmText.text = "PM";
} }
else // 오전 else // 오전
{ {
clockTimeText.text = $"{timeVlaue}:00"; clockTimeText.text = $"{time}:00";
ampmText.text = "AM"; ampmText.text = "AM";
} }
dayCountText.text = GameManager.Instance.CurrentDay.ToString();
} }
private void UpdateDay(int day) private void UpdateDay(int day)

View File

@ -7,7 +7,6 @@ using UnityEngine.Serialization;
[RequireComponent(typeof(Rigidbody))] [RequireComponent(typeof(Rigidbody))]
public class InteractionController : MonoBehaviour public class InteractionController : MonoBehaviour
{ {
[SerializeField] PlayerStats playerStats;
[SerializeField] LayerMask interactionLayerMask; [SerializeField] LayerMask interactionLayerMask;
[FormerlySerializedAs("housingCanvasManager")] [FormerlySerializedAs("housingCanvasManager")]
[Header("UI 연동")] [Header("UI 연동")]
@ -18,7 +17,7 @@ public class InteractionController : MonoBehaviour
private void Start() private void Start()
{ {
playerStats.OnWorked += SuddenAfterWorkEventHappen; PlayerStats.Instance.OnWorked += SuddenAfterWorkEventHappen;
} }
// 상호작용 가능한 사물 범위에 들어올 때 // 상호작용 가능한 사물 범위에 들어올 때
@ -60,10 +59,18 @@ public class InteractionController : MonoBehaviour
housingCanvasController.ShowInteractionButton(interactionTexts.ActionText,interactionTexts.DescriptionText,()=> housingCanvasController.ShowInteractionButton(interactionTexts.ActionText,interactionTexts.DescriptionText,()=>
{ {
if (playerStats.CanPerformByHealth(interactionType)) if (PlayerStats.Instance.CanPerformByHealth(interactionType))
{ {
playerStats.PerformAction(interactionType); PlayerStats.Instance.PerformAction(interactionType);
interactionAnimationPanelController.ShowAnimationPanel(interactionType,interactionTexts.AnimationText);
if (interactionType == ActionType.Dungeon)
{
GameManager.Instance.ChangeToGameScene();
}
else
{
interactionAnimationPanelController.ShowAnimationPanel(interactionType,interactionTexts.AnimationText);
}
} }
else else
{ {

View File

@ -6,8 +6,6 @@ using UnityEngine.SceneManagement;
public partial class GameManager : Singleton<GameManager> public partial class GameManager : Singleton<GameManager>
{ {
[SerializeField] private PlayerStats playerStats;
private Canvas _canvas; private Canvas _canvas;
// 게임 진행 상태 // 게임 진행 상태
@ -27,19 +25,7 @@ public partial class GameManager : Singleton<GameManager>
{ {
// 오디오 초기화 // 오디오 초기화
InitializeAudio(); InitializeAudio();
PlayerStats.Instance.OnDayEnded += AdvanceDay;
// PlayerStats의 하루 종료 이벤트 구독
if (playerStats == null)
{
playerStats = FindObjectOfType<PlayerStats>();
}
if (playerStats == null)
{
Debug.LogError("PlayerStats 컴포넌트를 찾을 수 없습니다.");
return;
}
playerStats.OnDayEnded += AdvanceDay;
} }
#region #region
@ -74,12 +60,12 @@ public partial class GameManager : Singleton<GameManager>
public void ChangeToGameScene() public void ChangeToGameScene()
{ {
SceneManager.LoadScene("Game"); // 던전 Scene SceneManager.LoadScene("DungeonTestScene"); // 던전 Scene
} }
public void ChangeToHomeScene() public void ChangeToHomeScene()
{ {
SceneManager.LoadScene("Housing"); // Home Scene SceneManager.LoadScene("ReHousing"); // Home Scene
} }
// TODO: Open Setting Panel 등 Panel 처리 // TODO: Open Setting Panel 등 Panel 처리
@ -94,10 +80,7 @@ public partial class GameManager : Singleton<GameManager>
private void OnDestroy() private void OnDestroy()
{ {
if (playerStats != null) PlayerStats.Instance.OnDayEnded -= AdvanceDay; // 이벤트 구독 해제
{
playerStats.OnDayEnded -= AdvanceDay; // 이벤트 구독 해제
}
} }
private void OnApplicationQuit() private void OnApplicationQuit()

View File

@ -53,7 +53,7 @@ public partial class GameManager
if (stageLevel < GameConstants.maxStage) // 현재 스테이지 1 혹은 2 if (stageLevel < GameConstants.maxStage) // 현재 스테이지 1 혹은 2
return EndingType.Bad; return EndingType.Bad;
if (playerStats.ReputationStat >= happyEndReputation) // 평판이 일정 수치 이상 if (PlayerStats.Instance.ReputationStat >= happyEndReputation) // 평판이 일정 수치 이상
return EndingType.Happy; return EndingType.Happy;
return EndingType.Normal; return EndingType.Normal;

View File

@ -6,9 +6,9 @@ EditorBuildSettings:
serializedVersion: 2 serializedVersion: 2
m_Scenes: m_Scenes:
- enabled: 1 - enabled: 1
path: Assets/Scenes/Main.unity path: Assets/KSH/ReHousing.unity
guid: 99c9720ab356a0642a771bea13969a05 guid: b748e35b920bde64cbd6ffe5fdb43e23
- enabled: 1 - enabled: 1
path: Assets/Scenes/Housing.unity path: Assets/KSH/DungeonTestScene.unity
guid: 02daaec42d605494180038d387d4a776 guid: 4563b107911b0e54cbdf659694a6f17a
m_configObjects: {} m_configObjects: {}