[원하는 기능]
- 마우스로 타일맵을 클릭했을 때 게임 월드상의 타일 위치를 반환하는 기능
[관련함수]
- screenToWorldPoint(Input.mousePosition): 마우스의 위치를 받아서 게임 월드 좌표로 반환하는 함수.
- WorldToCell(Vector2 || Vector3): 벡터 위치(여기에는 마우스의 게임 월드 좌표를 넘겨줄 것) 를 받아서 타일맵의 셀위치를 반환하는 함수.
[코드]
- 맨 처음 코드: 실패
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.U2D.Aseprite;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Tilemaps;
public class farmColtroller : MonoBehaviour
{
public Camera mainCamera;
public Tilemap tilemap;
public Vector3 mousePos;
public Vector3 clickPos = Vector3.zero;
public Vector3Int tilemapCell = Vector3Int.zero;
public GameObject cat;
public void Awake()
{
mainCamera = GetComponent<Camera>();
}
public void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector3Int gridPos = tilemap.WorldToCell(mousePos);
if (tilemap.HasTile(gridPos))
Debug.Log("Hello World from " + gridPos);
HandleTileClick(gridPos);
}
mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0))
{
Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Debug.Log("Mouse Position: " + mouseWorldPos);
Vector3Int cellPosition = tilemap.WorldToCell(mouseWorldPos);
Debug.Log("Clicked Tile Position: " + cellPosition);
HandleTileClick(cellPosition);
}
}
void HandleTileClick(Vector3Int cellPosition)
{
TileBase clickedTile = tilemap.GetTile(cellPosition);
if (clickedTile != null)
{
Debug.Log("Tile at Position: " + cellPosition + " is " + clickedTile.name);
} else
{
Debug.Log("No tile at Position: " + cellPosition);
}
}
}
이 코드로 실행 했을 때, 분명히 타일이 있는 위치를 클릭했는데 막상 출력되는 값은 타일 위치와 동떨어진 곳이었다. 그래서 나와 같은 문제를 겪고 있는 사람들의 글을 계속해서 읽어본 결과 z 축의 문제라는 결론이 나왔다.
지금 내가 채택한 형식이 2D 아이소메트릭 형식이므로 z 축은 월드 좌표로 계산할 때 배제해야 하는데 이 값까지 같이 넘겨줘서 이상한 값이 나오는 것이었다.
- 해결한 코드
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.U2D.Aseprite;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Tilemaps;
public class farmColtroller : MonoBehaviour
{
public Camera mainCamera;
public Tilemap tilemap;
public Vector3 mousePos;
public Vector3 clickPos = Vector3.zero;
public Vector3Int tilemapCell = Vector3Int.zero;
public GameObject cat;
public void Awake()
{
mainCamera = GetComponent<Camera>();
}
public void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector3Int gridPos = tilemap.WorldToCell(mousePos);
if (tilemap.HasTile(gridPos))
Debug.Log("Hello World from " + gridPos);
HandleTileClick(gridPos);
}
}
void HandleTileClick(Vector3Int cellPosition)
{
TileBase clickedTile = tilemap.GetTile(cellPosition);
if (clickedTile != null)
{
Debug.Log("Tile at Position: " + cellPosition + " is " + clickedTile.name);
} else
{
Debug.Log("No tile at Position: " + cellPosition);
}
}
}
[참고자료]
https://stackoverflow.com/questions/54357827/mouse-events-for-unity3d-isometric-tile-map
Mouse events for Unity3D isometric tile map
I have been reading up on the new tile map system in Unity3D. I have managed to get to the point of setting up a grid -> tile-map and setting up a tile palette. However now i'm struggling with find...
stackoverflow.com
Unity Tilemap의 타일에 데이터 저장하기
타일형 게임을 구현할 때 유니티에서 제공하는 타일맵을 사용하면 팔레트를 이용해 쉽게 타일을 배치 할 수 있다는 장점이 있다. 단순히 타일을 배치하는 것만으로 충분할 수도 있지만, 구현하
upbo.tistory.com
https://pinelike.tistory.com/55
타일맵의 셀좌표와 포지션 정보 얻어오기
public Camera _mainCamera; public Tilemap _tileMap; private Vector3 _clickPos = Vector3.zero; private Vector3Int _tilemapCell = Vector3Int.zero; IEnumerator OnMouseUp() { if (EventSystem.current.IsPointerOverGameObject() == true) { yield break; } Ray ray =
pinelike.tistory.com
Unity - Tilemap Properites 및 관련 메서드
Tilemap Properties 01 animationFrameRate 타일맵 내 모든 타일의 애니메이션 프레임 속도이다. 애니메이션의 재생 속도를 조절할때 사용한다. public float animationFrameRate { get; set; } 02 cellBounds 타일맵 내에서
code-piggy.tistory.com
https://gamekiddo.tistory.com/5
[2D] 유니티 타일맵(Tilemap) 을 알아보자
타일맵의 기본 개념 그리드(Grid) 타일맵은 언제나 Grid의 하위 항목이다(UI생성 시의 캔버스와 유사하다) 타일맵(TIlemap) Photoshop의 레이어처럼 칠해진 타일들을 그룹화하여 가지고 있는 GameObject이
gamekiddo.tistory.com