안녕하세요! 투니드입니다!

이번 편에서는 식물을 수확하고, 자란 자리를 청소하는 작업을 해보겠습니다!

 

먼저 캐릭터의 손을 도구처럼 사용하여 작물을 수확할 수 있게 만들어줄 겁니다! ToolsCharacterController.cs파일로 갑니다!

ToolsCharacterController.cs

 

먼저 ToolAction 타입의 변수를 하나 선언해서 동작을 정의해주러 가겠습니다!

ToolsCharacterController.cs

 

저한테는 내용이 너무 어렵습니다 그래서 시간이 꽤 많이 걸렸네요! 주석을 보시면서 공부하시면 좋을 것 같아요!

UseToolGrid 메서드로 옵니다! 밭을 갈거나 씨를 뿌리거나 하는 메서드였는데 기능을 하나 더 추가해 줄게요!

먼저 손으로만 작물을 채집할 것이기 때문에 item==null 이라면 return;만 하던 곳에 수확을 할 수 있는 로직을 하나 추가해 볼게요!

 

PickUpTile()메서드를 만들고 onTilePickUp에 등록된 메서드를 실행시킵니다!

ToolAction은 Scriptable Object 였죠? 그렇다면 수확할 동작 역시 정의하고 만들어줘야 합니다!

OnTilePickUpAction.cs 파일을 하나 만들어줍니다

OnTilePickUpAction.cs

 

ToolAction을 역시 상속받고 CropsManager.cs/PickUp() 메서드를 만들어 실행시키는 걸로 하겠습니다!

CropsManager.cs로 갑니다!

 

PickUp() 메서드를 만들기 전에 먼저 CropTile.class 내부에 프로퍼티와 작물을 초기화시켜 주는 메서드를 하나씩 만들어주겠습니다!

CropsManager.cs/CropTile.class

 

Complete는 심어진 Crop이 Null이 아니라면 성장한 시간과 총 성장시간을 비교해서 bool로 리턴을 해주는 프로퍼티입니다! 이렇게 프로퍼티로 정의를 해놓으면 어디서든 간단하게 작물이 다 자랐는지 확인할 수 있겠죠?

 

그리고 Harvested()는 작물을 수확하고 나면 심어졌던 작물의 정보들을 초기화하는 메서드입니다!

모든 정보를 초기화하고 Destory가 아닌 SetActive(false)를 해줍니다! 이렇게 하는 이유는 나중에 다른 위치에서 SetActive(true)로 사용할 수도 있고 같은 자리에 다시 씨앗을 심는다면 데이터만 덮어 씌어주면 되기 때문입니다!

 

그럼 이제 PickUp()메서드를 만들러 가보죠!

CropsManager.cs/PickUp()

 

먼저 타일값을 받아온 걸로 자리에 작물이 있는지 확인하고, 작물의 정보를 가져와 아까 만들었던 프로퍼티를 사용해서

전부 자랐는지 비교를 해줍니다!

전부 다 자랐다면, ItemSpawnManager를 통해서 현재 작물이 있는 타일 자리에(오프셋은 그냥 제가 심심해서 넣어봤습니다)

 수확할 아이템을 설정한 수량만큼 스폰해 주는 겁니다!

이렇게 설정해 주고 실행해 주면 작물 수확이 되질 않습니다! 왜냐하면

Tick()메서드에서 작물이 다 자라는 순간 crop을 null로 만들어주고 있어요! 이 부분을 수정해야 합니다!

CropsManager.cs/Tick()

 

맨 아래에 있던 로직을 위로 올렸습니다! 작물이 다 자랐다면 continue로 넘기게끔 바꿔줬어요!

그러면 이제 테스트를 해봅시다! 먼저 ToolAction을 새로 만들었었죠? 스크립터블 오브젝트로 하나 더 만들어보죠!

 

이 스크립터블 오브젝트는 존재자체의 의미가 있는 거라서 이름이고 뭐고 만들기만 하고 아무것도 건들지 않았습니다!

만들어 주고 나서

MainCharacter Inspector

 

ToolsCharacterController에 On Tile Pickup으로 등록해줍니다! 이렇게 등록까지 마쳤다면

실행을 시켜보죠!

Game

 

이렇게 테스트 수확이 정상적으로 되는 걸 확인하실 수 있을 겁니다!

 

작물 수확하는 거 하나가 아주 복잡하죠...ㅠ

왜 이렇게 복잡하게 하는 걸까요? 

수확 작업을 단순하게 처리하는 것도 가능하지만, 도구와 작업을 분리하고 유연하게 설계하는 방식은 확장성과 유지보수, 게임의 복잡도에 따른 관리에 있어서 매우 유리합니다! 특히 게임이 커지고 기능이 확장될수록 이런 구조는 중복을 줄이고 코드의 유지보수를 용이하게 만들어줍니다!

따라서 현재 구조는 미래의 확장성을 염두에 두고 설계된 것이며, 게임이 커질수록 이러한 방식이 장기적으로 더 효율적이고 효과적인 방식이 될 것입니다!

 

다음장에서 계속하겠습니다!

+ Recent posts