안녕하세요 투니드입니다!
이번 편에서는 밭을 갈고(?) 씨를 뿌리는 것에 대한 작업을 진행해 보겠습니다!
들어가기에 앞서 먼저
전편에서 했던 Marker 있잖아요? 그게 마우스가 가리키는 곳은 무조건 표시를 해줬어요! 어쨌든 타일맵과의 상호작용이 필요한 작업 같은 느낌이라서 거리에 제한을 먼저 둬볼게요!
조건은 캐릭터와의 거리가 1.5f초과로 멀면 Marker를 활성화하지 않는걸 첫 목표로 진행하겠습니다!
ToolsCharacterController.cs 로 갑니다
변수부터 선언해 줄게요!
Vector3Int형 변수로 타일의 위치값 벡터를 확인을 해줄 거고,
selectable로 marker가 표시되느냐 안되느냐를 판별해 줄 거예요!
메서드 2개를 만들어 줍니다
SelectTile() 메서드에서 타일의 위치값을 확인해 줄 거예요!
그리고 CanSelectCheck() 메서드에서 캐릭터와 1.5f이하로 차이나는 타일에는 marker를 표시하게끔 만들어줄 겁니다
여기서 MarkerManager.Show() 라는 메서드가 등장하는데 이렇게 적어주시고 Show()부분에서 Ctrl + . 을 눌러 메서드를 생성해 주고 MarkerManger.cs로 넘어갑시다!
먼저 show라는 필드를 하나 선언해 줍니다 얘의 역할이 결국 표시를 해줄지 안 해줄지를 결정해 주는 겁니다!
그리고 Show()메서드가 internal로 선언되어 있는데 public으로 바꾸셔도 됩니다!
아무튼! show 변수에 넘어온 selectable 변수를 담고 marker를 넘어온 값에 따라 활성화/비활성화해 줍니다!
그리고 Update()문에 넘어온 값이 false라면 표시하지 않도록 조건문을 하나 넣어줬습니다!
이렇게 해주신 다음 다시 ToolsCharacterController.cs 로 갑니다!
(복잡하죠? ㅠㅠ)
이번 편에서 만든 메서드 두 개를 사용을 하지 않고 있잖아요? 그걸 Update()문에 넣어줄 겁니다!
이렇게 넣어주면 매프레임 마우스가 가리키고 있는 타일의 위치값을 계산하고, 마커를 표시할지를 확인해 줄 겁니다!
같이 확인해 보죠!
네 이렇게 마우스가 가리키는 곳이 멀면 비활성화 1.5보다 가까우면 활성화가 잘 됩니다!
위치값벡터를 가져와서 특정거리만큼만 마커를 표시하는 기능을 마쳤습니다!
이제 이걸 이용해서 밭을 갈 수 있도록 만들어줄 거예요!
GameManager 오브젝트에 CropsManager.cs 파일을 만들어서 붙여줍니다!
CropsManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
namespace MyStardewValleylikeGame
{
public class Crops
{
//✔ Crops 클래스는 현재 아무것도 구현되어 있지 않음
//✔ 추후 농작물의 성장 단계, 종류, 수확 가능 여부 등의 정보를 저장하는 용도로 확장될 가능성 있음
}
public class CropsManager : MonoBehaviour
{
//밭을 간 상태(갈아엎어진 땅)의 타일
[SerializeField] TileBase plowed;
//씨앗을 심은 상태의 타일
[SerializeField] TileBase seeded;
//타일이 배치될 Tilemap 오브젝트
[SerializeField] Tilemap targetTilemap;
//농작물이 있는 위치와 해당 농작물 데이터를 저장하는 딕셔너리
[SerializeField]
Dictionary<Vector2Int, Crops> crops;
private void Start()
{
crops = new Dictionary<Vector2Int, Crops>();
}
//특정 위치의 땅을 가는 메서드
public void Plow(Vector3Int position)
{
//이미 밭을 간 위치라면(딕셔너리에 이미 등록되어 있다면) 아무 작업도 하지 않고 종료
if (crops.ContainsKey((Vector2Int)position))
{
return;
}
CreatePlowedTile(position);
}
//실제로 타일을 변경하는 메서드
private void CreatePlowedTile(Vector3Int position)
{
//Crops 객체를 새로 생성
Crops crop = new Crops();
//딕셔너리에 해당 위치와 Crops 객체를 추가
crops.Add((Vector2Int)position, crop);
//해당 위치에 밭을 간 타일을 배치
targetTilemap.SetTile(position, plowed);
}
}
}
제가 영상에 나오는 영어를 도저히 못 알아듣겠어서 우선 클론코딩을 하고, GPT 이용해서 주석을 다는 식으로 진행을 했어요
결국 위에서 했던 1.5f 초과하는 거리의 타일은 선택할 수 없게 만들고, 선택가능한 타일들을 선택하면 밭을 간 것처럼 보이는 스프라이트 타일을 설치해 주는 겁니다!
그리고 중요한 내용이 Dictionary<Vector2Int, Crops> crops; 딕셔너리입니다!!
이 Dictionary는 타일의 위치값에 Crops클래스를 매핑해 주는 역할을 하고 있습니다!
Crops 클래스는 아직 어떤 것도 구현이 되지 않았지만 타일 하나에 하나의 씨앗만 설치하도록 만들어주고,
이건 맞을지 모르겠지만 성장 단계라던지 여러 가지 씨앗에 대한 정보들을 알려주는 역할을 할 것 같습니다!
위에 코드를 보면 딕셔너리에 현재는 위치값만 비교해서 밭이 이미 갈린 상태라면 중복되지 않게만 해주고 있지만 추후에 추가가 될 것 같습니다!
그리고 Plow(Vector3Int position) 함수를 보면 매개변수를 Vector3Int로 받고 있는데 왜 그런 걸까요? 궁금하지 않으세요?
그건 바로 Tilemap API가 Vector3Int를 사용하기 때문입니다! 이게 무슨 말이냐고요?
저희 전편에 Marker에서 했던 tileMapReadController.GetGridPosition() 메서드가 기억나시나요?
여기 보시면 Tiilmap API에서 WorldToCell 내부 메서드의 반환값이 Vector3Int이기 때문입니다!
그걸 Vector2Int로 형변환 해줌으로써 Z값을 버림 하는 거예요! Z값이 2D에서 영향을 주게 되면 Z값에 따라서 여러 가지 겹침현상이라던가 새로운 버그라던가 이런 것들이 생길 수 있습니다! 참고해 주세요!
스크립트를 붙여준 다음에 이제
여기 안에 있는 변수들을 할당해줘야 하잖아요? 이거는 유튜버 Greg Dev Stuff 님께서 올리신 자료를 두 개 받아왔습니다!
https://drive.google.com/file/d/1rY-IKqhwXbRh3gq_aT8QjcAlkjNeOZi2/view - 밭을 간 이미지
https://drive.google.com/file/d/1GZnAydEB7Irf6qKva8TGeo6Flr9E1jaW/view - 씨앗을 뿌린 이미지
이렇게 두 개를 다운로드하고
스프라이트 폴더에 넣어준 뒤에 위와 같이 설정을 마쳐줍니다!
그러고 나서
Tilemap들을 정리해 줄 건데, 기존의 Tilemap이라고 돼있던 오브젝트의 이름을 BaseTilemap으로,
그리고 그걸 한번 더 복사해서 CropsTile맵을 만들어줍니다! 그리고 CropsTilemap의 Order In Layer 는 0으로
MarkerTilemap은 10으로 설정해 줬습니다!
이렇게 설정을 마쳤다면
팔레트 안에 아까 설정했던 스프라이트 이미지를 복사해 주고 역시나
폴더링 해줬습니다! 다음장에서 계속하겠습니다!
'StardewValleyLikeGameCloneCoding' 카테고리의 다른 글
Stardew Valley like Game in Unity Episode 9-3 Plowing and Seeding (0) | 2025.03.06 |
---|---|
Stardew Valley like Game in Unity Episode 9-2 Plowing and Seeding (0) | 2025.03.06 |
Stardew Valley like Game in Unity Episode 8-2 Tilemap and Marker (0) | 2025.03.05 |
Stardew Valley like Game in Unity Episode 8-1 Tilemap and Marker (0) | 2025.03.05 |
Stardew Valley like Game in Unity Episode 7-3-1 Toolbar (0) | 2025.03.05 |