Unity 스크립트 가능한 타일 가이드
이 문서는 Unity에서 스크립트 가능한 타일을 만드는 방법에 대한 설명과 예제를 제공합니다. 타일맵에서 도로나 파이프와 같은 선형 세그먼트를 쉽게 배치할 수 있는 RoadTile
클래스에 대한 상세한 설명을 포함하고 있습니다.
스크립트 가능한 타일이란?
스크립트 가능한 타일은 Unity의 타일 시스템에서 사용자 정의 타일을 만들 수 있게 해주는 기능입니다. 이를 통해 사용자는 게임 맵에 유연하게 타일을 추가하고 조작할 수 있습니다.
RoadTile
클래스 설명
아래는 RoadTile
클래스의 주요 구성 요소입니다. 이 클래스는 도로와 같은 선형 구조를 정의하고 배치하는 데 사용됩니다.
주요 필드 및 메소드
필드/메소드 | 설명 |
---|---|
m_Sprites |
도로 타일에서 사용할 스프라이트 배열입니다. |
m_Preview |
타일의 미리보기 이미지를 저장합니다. |
RefreshTile() |
인접한 타일을 갱신하여 도로의 연결 상태를 업데이트합니다. |
GetTileData() |
인접 타일에 따라 스프라이트를 결정하고 회전합니다. |
HasRoadTile() |
특정 위치에 도로 타일이 있는지 확인합니다. |
GetIndex() |
인접 타일 개수에 따라 적절한 스프라이트 인덱스를 반환합니다. |
GetRotation() |
인접 타일 위치에 따라 타일의 회전을 결정합니다. |
CreateRoadTile() |
에디터 메뉴에서 새 로드 타일 에셋을 생성합니다. |
타일 생성을 위한 코드
아래는 RoadTile
클래스를 정의하는 코드입니다.
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class RoadTile : Tile
{
public Sprite[] m_Sprites;
public Sprite m_Preview;
public override void RefreshTile(Vector3Int location, ITilemap tilemap)
{
for (int yd = -1; yd <= 1; yd++)
for (int xd = -1; xd <= 1; xd++)
{
Vector3Int position = new Vector3Int(location.x + xd, location.y + yd, location.z);
if (HasRoadTile(tilemap, position))
tilemap.RefreshTile(position);
}
}
public override void GetTileData(Vector3Int location, ITilemap tilemap, ref TileData tileData)
{
int mask = HasRoadTile(tilemap, location + new Vector3Int(0, 1, 0)) ? 1 : 0;
mask += HasRoadTile(tilemap, location + new Vector3Int(1, 0, 0)) ? 2 : 0;
mask += HasRoadTile(tilemap, location + new Vector3Int(0, -1, 0)) ? 4 : 0;
mask += HasRoadTile(tilemap, location + new Vector3Int(-1, 0, 0)) ? 8 : 0;
int index = GetIndex((byte)mask);
if (index >= 0 && index < m_Sprites.Length)
{
tileData.sprite = m_Sprites[index];
tileData.color = Color.white;
var m = tileData.transform;
m.SetTRS(Vector3.zero, GetRotation((byte) mask), Vector3.one);
tileData.transform = m;
tileData.flags = TileFlags.LockTransform;
tileData.colliderType = ColliderType.None;
}
else
{
Debug.LogWarning("Not enough sprites in RoadTile instance");
}
}
private bool HasRoadTile(ITilemap tilemap, Vector3Int position)
{
return tilemap.GetTile(position) == this;
}
private int GetIndex(byte mask)
{
switch (mask)
{
case 0: return 0;
case 3: case 6: case 9: case 12: return 1;
case 1: case 2: case 4: case 5: case 10: case 8: return 2;
case 7: case 11: case 13: case 14: return 3;
case 15: return 4;
}
return -1;
}
private Quaternion GetRotation(byte mask)
{
switch (mask)
{
case 9: case 10: case 7: case 2: case 8:
return Quaternion.Euler(0f, 0f, -90f);
case 3: case 14:
return Quaternion.Euler(0f, 0f, -180f);
case 6: case 13:
return Quaternion.Euler(0f, 0f, -270f);
}
return Quaternion.Euler(0f, 0f, 0f);
}
#if UNITY_EDITOR
[MenuItem("Assets/Create/RoadTile")]
public static void CreateRoadTile()
{
string path = EditorUtility.SaveFilePanelInProject("Save Road Tile", "New Road Tile", "Asset", "Save Road Tile", "Assets");
if (path == "")
return;
AssetDatabase.CreateAsset(ScriptableObject.CreateInstance<RoadTile>(), path);
}
#endif
}
활용 예제
타일 설치 및 설정
- Unity 프로젝트에서
Tiles
폴더를 생성합니다. - 타일에 사용할 스프라이트를 준비합니다.
- 위의 코드를 복사하여
RoadTile.cs
라는 이름으로 Unity 프로젝트의Scripts
폴더에 저장합니다. - 에디터에서
Assets
메뉴 →Create
→RoadTile
을 선택하여 새 도로 타일을 생성합니다.
추가적인 활용
- 다양한 형태의 타일 생성:
RoadTile
클래스를 상속받아 다른 형태의 타일을 작성할 수 있습니다. 예를 들면,WaterTile
,GrassTile
클래스를 만들어 각각의 주제에 맞는 타일을 생성할 수 있습니다. - 지형 편집기 구현: 사용자 정의 타일을 사용하여 지형 편집기에서 타일의 배치를 동적으로 설정하고 조정할 수 있습니다. 이로 인해 플레이어가 자신의 지형을 만들거나 수정할 수 있는 환경을 제공할 수 있습니다.
이 문서는 Unity에서 스크립트 가능한 타일을 생성하고 활용하는 기본적인 방법을 설명합니다. 이를 바탕으로 더 다양한 게임 요소를 구현해보는 것도 좋은 학습법이 될 것입니다.