1.4.1 关联文件 ● FloorControl.cs 1.4.2 概要 上节介绍的算法中,背景只在每次调用 Update() 时移动一次。这样一来,如果武士移动的 距离很长,就有可能出现背景和角色的移动不和谐的情况(图 1.6)。虽然我们这个游戏中并不 会达到那样快的移动速度,但是有些游戏中出现过玩家角色移动,或者在场景中移动到错误位 置的现象。下面就让我们来考虑一下这种情况的解决办法。 1.4.3 稍作尝试 让我们来实际体验一下上节所述的问题。作为调试,这里保留了武士能够一瞬间移动很远 的距离这一功能。启动游戏后请按下 W 键。如图 1.7,可以看到在武士周围的背景不复存在了。 在 Unity 中执行时,将其切换到场景视图后使用逐帧模式观察,可以看到背景组件在缓缓 移动。 在这种情况下,为了能够正确显示背景,该如何处理呢? 1.4.4 背景组件显示位置的改良 在前一小节中,我们提到了相同类型的背景组件会按照total_width=一个组件的宽带×组 件数量(3 个)的间隔重复出现。也就是说,程序将从下列值中, 初始位置 初始位置 +total_width×1 初始位置 +total_width×2 初始位置 +total_width×3 初始位置 +total_width×n n 为整数……(1) 选取一个最靠近武士坐标的值作为背景组件出现的位置。因此,只要求出上面算式 (1) 中 n 的 值,就可以确定背景应该出现的位置。 接下来,让我们看看改良后的 FloorControl.Update 方法。 FloorControl.Update 方法(改良版、摘要) 在图 1.8 中,dist 是武士的移动距离。将 dist 除以背景组件的整体宽度 total_width 后的结果 赋值给 n。 n 是整数,但是经除法求出的结果并不一定是整数。因此把结果代入 n 之前,需要先做四 舍五入处理。如果只是简单地进行类型转换(cast),将直接舍去小数部分,请读者注意这一点。 之所以使用四舍五入而不是直接舍去小数部分,是为了在舍去和进位两种情况中选取最靠 近武士坐标的情况(图 1.9)。这种思路和上节提到的“越过中间点”的判断是一样的。 可以使用 Mathf.RoundToInt 方法来实现四舍五入。Mathf 是 Unity 中的一个功能类。它含 有很多基本的数学计算功能。 还有一种实现四舍五入的方法:让数字加上 0.5 后再舍去小数部分。可以利用 Mathf. FloorToInt 方法舍去小数部分。 Mathf.RoundToInt(dist / total_width); 四舍五入 Mathf.FloorToInt(dist / total_width + 0.5f); 加上 0.5 后舍去小数部分(效果等同于四舍五入) 使用 RoundToInt 和 FloorToInt 方法时,需要注意输入值为负数的情况。RoundToInt 直接对 绝对值进行操作,而 FloorToInt 则会连同符号判断数值大小。 右表举例列出了分别用这两种方法对正负数 进行操作的结果。 在这个游戏中,武士的坐标只取正数。由于 即使武士会往相反的方向移动也要判定“更近的一 输入值 RoundToInt结果 FloorToInt结果 1.4 1 1 -1.4 -1 -2 端”,因此程序中使用了 RoundToInt 方法。但是在某些游戏中,则可能需要找出“更靠近左边的 一端”,这种情况下就应该使用 FloorToInt 方法。总之,我们应当依据不同的情况灵活选择最好 的方法。 1.4.5 小结 到此为止,我们对循环显示背景组件的方法做了改良。不过大部分情况下,使用前一小节 所介绍的方法就足够了,一般没有必要考虑怪物和武士的移动。开发过程中花太多精力在无关 紧要的事情上容易造成本末倒置,不过在时间允许的情况下适当做一些有益的尝试,也许会对 后续的开发很有帮助。请读者在明确“完成游戏”这一目标的同时,享受这种探索的乐趣。