当前位置:   article > 正文

Unity3D-Tilemap初体验(Unity自带Tilemap使用体验)_unity tilemap优化原理

unity tilemap优化原理

最近新项目需要做一个用到瓦片地图的游戏,第一想法就是要用Tilemap,之前Unity没有自带的Tilemap,都是第三方插件。知道去年2017.2发布,就有自带的Tilemap啦!

将Unity升级到2017.3.1,Tilemap的基本操作,其实API已经有了,看这里:Unity Tilemap API

然后在给个别人已经翻译了的:中文

由于我项目的特殊性,需要在代码里面创建和修改Tile,初始化Tilemap,所以就动手试了试,在此记录下:

创建Tilemap,默认的还是在编辑器里面创建的,然后拿了一个引用,然后创建Tile,根据数据去生成对应的Tile。

我们的要求是,Tile颜色会变动,所以只能这么来,如果Tile是固定好的,其实可以直接在编辑器里面创建好,然后引用就好了。

下面是我尝试的代码:

  1. public Tilemap tilemap;//引用的Tilemap
  2. public Tile baseTile;//使用的最基本的Tile,我这里是白色块,然后根据数据设置不同颜色生成不同Tile
  3. Tile[] arrTiles;//生成的Tile数组
  4. void Awake() {
  5. ins = this;
  6. }
  7. void Start () {
  8. StartCoroutine(InitData());
  9. }
  10. IEnumerator InitData(){
  11. int levelW = 100;
  12. int levelH = 100;
  13. int colorCount = 6;
  14. arrTiles = new Tile[colorCount];
  15. for(int i=0;i<colorCount;i++){
  16. arrTiles[i] = ScriptableObject.CreateInstance<Tile>();//创建Tile,注意,要使用这种方式
  17. arrTiles[i].sprite = baseTile.sprite;
  18. arrTiles[i].color = new Color(Random.Range(0f, 1f), Random.Range(0f,1f), Random.Range(0f, 1f), 1);
  19. }
  20. for(int i=0;i<levelH;i++){//这里就是设置每个Tile的信息了
  21. for(int j=0;j<levelW;j++){
  22. tilemap.SetTile(new Vector3Int(j, i, 0), arrTiles[Random.Range(0, arrTiles.Length)]);
  23. }
  24. yield return null;
  25. }
  26. while(true){
  27. yield return new WaitForSeconds(2);
  28. // int colorIdx = Random.Range(0, colorCount);//前面这个是随机将某个块的颜色改变,然后让Tilemap更新,主要用来更新Tile的变化
  29. // arrTiles[colorIdx].color = new Color(Random.Range(0f, 1f), Random.Range(0f,1f), Random.Range(0f, 1f), 1);
  30. // tilemap.RefreshAllTiles();
  31. Color c = tilemap.color;//这里是改变Tilemap的颜色,尝试是否可以整体变色
  32. c.a -= Time.deltaTime;
  33. tilemap.color = c;
  34. }
  35. }

结果是下面这样的:





宽高都是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);

用起来是真方便!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/134612
推荐阅读
相关标签
  

闽ICP备14008679号