从零开始独立游戏开发学习笔记(二十一)Unity学习笔记(九)M_Studio教程2D入门 二

继续小狐狸,这个教程挺有趣的。
1. 动画
在 asset panel 里新建一个 Animation 文件夹用于储存之后的动画。
给小狐狸添加一个 Animator 组件
在文件夹里新建一个 Animation Conroller,拖动到小狐狸的组件里。
打开 window -> Animation -> Animation 窗口。
1.1 创建闲置动画
选中小狐狸的情况下,在 Animation 窗口里,可以看到提示说没有 Animation Clip,附一个 create 按钮,点击后会打开资源管理器,给我们的动画命名,我们先要创建一个闲置动画,于是命名为 idle。
找到动画素材,全选,一起拖动到 timeline 上,动画就已经附上了,不过现在有一个问题,动画太快了。
方式很简单,拖动它就可以调整动画快慢。
1.2 创建跑动动画
打开 window -> Animation -> Animator,选中 player,或者直接双击上一步创建的 controller,便可以看到刚刚创建的动画。(第一种方式就不用特意换文件夹去找 controller 了)
回到 Animation 窗口,创建一个新的 Animation Clip,命名为 run,剩下的操作和上一步一样。
创建完后去到 controller 看会发现两个动画都有了,只不过 run 动画没有连上来。
在 controller 里右键 idle,选择 make transition,拖到 run,反之亦然。
左边添加一个 bool 参数 IsRunning。
将两个 transition 的 has exit time 取消勾选,并将 transition duration 设置为 0。
对两个 transition 设置 condition,表示什么时候触发 transition,这里自然是设置成 IsRunning 是否为真。

接下来就是要在脚本里改变这个参数从而改变动画状态了。
还是之前那个脚本,方法很简单,直接暴露一个参数把 Animator 往里拖就行了。然后使用 SetBool 来更改参数值,注意这里没法直接用 . 语法获取。

1.3 创建跳跃动画
跳跃动画有点不一样,因为分跳起来和落下两个,所以要创建两个动画。
创建动画逻辑。通过参数的更改,进行动画的切换。
给代码里加上两个 public 属性,类型分别为 Collider2D 和 LayerMask。给后者命名为 ground,之后我们要把 tilemap 的 layer 设置为 Ground。用于检测碰撞。(这里可以学到,如果是死板的把 tilemap 本身作为参数引入,那么之后需要添加其他的地面就不好办了,用 layer 的话新加的东西只要改变 layer 即可)
代码中判断跳跃和下落以及碰撞时机,更改 animator 的参数。

2. 修复移动错误以及一些优化
如果是跟着教程做到现在的话,肯定早就发现一堆 bug。
2.1 走着走着突然卡住
主要是我们现在用的 collider 非常简单,player 只是一个方块。而移动的时候,方块的两个角可能会跟地面卡住,由于我们之前设置了 z 轴不滚动,因此表现为卡住,如果让 z 轴滚动恢复,其实会发现之前会卡住的时候变成了人物乱滚。
这个问题会在之后游戏完成度高的时候被解决掉,不过现在可以先调整一下:
首先把之前的 box collider 缩小到头部位置。
再添加一个 circle collider,作为下半身的 collider,这样我们就有了两个 collider。下半身因为是圆形的,也不会被绊倒了。
把下落碰撞的物体改成这个圆形 collider,结束。
这两个 collider 会在后面起到别的重要作用,这个就等到时候再讲了。
2.2 没必要作为 public 的参数
我们现在的脚本里引用组件的方式是 public 出来然后拖拽。如果像是 collider 这种可能有多个并且会更改的组件还好。像是 rigidbody,animator 这种只会有一个的组件且之后不会再更改肯定是这个组件。没必要专门 public 出来占地方。我们可以直接在脚本内部引用,且不声明为 public 属性。

3. 镜头跟踪
3.1 脚本跟踪
想让镜头跟踪小狐狸,本来想直接父子物体关系的,结果发现每次人物转向的时候镜头也会转向。这是因为我们改变人物朝向的时候改变了 scale,而父子物体的话镜头也会遵循这个改变。所以想要达到目的我们还是得用脚本。
这次我们的脚本是加在镜头上的。
代码如下:

可以发现并不是单纯的让两个 position 相等,有这么几个原因:
我们不想让 y 轴跟着人物移动,不然镜头会看到场景上下方的空白。
z 轴设置和人物一样的话就看不见人物了,这是很合理的,camera 要是和人物重合了肯定是看不见人物的。
3.2 cinimachine
unity 也提供了这么一个工具,比我们的脚本更好用。首先要在 package manager 里安装这个包。按抓个完后在 gameobject -> cinimachine 里可以找到我们的工具。这里我们点击创建一个 2D Camrea。
然后会发现 main camera 会被这个改写,之前写的跟随脚本已经没有效果了。这时候我们只要调整新添加的这个 camera 即可。
将 player 拖动到 follow 属性里。游玩一下游戏会发现此时镜头跟随就已经有了,而且会有一点缓冲,效果非常好。
点开 body 属性,会发现 game panel 出现一些紫色蓝色的提示框,有利于我们调参。
尝试增大 dead zone x 和 y,会拉出一个小框框。人物在这个框里移动的时候镜头是不会变化的,只有当移动出这个框的范围时,镜头才会跟着移动。人物判定点就是那个小黄点。
改变 screen x 和 y,可以调整人物在镜头中的位置,比如有些游戏人物不一定固定在中间,而是最左边。
3.3 背景加长
可以让背景跟随镜头移动,但是如果背景不移动的话很出戏。所以这里我们复制背景手动加长。这时左边 hierachy pannel 里的东西有点多,我们可以整理一下。新建一个 empty object,重命名一下,然后把刚刚复制的物体拖进来即可。

3.4 边界处理
背景加长了,但是边界处理也是很重要的。比如说人物走到左边和右边的末端的时候,镜头就不应该像之前那样跟随了,不然会看到空白。跳跃同理,往上跳的时候镜头可以跟随一下,但是任务要是太靠近天空,镜头就应该停止往上了。
解决这个的方案 unity 也提供了,在刚刚创建的 2D camera 里有一个 extension,这里添加一个 CinemachineConfiner2D(教程里用的是 CinemachineConfiner 再选 2D mode,我用的是新版本新增的功能,官方更推荐)
想让其工作需要一个 collider,于是我们给 background 添加一个 polygon collider,手动 edit 一下边界。(2021 版本删除操作的单位是线不是点,想要删除某条线的时候,按住 ctrl,鼠标移动到上面的时候线会变红,这时候点一下线就会被删除)。
编辑的时候应该会发现人物会被边界挤压出去,这个时候我们只要选中 isTrigger 即可。因为这个 collider 不是用来做碰撞的,只是用于被 cinemacchine 利用。
然后回到 cinemachine,把 confiner 连上这个 collider。运行游戏,一切完美。
