最近新项目需要做一个用到瓦片地图的游戏,第一想法就是要用Tilemap,之前Unity没有自带的Tilemap,都是第三方插件。知道去年2017.2发布,就有自带的Tilemap啦!
将Unity升级到2017.3.1,Tilemap的基本操作,其实API已经有了,看这里:Unity Tilemap API
然后在给个别人已经翻译了的:中文
由于我项目的特殊性,需要在代码里面创建和修改Tile,初始化Tilemap,所以就动手试了试,在此记录下:
创建Tilemap,默认的还是在编辑器里面创建的,然后拿了一个引用,然后创建Tile,根据数据去生成对应的Tile。
我们的要求是,Tile颜色会变动,所以只能这么来,如果Tile是固定好的,其实可以直接在编辑器里面创建好,然后引用就好了。
下面是我尝试的代码:
public Tilemap tilemap;//引用的Tilemap
public Tile baseTile;//使用的最基本的Tile,我这里是白色块,然后根据数据设置不同颜色生成不同Tile
Tile[] arrTiles;//生成的Tile数组
void Awake() {
ins = this;
}
void Start () {
StartCoroutine(InitData());
}
IEnumerator InitData(){
int levelW = 100;
int levelH = 100;
int colorCount = 6;
arrTiles = new Tile[colorCount];
for(int i=0;i<colorCount;i++){
arrTiles[i] = ScriptableObject.CreateInstance<Tile>();//创建Tile,注意,要使用这种方式
arrTiles[i].sprite = baseTile.sprite;
arrTiles[i].color = new Color(Random.Range(0f, 1f), Random.Range(0f,1f), Random.Range(0f, 1f), 1);
}
for(int i=0;i<levelH;i++){//这里就是设置每个Tile的信息了
for(int j=0;j<levelW;j++){
tilemap.SetTile(new Vector3Int(j, i, 0), arrTiles[Random.Range(0, arrTiles.Length)]);
}
yield return null;
}
while(true){
yield return new WaitForSeconds(2);
// int colorIdx = Random.Range(0, colorCount);//前面这个是随机将某个块的颜色改变,然后让Tilemap更新,主要用来更新Tile的变化
// arrTiles[colorIdx].color = new Color(Random.Range(0f, 1f), Random.Range(0f,1f), Random.Range(0f, 1f), 1);
// tilemap.RefreshAllTiles();
Color c = tilemap.color;//这里是改变Tilemap的颜色,尝试是否可以整体变色
c.a -= Time.deltaTime;
tilemap.color = c;
}
}
结果是下面这样的:
宽高都是100,看了下效率,确实是高!
选择Tilemap中的方块,开始还说要自己弄个射线去检测,完了我看了API,直接用转化接口,真的是太方便了,这样就可以点击哪里,然后改变哪里了,包括缩放之后也能精确的选择到方块:
将鼠标左边转成世界坐标,注意要z轴
Vector3 wordPosition
=
Camera.
main.
ScreenToWorldPoint(
mousePosition);
然后调用Tilemap的 WorldToCell 函数,就可以拿到一个地图中的坐标
Vector3Int cellPosition
=
backMap.
WorldToCell(
wordPosition);
最后就直接设置Tile了
backMap.
SetTile(
cellPosition,
gameUI.
GetSelectColor().
colorData.
mTile);
用起来是真方便!