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 재설정
_player.SetState(PlayerState.Win);
// TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동
StartCoroutine(DelayedSceneChange()); // 3초 대기 후 전환
}
}

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

Binary file not shown.

View File

@ -36,17 +36,31 @@ public class PlayerStats : MonoBehaviour
private float previousAddHealth = 0f;
private void Start()
public static PlayerStats Instance;
private void Awake()
{
_gameConstants = new GameConstants();
_valueByAction = new ValueByAction();
_valueByAction.Initialize(); // 값 초기화
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject); // 데이터값 유지용
}
else
{
Destroy(gameObject);
}
_gameConstants = new GameConstants();
HealthStat = _gameConstants.baseHealth;
TimeStat = _gameConstants.baseTime;
ReputationStat = _gameConstants.baseReputation;
}
private void Start()
{
_valueByAction = new ValueByAction();
_valueByAction.Initialize(); // 값 초기화
}
// 현재 체력으로 해당 행동이 가능한 지 확인
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")]
[SerializeField] private TMP_Text dayCountText;
[Header("Player Stat Class")]
[SerializeField] private PlayerStats playerStats;
private GameConstants _gameConstants = new GameConstants();
private void Start()
{
if (playerStats == null)
{
playerStats = FindObjectOfType<PlayerStats>();
}
playerStats.OnStatsChanged += UpdateStat;
PlayerStats.Instance.OnStatsChanged += UpdateStat;
GameManager.Instance.OnDayChanged += UpdateDay;
InitStats();
}
private void OnDisable()
{
// 이벤트 구독 해제
PlayerStats.Instance.OnStatsChanged -= UpdateStat;
GameManager.Instance.OnDayChanged -= UpdateDay;
}
private void InitStats()
{
healthBarImage.fillAmount = _gameConstants.baseHealth / _gameConstants.maxHealth;
healthText.text = $"{_gameConstants.baseHealth}/{_gameConstants.maxHealth}";
var nowHealth = PlayerStats.Instance.HealthStat;
var nowReputation = PlayerStats.Instance.ReputationStat;
var nowTime = PlayerStats.Instance.TimeStat;
reputationBarImage.fillAmount = _gameConstants.baseReputation / _gameConstants.maxReputation;
reputationText.text = $"{_gameConstants.baseReputation}/{_gameConstants.maxReputation}";
clockTimeText.text = $"{_gameConstants.baseTime}:00";
ampmText.text = "AM";
SetStat(nowTime, nowReputation, nowHealth);
}
private void UpdateStat(PlayerStats.StatsChangeData statData)
{
var timeVlaue = statData.Time;
var reputationVlaue = statData.Reputation;
var heathVlaue = statData.Health;
SetStat(statData.Time, statData.Reputation, statData.Health);
}
healthBarImage.fillAmount = heathVlaue / _gameConstants.maxHealth;
healthText.text = $"{heathVlaue}/{_gameConstants.maxHealth}";
private void SetStat(float time, float reputation, float health)
{
healthBarImage.fillAmount = health / _gameConstants.maxHealth;
healthText.text = $"{health}/{_gameConstants.maxHealth}";
reputationBarImage.fillAmount = reputationVlaue / _gameConstants.maxReputation;
reputationText.text = $"{reputationVlaue}/{_gameConstants.maxReputation}";
reputationBarImage.fillAmount = reputation / _gameConstants.maxReputation;
reputationText.text = $"{reputation}/{_gameConstants.maxReputation}";
if (timeVlaue > 12) // 오후, 13부터
if (time > 12) // 오후, 13부터
{
timeVlaue -= 12;
clockTimeText.text = $"{timeVlaue}:00";
time -= 12;
clockTimeText.text = $"{time}:00";
ampmText.text = "PM";
}
else // 오전
{
clockTimeText.text = $"{timeVlaue}:00";
clockTimeText.text = $"{time}:00";
ampmText.text = "AM";
}
dayCountText.text = GameManager.Instance.CurrentDay.ToString();
}
private void UpdateDay(int day)

View File

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

View File

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

View File

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

View File

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