思考并回答以下问题:
前言
项目中使用的基本角色控制脚本是由 Unity Learn 中的官方教程 John Lemon’s Haunted Jaunt(很不错的教程)中的示例控制脚本改进而来。其基本思路是根据输入计算一个 2 维向量 lookDirection 作为角色的“面向”,并根据这一向量移动刚体以及播放动画。
它能够保证对于任意角度,角色的移动速度都保持一致,并且这一向量对于脚印效果的实现很重要。
如有疑问可以查阅底部的教程链接或直接下载脚本。
部分脚本参考
基本思路:
首先来梳理一下想要的人物足迹的特性:
在人物移动时生成,并在一段特定时间后消失,最好有个淡出效果
足迹会沿人物移动轨迹左右交互排列
足迹的指向与人物移动方向相同,也就是说在人物转向时,足迹也应旋转对应的角度
第一反应:建一个脚印的 prefab,利用动画器实现淡出效果,用脚本实现脚印的生成、销毁、镜像与旋转。之后深入一想脚本大概要怎么写,感觉头大的不行,又想到了 Hierarchy 里面被 FootStep12345678 塞得满满当当的壮丽场面..还是换个方法吧
转念一想:unity 的粒子系统似乎可以满足所有特性:生成淡出销毁全自动,跟随人物也是基本操作,比较存疑的就是用脚本控制粒子的镜像与旋转。
之后当然就是搜索有没有现成的轮子可以用,别说,还真在 unity forums 找到了一个官方比较完美的粒子系统足迹效果。唯一的问题就是它是一个 3D 示例,而我的游戏则是纯 2D。
所以现在的问题就是如何将这一方案转换在 2D 中实现。
先来分析一下它的实现脚本:
用来生成脚印粒子的核心代码是 Update() 中的这一部分:
其中比较重要的有两个量:transform.right 与 transform.rotation
transform.right:物体 X 轴的方向,垂直于物体的面向。脚印需要在此方向上左右偏移。transform.rotation.eulerAngles.y:物体 Y 轴方向上的的旋转角度,在这个示例中也是它的移动方向旋转的角度。
俯视角的 2D 游戏中并不经常直接操作角色对象的旋转,所以这两个量在脚本中没有意义,需要找一个与它们类似的变量来替代它们的功能。
而在之前的角色控制脚本中,恰恰有一个很重要的二维向量:lookDirection,从某种意义上它就是角色的“面向”,能够起到与 3D 中的 transform.front 类似的效果。
果断使用 lookDirection 向量进行等效替换:
transform.right 与 transform.front 垂直,也就是说我们需要一个与 lookDirection 垂直的向量。
而两向量垂直怎么算来着?X1X2+Y1Y2 = 0 嘛。
transform.right gap dir 等效替换为 new Vector3(lookDirection.y gap dir, -lookDirection.x gap dir, -5)
transform.rotation.eulerAngles.y 为物体面向旋转的角度,那么直接计算 lookDirection 与 Vector2(0, 1) 向量的夹角就完事了。
transform.rotation.eulerAngles.y 等效替换为 Vector2.Angle(new Vector2(0, 1), lookDirection)
OK!脚本的基本思路完成了,之后就是设置粒子系统了。
创建足迹系统使用的脚印材质:
创建一个默认材质,然后将它的 shader 更改为 Legacy Shaders / Particles / Alpha Blended,将脚印的 sprite 拖拽到选框中。重命名为 footPrint。
设置粒子系统
在 Player 对象下新建一个粒子系统,并命名为 FootStep
如图设置粒子系统:
最后,根据情况修改角色控制脚本并调整参数
之后就是快乐的测试 -> 改代码 -> 测试 -> 改代码循环往复…
最终效果: