안녕하세요 투니드입니다!
이번 시간에는 시간의 흐름에 따라서 나무에서 씨앗이 자라는 것을 해보겠습니다!
먼저 나무 프리팹에 TimeAgent.cs파일을 만들어서 붙여주겠습니다!
이 TimeAgent파일은 시간에 흐름에 따라 변화를 주고 싶은 오브젝트에 다양하게 쓸 수 있도록 만들어보는 걸 목표로 할게요! 예를 들어 씨앗이 자란다던지, 열매가 열린다던지, 나무의 씨앗이 자란다던지 하는 일들이요!
우선 나무에 씨앗이 자라는 것을 해보죠!
DayTimeController.cs 로 갑니다! DayTimeController에서 게임 내의 시간을 컨트롤하고 있고 여기에서의 시간흐름을 TimeAgent.cs로 넘겨서 사용하기 위해서입니다!
리스트로 TimeAgent 변수를 선언하고 Awake에서 초기화를 해줍니다!
그리고 구독시스템으로 구독, 구독해제를 만들어줬어요! 이렇게 해서 시간 흐름에 따라 필요한 작업은 TimeAgent.cs파일을 붙여놓고 DayTimeController.cs에 구독(연결)을 해줘서 관리를 해주게끔 만들었습니다!
DayTimeController에서 시간의 흐름을 전부 처리해줄 예정이니, 싱글톤인 GameManager.cs 에서 파일을 참조시키겠습니다!
그러면 이제 어디서든 DayTimeController에 접근을 할 수 있게 됐습니다!
TimeAgent.cs로 가보죠!
우선 TimeAgent 자기 자신을 DayTimeController.cs에 구독시스템에 구독과 해제를 등록하겠습니다!
다음으로는 델리게이트를 통해서 시간 흐름에 따라서 지속적으로 호출시킬 수 있는 메서드를 만들어 두겠습니다!
그리고 우선 나무에서 씨앗(?)을 생성시킬 것이기 때문에 생성을 관리하는 새로운 스크립트 파일을 하나 만들어줍니다!
ItemSpawner.cs 파일을 만들고 생성할 아이템과 개수를 직렬화를 통해 받을 수 있도록 합니다!
그리고 나서 ResourceNode.cs에 있는 Hit()메서드안에 있는 내용을 일부 복사해 와서 갈무리해서 사용하겠습니다!
ItemSpawner는 반드시 TimeAgent와 같이 쓰게 설계가 되어있어서 RequireComponent속성으로 TiemAgent를 붙여줍니다!
Spawn() 메서드를 만드는데 아이템을 드랍시키는 것과 같은 로직을 사용하는 대신, Random.value를 통해서 50% 확률로
생성되게끔 만들어보겠습니다! (probability 조절 시 확률 조정 가능!)
그리고 나서 Start에서 TimeAgent에 만들었던 델리게이트를 받아와서 Spawn()과 연결해 줍니다!
이제 TimeAgent의 onTimeTick을 언제 호출해주냐 만 정하면 되겠죠?
Update에 agents 들을 전부 프레임단위로 실행시키면 어떻게 될까요?
정답은 풍년이 됩니다
확률을 반으로 했는데도 이러네요! 프레임당 실행이 이렇게 무섭습니다!
조금 다른 방식으로 접근해 보죠!
아 그리고 게임을 시작할 때마다 00시로 시작하는 게 조금 이상하죠? 저는 스타듀밸리랑 똑같이 6시에 하루를 시작하도록 해보겠습니다!
startAtTime 변수를 만들어주고 60 * 60 * 6 = 21600초를 계산해서 넣어줬습니다!
그리고 나서 확인을 해주면!(씨앗은 생성을 막았습니다 일단!)
이렇게 밝게, 6시에 시작할 수 있습니다!
그럼 이제 씨앗이 생성되는 걸 프레임 단위로 생성하는 게 아닌 다른 방식으로 생성시켜 볼게요!
게임시간으로 15분마다 확률적으로 한 개씩 스폰되게 만드는 건 어떨까요? 원하는 방식이 있다면 원하는 대로 구현해 주시면 됩니다!
이렇게 게임시간 15분마다 체크를 해줄 건데 oldPhase라는 변수를 하나 더 이용해서 오차나 중복 없이 처리를 할 겁니다!
아까 Update에 있던 for문을 TimeAgent라는 함수로 빼주고요! Update에 TimeAgent()를 선언해 둡니다!
그러면 Time은 시간흐름에 따라서 계속해서 증가하고 phaseLength가 900이니까 15분마다 phase값이 1씩 증가하겠죠?
oldPhase는 최초 0이고 phase가 1이 되는 순간 if문 안으로 들어가서 oldPhase를 1로 만들고, TimeAgent들의 델리게이트를 실행하도록 할 겁니다!
그러면 왜 phaseLength -= Time.deltaTime으로 안 하고 이런 식으로 하는지 궁금하실 수 있습니다!
프레임 단위는 생각보다! 아주 작은 시간입니다! 그러다 보니
이런 식으로 처리를 해버리게 되면 중복으로 if문 안쪽으로 들어갈 가능성이 있기 때문에 단계별로 체크해서 아이템을 소환하는 겁니다! 이해가 되셨나요?!
이렇게 하면 게임시간으로 15분마다 50% 확률로 씨앗을 만드는 나무가 완성됐습니다!
이번 편은 여기까지 하겠습니다~
'StardewValleyLikeGameCloneCoding' 카테고리의 다른 글
Stardew Valley like Game in Unity Episode 13-2 Growing crops (0) | 2025.03.13 |
---|---|
Stardew Valley like Game in Unity Episode 13-1 Growing crops (0) | 2025.03.12 |
Stardew Valley like Game in Unity Episode 11 Tools functionality (0) | 2025.03.11 |
Stardew Valley like Game in Unity Episode 10-2 Tools Functionality (0) | 2025.03.10 |
Stardew Valley like Game in Unity Episode 10-1 Tools Functionality (0) | 2025.03.10 |