「Unity」2DTileMap 您所在的位置:网站首页 unity3d图片点击切换 「Unity」2DTileMap

「Unity」2DTileMap

2023-04-26 09:41| 来源: 网络整理| 查看: 265

大家好,这里是秋野

先叠个甲

我自己是零零散散自学的Unity和C#,只是出于兴趣编写了这个东西。

代码内容里面大概率出现各种不规范和弱智写法

如果发现

!!!可以尽情的指出,骂也无所谓!!!

(如果要骂,还是骂轻一点吧)

而且写这个专栏也是为自己理清楚自己做这个东西的逻辑

接下来就是正题了

序·为什么会出现这个想法

    首先这个东西实现的效果是什么样的

↓↓↓↓↓

WOC,Y!

根据上面的动图

其实最初的目的就是

让呈现直角的拐角

变成了斜面

让玩家有更多的选择

其实到这里,就一定有人想起泰拉瑞亚的锤子的功能了

其实道理也是那么个道理,让玩家能切换Tile的样式

而我自己又没找到现成的方案

就傻傻的开始自己写这个功能了

一·了解Unity的Tilemap和Ruletile的基础

在实现这个功能之前

咱们必须先了解一下Unity的Tilemap和Ruletile的一些基本概念

可以直接看一些Up制作的优质视频来了解这些基础概念

在这里很推荐直接看上面两个视频来了解一些基础知识

如果在这里再复述一遍就有点长篇大论了

接下来就默认都知道上面的基础知识

现在要围绕着要实现的目标,说一些上面没有说到的一些知识

首先

我们要改变Tilemap中某个位置的Tile中的图片

通常会使用一个很常用的方法

这个方法需要传入的参数也很好理解

position就是位置

后面的tile就是我们需要设置的tile

但,这里是tile实际上是TileBase,而我们平常说的Tile和RuleTile实际上都是继承于Tilebase的

那么我们做一个小实验,来简单说明这两者的区别

首先我们画两个相同的方块

左边用Tile一个个拼起来,右边是用RuleTile画出来

然后我们写一段简单的代码

这个方法是在运行时根据鼠标左键点击的位置设置一个新的Tile

而这个Tile就是一个斜角图片的Tile

然后我们进入游戏时操作会发生什么

很明显左边的是正常的切换了斜转角,而右边出现了bug

那么为什么会出现这样的问题呢

我们就需要回到Scene窗口用网格选择工具看看他们两个有何不同了

这里AKRuleTile是魔改版本的RuleTile,目前只需要当普通的RuleTile即可

可以看到他们两者的Sprite是相同的,但Tile是不一样的

其实如果把其他几个相同位置的对比就会发现

左边用Tile拼接出来的本质是用了九个不同的Tile

右边是一个Tile通过RuleTile的规则变换Sprite拼成

而我们在用setTile修改了左上角的Tile后

右边用RuleTile拼接而成的就会以为左上角的并非自己这个RuleTile,所以判定为没有Tile

从而修改了附近的几个Tile的Sprite

很明显我们实际上需要的是左边的效果

那么有啥办法可以唯独修改那个Sprite不会让RuleTile修改其他Sprite呢

「直接修改RuleTile中对应规则的Sprite?」

在上面图中的例子来说,确实可以实现,但是这样会导致全部一样的规则的Sprite都被修改

「修改RuleTile中的规则检测方式?」

确实可以做到修改某个位置的Sprite但不修改其他Tile的Sprite

但有可能出现修改的样式过多,Ruletile几乎不存在于Tilemap中

当需要删除某个Tile的时候不会根据规则变化的情况

(当然也是有办法去解决这个问题)

那么有没有什么办法吧左边的随意拼接,且能拥有右边RuleTile的规则呢

那当然是有(废话,没有我就做不出来了)

「用两层或以上Tilemap去分别控制RuleTile和单独Tile的组成与切换」

二·实现之前,先了解一下这个事情

在实现这个方法之前,需要了解一下直角与斜角之间切换,Sprite之间的衔接有什么变化

同时也会解释为啥会说用两层或以上去控制

直角转换成斜角

可以简单的理解成直接把直角给削一刀变成斜角

但是怎么削又是一个问题

现在我们先假设我们每一个Tile的大小为16*16像素大小

放成一个由三个Tile组成的斜边

这里三个不同的地方在于斜切的比例不一样

分别是从 第3个像素 第2个像素 第1个像素 开始斜切

可以发现如果从第一个像素开始斜切的话

能得到的斜面能跟内角完美衔接

而前面两个都会不同程度的凹进去一块

如果图方便,可以直接使用第三个切割方法去绘制自己的瓦片

但是,用第三个切割方法的时候,绘制一条一格宽的斜面时

会导致整体面积会显得很小很窄

那么如果使用第一种切割方法,则宽度适中

但需要处理凹进去的问题

最简单的方法就是直接填一个东西进去

但怎么填呢?

其实只需要在内角这个位置添加一块东西覆盖

这里就需要两个以上的Tilemap层了

当然,这里还需要补充说一下的是

规则瓦片的画法不是唯一,比如上面泰拉瑞亚的瓦片就是填满整个Tile

那么在这个时候,直接对半斜切或许是最好的选择

还有就是平台跳跃类的瓦片的逻辑也是不一样的

所以具体情况具体分析,这里只以俯视角作为例子

三·功能实现(一)——给RuleTile套层娃

上面说了那么多

好像也没说到具体怎么做

那么先看实现效果前需要做到的是

「通过代码控制两个Tilemap层在游戏中RuleTile和普通Tile在游戏中对应生成」

这里的两个是先不考虑凹下去填充的情况

毕竟是非必须的

那么首先创建一个Girds并创建一个空obj作为两个Tilemap的父级

并且在这个父级obj填上咱们需要的代码文件

并手动赋值

这里的手动赋值只是为了实现功能,具体实际使用可以根据需求更改

然后咱们来运行游戏试试什么效果

↓↓↓↓

很明显,不是我们想要的效果

但确实做到了上面的需求

稍作思考可以发现

RuleTile每次在附近有tile的情况下是会刷新附近的Sprite的

那么我们只需要也跟着做一样的事情就好了

也即

「在基础层放置Tile时刷新附近的Tile」

这里就根据需求新增了两个方法和修改了原来的SetTile方法

效果如下

↓↓↓↓

那么我们就实现了给RuleTile套了一层娃

还增加了可操作性了

如果需要删除某个Tile

也只需要跟原来Tilemap.setTile()一样

吧tilebase的参数设置为空即可

目前咱们实现了这个功能的前置功能之一

为了避免专栏写的冗长

咱就分开几段来发布

(实际上还没空写完)

如果觉得上面的内容对你学习Tilemap的过程有帮助

请不要吝啬您的点赞

如果觉得有什么问题或者错误

也可以在评论区和咱提出



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有