
기능 구현이 어느정도 완성됨에 따라, 미뤄왔던 기능을 구현하고자 했다.
바로 특정 시간이 되면 쓰러져 잠드는 기능이다.
처음 레퍼런스 게임인 스타듀밸리의 경우 오전 2시 까지 깨어 있을 경우, 그 자리에서 쓰러지고 다음날 평소에 일어나는 6시보다 늦게 다음날 하루를 시작하게 된다.
현재 게임에는 오전 2시에 시간을 멈추는 기능만 있고, 실제로 쓰러지고 늦게 일어나는 기능은 구현하지 않았다.
즉 현재 구현해야하는 기능을 정리하면 다음과 같다.
1. 오전 2시에
2. 어느 씬에서 쓰려져도 집으로 복귀해야하며
3. 시간이 늦는 것 외에는 기존 취침과 동작이 동일해야한다.
1번인 2시에 특정 동작을 하게 하는 것은 포스트 초반에도 언급 했듯 조건문으로 동작할 수 있게 해 놓았다.
private void CalculateInGameTime()
{
// 분->시 계산
if (_inGameMinute >= 60)
{
_inGameHour += (_inGameMinute / 60);
_inGameMinute %= 60;
}
// 00시 01시 02시 계산용
if (_inGameHour >= 24)
{
_inGameHour %= 24;
}
// 2시에 시간을 멈추게 함
if (_inGameHour == 2)
{
IsPlayingTime = false;
}
}
우선 늦잠 잘 수도 있는 기능은 미리 ResetInGameTime(int) 메서드로 구현할 수 있도록 해놨다.
public void WakeUpAtMorning(int p_wakeUpTime)
{
if (p_wakeUpTime < 6) return;
_inGameTotalDay++;
IsPlayingTime = true;
ResetInGameTime(p_wakeUpTime);
CallDayCheck();
CheckDelegate();
}
private void ResetInGameTime(int p_awakeUpTime)
{
_inGameHour = p_awakeUpTime;
_inGameMinute = 0;
_lastCheckedRealTime = 0f;
CallTimeCheck();
}
7이상의 정수를 매게변수로 넣으면 해당하는 날짜로 일어날 수 있게 할 수 있다.
현재, 침대에서 잠이 들 때는 매게변수를 6을 넣어 6시에 일어나는 것을 구현하고 있었다.
만약 늦잠을 구현한다면 WakeUpAtMorning(int) 메서드에 매게변수 8을 넣어 구현할 수 있을 것이라고 생각했다.
문제는 구현사항 2번과 3번 일부이다.
어느씬에서든 집으로 복귀를 구현하기 위해서는 씬 이동의 메서드를 이용할 수 있을 것이라 생각했다.
public void FadeAndLoadScene(string sceneName, Vector3 spawnPosition)
{
if (!_isFading)
{
GameManager.Instance.TimeM.IsPlayingTime = false;
_targetAlpha = 1f;
fadeImage.gameObject.SetActive(true);
fadeImage.DOFade(_targetAlpha, _fadeDuration)
.OnComplete(() => StartCoroutine(FadeAndSwitchScenes(sceneName, spawnPosition)));
}
}
현재 게임에서 사용하는 Scene이동 메서드는 DoTween을 이용하여 페이드인 페이드 아웃 기능까지 한번에 구현이 됐다.
그래서 우선 다음과 같이 구현하고자 했다.
private void TimeOver()
{
GameManager.Instance.SceneControlM.FadeAndLoadScene(SceneName.Farm.ToString(), GameManager.Instance.CharacterM.GetSpawnPoint());
GameManager.Instance.TimeM.WakeUpAtMorning(8);
GameManager.Instance.CropM.UpdateGrowth();
GameManager.Instance.TilemapM.ResetTileStateAtMorning();
GameManager.Instance.DynamicPricingSystem.UpdatePrices();
SaveManager.Instance.SaveGame();
}
private void CalculateInGameTime()
{
// 분->시 계산
if (_inGameMinute >= 60)
{
_inGameHour += (_inGameMinute / 60);
_inGameMinute %= 60;
}
// 00시 01시 02시 계산용
if (_inGameHour >= 24)
{
_inGameHour %= 24;
}
// 2시에 시간을 멈추게 함
if (_inGameHour == 2)
{
IsPlayingTime = false;
TimeOver();
}
}
TimeOver같은 메서드를 만든 뒤 CalculateInGameTime에서 2시에 해당 메서드를 호출하는 것이 처음 아이디어 였다.
그러나 위 방식에는 문제가 하나 있었는데, 페이드인 페이드 아웃이 코루틴으로 진행되는 사이에, FadeAndLoadScene씬 이후에 실행되어야 하는 메서드들이 페이드아웃이 끝나기 전에 실행된다는 문제점이 있었다.
예를 들면 페이드 아웃이 되기도 전에 시간이 이미 빠르게 흐른다던가, Farm Scene이 아닌 곳에서는 Farm Scene에서 진행되어야하는 메서드가 진행이 된다던가 하는 현상이 일어났었다.
고민하던 중에 한가디 다른 아이디어가 생겼는데, 날짜가 바뀔 때 사용되는 Coroutine을 이용한 메서드를 따로 만드는 것이었다.
현재 취침 시에도 팝업창은 뜨지만, 취침 버튼을 눌렀을 때의 연출은 버튼을 누르자 마자 순식간에 이뤄진다.
해당 연출을 보완할 겸, 취침시에 사용될 메서드를 만든다면, 위의 문제점을 보완할 수 있을 것이라는 결론에 이르렀다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 75일차 TIL "추상클래스의 이용" (0) | 2025.01.03 |
|---|---|
| 내일배움캠프 74일차 TIL "Sprite atlas 관련 이슈 해결" (0) | 2025.01.02 |
| 내일배움캠프 72일차 TIL "Transparency Sort Mode" (0) | 2024.12.30 |
| 내일배움캠프 71일차 TIL "시세 변동 시스템" (0) | 2024.12.27 |
| 내일배움캠프 70일차 TIL "Popup UI" (0) | 2024.12.26 |