解说Unity3D教程:制作简单汽车游戏
现实与游戏中的汽车漂移
在现实世界中,汽车漂移并非易事。它需要轮胎与地面保持低摩擦,同时配合良好的悬挂系统。然而,在游戏里完全模拟力学引擎并不现实。因为在现实中实现漂移需要高超的技能,我们不能期望玩家具备专业技能来操控或改装游戏中的车辆,比如玩家可能会在拐弯时忘记拉手刹,或者拉手刹时间过长。而且,完全的物理模拟不仅会消耗开发者大量的脑力来进行工业设计,还会占用过多的电脑资源用于运算。毕竟,我们开发的并非像微软模拟飞行那样的专业级模拟游戏。
汽车侧翻问题及解决思路
在开发过程中,经过无数次失败的代码尝试,我们发现高速移动的赛车3D模型在突然转弯时会侧翻。这并非游戏引擎的问题,通过查阅大量汽车侧翻事故资料可知,这是客观存在的现象。能实现漂移的汽车,需要具备稳定精确的汽车架构、很低的底盘、专业级的悬挂系统、每个部件精确的调试以及一系列汽车辅助系统。
虽然在Unity 3D(U3D)中,即便将重心和底盘设置得极低,高速运动下转弯时汽车依然会侧翻,而且专业级的悬挂系统在游戏里也难以模拟。侧翻问题不可避免,但在游戏中不能让玩家稍有操控失误就导致车辆侧翻,否则会严重影响游戏性。曾尝试通过加大重力的方法来防止侧翻,但这样会加大摩擦力,使得使用物理引擎模拟漂移变得更加困难。自动稳定杆系统(ASBS)能有效防止侧翻,但为一款游戏专门实现该系统过于繁琐。
漂移的解决方案
经过几天的研究,总结出了几套漂移的解决方案,这里重点介绍最后一种方案。
方案一:坐标移动法
整个赛车采用 translate 进行坐标移动,这种方法无视 wheelcollider 物理引擎,适合新手,操作简单方便。但在后续开发中会面临诸多问题需要解决。
方案二:悬挂与摩擦力设置法
利用 wheelcollider 的悬挂设置和摩擦力设置来实现漂移。这应该是最标准的做法,但一直未能研究出 Forward Friction 和 Sideways Friction 具体该如何设置,以及这些设置会产生怎样的效果。官方的赛车例子也无法实现漂移。此方法的移动是通过 wheelcollider 的 motorTorque 来实现的。
方案三:刚体施力法
轮子依然使用 wheelCollider,但汽车移动的动力不依靠轮子的 motorTorque,而是在汽车的 rigidbody 上施加 Force 来传动。官方的例子采用了这种方法,这也说明官方可能意识到了 wheelcollider 引擎存在问题。使用 Force 的好处是可以在拐弯时进行受力分析,计算出侧滑的合力方向和大小,实时计算赛车动力方向和侧滑判定。不过,该方法存在汽车稳定性问题,在高速运动时很难保证车辆的稳定,自行开发 ASBS 系统也不太现实。
方案四:混合处理法
这是本文推荐的方法,采用 wheelcollider 和 translate 混合处理。重要的是,所有汽车的移动和转弯都必须使用 wheelcollider 提供的函数(具体原因可参考关于 wheelcollider 的日志)。使用 wheelcollider 方法可以保证车子正常运动,但不会实现漂移(要么车速过快导致侧翻,要么直接正常转弯)。判断漂移只需在玩家点击手刹时,计算车子拉手刹瞬间的转弯角和惯性方向,然后使用 transform.translate 来实现甩尾,这样可以有效规避不必要的摩擦判断和物理判断。
手刹拉起后,前后轮抱死产生的摩擦和离心力会改变整辆车合力的方向,从而导致汽车运动方向改变,产生漂移。我们假设玩家拉的不是手刹,而是普通的制动闸,只有制动减速效果。所以先用 wheelcollider 进行正常的拐弯减速运动,然后单独编写一个 translate 按预计漂移方向进行物体移动。当手刹按钮按下后,再进行强行物体移动,模拟减速移动来产生漂移的摩擦衰减效果(transform 的坐标移动不受物理引擎影响,编写起来较为简单)。
这样综合起来就能构建出漂移效果的初步框架。玩家操作简单,开发者开发也相对容易,后续只需慢慢调试一些数据来改善用户体验即可。