赞
踩
最近新项目需要做一个用到瓦片地图的游戏,第一想法就是要用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轴
然后调用Tilemap的 WorldToCell 函数,就可以拿到一个地图中的坐标
最后就直接设置Tile了
用起来是真方便!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。