안녕하세요 투니드입니다 ㅠㅠ
전편은 어떻게 설명해야 할지 감이 안 잡혀서 거의 포기하다시피 했었는데요...
이번편부터는 아무리 그래도 최대한 설명을 해보도록 하겠습니다! ㅠㅠ...
이번 편에서는 작물 컨테이너(ex) MainSceneCropsContainer)에서 데이터를 저장하고 불러오는 과정을 해보도록 하겠습니다!
현재 전편까지는 작물을 심고 재실행을 하거나, 다른 씬을 갔다가 돌아오면

이렇게 스프라이트 참조 에러가 계속해서 발생하는 문제가 있었습니다! 우선 이걸 고쳐보죠!
MainSceneCropsContainer 스크립터블 오브젝트에 있는 데이터를 먼저 없애주세요!

전편에서 했던 작업이 결국은 땅을 파면 해당 위치값을 기준으로 여기 이 스크립터블 오브젝트에 데이터 리스트를 하나 삽입하면서 게임오브젝트를 하나 생성하고, 씨앗을 심으면 그 씨앗에 대한 데이터들을 받아서 게임오브젝트의 스프라이트 렌더러를 컨트롤하는 동시에

씨앗에 정보가 심어지면, Tick()메서드를 아래까지 검사하는 로직입니다!
위 과정을 어떻게 설명해드려야 할지 몰라서 전편에서는 생략했었습니다 ㅠㅠ (더 많이 노력하겠습니다!)
아무튼 데이터를 없앴다면 TileMapCropsManager.cs로 갑니다!

OnDestroy 메서드를 하나 정의해 주는데요! 파괴될 때 각 CropTile 하나하나의 renderer를 NULL로 만들어줍니다!
이렇게 하면 스프라이트 렌더러를 계속해서 참조하려고 해서 났던 위에 에러는 어느 정도 잡힐 겁니다!
그다음 VisualizeTile() 메서드를 하나 만들어줍니다!

결과적으로 여기서 해줄 것은 스크립터블 오브젝트에 저장된 위치라면, 밭만 갈려있는지 씨앗이 심어져 있는지 확인하고
OnDestroy에서 renderer를 NULL로 만들어놓았다면 다시금 타일을 생성해 주는 겁니다!
그리고 빨간 네모박스에 있는 내용은 CreatePlowedTile() 안에 있던 동일한 내용을 그대로 잘라내서 옮겨온 겁니다!
그리고 이것을 언제 실행시켜 주느냐, Start()에서 한 번만 시켜주는 게 좋겠죠? 그러기 전에 VisualizeMap()이라는 메서드를 하나 만들어줄 겁니다!

왜 메서드가 하나 더 필요하냐, 바로 스크립터블 오브젝트에 저장된 모든 타일에 접근해서 똑같이 작업을 해주어야 하기 때문입니다!
이렇게 설정해 주고 Start()에서 마지막에 한번 호출을 시켜줍니다!
이렇게 해주고 나서 실행을 해보면

네 왔다 갔다 해도 잘 됩니다! 그런데 여기서 저는 문제가 생기지 않았는데! 문제가 생길 수도 있습니다!
어떤 문제냐면 씨앗이 심어진 씬에서 예를 들어 씬 전환을 했는데 새로 로드된 씬에서 씨앗이 심어진 것처럼 스프라이트가 남아있는 현상이 있을 수 있습니다!
이게 왜 그런 거냐면 저희가 씬을 비동기로 사용하고 있잖아요? 편의상 메인씬을 A씬 RoadScene(두 번째 씬)을 B씬이라고 할게요!
A씬에서 B씬으로 넘어갈 때 A씬을 언로드 하고 B씬을 로드합니다! 그리고 나서 로드가 완료되면 씬 전환이 일어나죠!
그런데 놀랍게도 A씬의 데이터가 일부 남아있을 수 있어요! 비동기의 버그라고 해야 할까요?
그래서 확실하게 B씬이 로드가 끝났으면 B씬을 활성화 할거다! 라고 한번 더 코드를 추가해주는 작업이 필요합니다!
GameSceneManager.cs로 갑니다!

여기서 새로 로드된 씬을 활성화시켜주면 됩니다! 이렇게 해서 확인해 주면! 버그가 나오지 않는 걸 확인하실 수 있습니다!
그리고 버그를 두 개 정도 더 잡아보겠습니다 하나는

밭이 갈린 곳도 계속 갈 수 있고, 스크립터블 오브젝트에 데이터가 계속해서 중복으로 들어간다는 것입니다!
그리고 다른 하나는

이렇게 씨앗을 무한으로 즐길 수(?) 있는 문제가 있습니다! ㅠㅠ 둘 다 바로 해결하러 가보죠!
먼저 다시 TileMapCropsManager.cs로 옵니다!

먼저 2개의 메서드를 만들어 줄 거예요! 하나는 밭이 갈려있는지 확인하고, 하나는 씨앗이 심어져 있는지 확인을 합니다!

밭을 갈 때 밭이 갈려있는지 간단하게 확인을 하나 해줍니다!
이렇게 해주면 하나는 완성이 됐고, 다른 하나도 Seed에서 확인을 하면 좋았겠는데, 문제는 씨앗의 소비는 계속해서 된다는 거예요!
그래서 조금 다른 곳으로 가서 처리를 해줄 겁니다! SeedTile.cs 로 갑니다!

여기서 밭이 갈려있는지만 확인을 하고 있었는데요! 씨앗이 심어져 있는지까지 확인을 해줄 겁니다! CropsManager.cs로 갑니다!

여기서 !SeedCheck인지 확인만 해주면 끝납니다! 확인해 볼까요?

일단 밭은 딱 한 번만 갈립니다! 잘 되죠!

그리고 씨앗 역시 한번만 심어집니다! 잘됩니다!
이번 편은 여기까지 하겠습니다!
'StardewValleyLikeGameCloneCoding' 카테고리의 다른 글
Stardew Valley like Game in Unity Episode 21 Audio and Music manager (0) | 2025.03.26 |
---|---|
Stardew Valley like Game in Unity Episode 19-1 Crops data container (0) | 2025.03.25 |
Stardew Valley like Game in Unity / GitHub (0) | 2025.03.25 |
Stardew Valley like Game in Unity Episode 18-2 Crafting (1) | 2025.03.24 |
Stardew Valley like Game in Unity Episode 18-1 Crafting (0) | 2025.03.24 |