unity3d赛车游戏开发 - 漂移算法解决方案

    unity3d开发:赛车游戏开发 - 漂移算法解决方案

    因为没有看到网络上有完整的漂移算法,如果自己去按力学常识写,是很难写出漂移效果的,多次失败的尝试后总结出一些失败的结论:


    1.现实中的车不是那么好漂移的,漂移需要轮胎与地面的低摩擦和良好的悬挂系统配合。

    2.游戏里完全模拟力学引擎也是不现实的,因为漂移在现实中需要高超的技能,你不能指望玩家能有专业的技能水平去操控或者改装你的车吧,万一拐弯忘拉手刹,或者拉太久=.= 。而且完全的物理模拟,不仅费人脑去设计,也费电脑资源去运算。再说了,开发的不是微软模拟飞行这样的专业级模拟游戏。

    3.在无数次失败的代码后发现,高速移动的赛车忽然间的转弯是会侧翻的,这个不是游戏引擎问题,我查了很多的汽车侧翻事故,这个东西是客观存在的,也就是说能漂移的汽车,需要有稳定精确的汽车架构,很低的底盘(我试过这个,但是在u3d里不管用,重心和底盘都快贴到地上了,依然高速运动下转弯会侧翻),专业级的悬挂系统(这很重要,这也是游戏里模拟不出来的),每个部件精确的调试,还有一大堆的汽车辅助系统(这个后面说)。

    4.侧翻不可避免,但游戏里不允许玩家稍微操控失误就侧翻,这会大大影响游戏性。我试过用加大重力的方法来防止侧翻,但是加大重力也就加大了摩擦力,使用物理引擎去模拟漂移就更加的困难。

    5.自动稳定杆系统(ASBS)能有效防止侧翻,但是为了一款游戏有必要这么麻烦么?

    经过几天的研究,我研究出几套漂移的解决方案(我开发采用的是最后一种,重点介绍最后一种)

    方案1.整个赛车干脆都用translate做坐标移动,这个就是无视wheelcollider物理引擎的做法,新手适用,简单方便,但之后的开发上会有很多问题需要解决(如果你想解决这些问题的话)。

    方案2.用wheelcollider的悬挂设置和摩擦力设置做。这个应该是最标准的,但是我一直没研究出来他的Forward Friction和Sideways Friction怎么设置,并且这些设置有什么效果=.=(我是用极值法来试验他怎么用的,但感觉这个东西很鸡肋,没啥效果,官方的例子也没有用到这个做开发,外带说下,官方的赛车例子根本不会漂移)。当然这个做法的移动是使用wheelcollider的motorTorque做移动的(这应该是官方希望的)。

    方案3.轮子一样还用wheelCollider,但汽车移动的动力不使用轮子的motorTorque,而是在汽车的rigidbody上施加Force来传动(官方的例子是这样的,这也是令我匪夷所思的,只能说明官方也知道他的wheelcollider引擎还有问题)。用Force有个好处,你可以在拐弯的时候做受力分析,计算出最后侧滑的合力方向和大小,实时计算赛车动力方向和侧滑判定。这个唯一的问题就是汽车稳定性问题,在高速运动的汽车中很难保证他的稳定,自己开发ASBS系统也不太可能吧-.-。

    方案4.这个是我的方法,用wheelcollider和translate混合处理。首先一点重要的,所有汽车移动,转弯都必须使用wheelcollider提供的函数(至于为什么参看我关于wheelcollider的日志),用wheelcollider方法可以保证车子正常运动,但不会漂移(要么过快车速侧翻,要么就直接转弯过去了),判断漂移只需要判断玩家点击手刹的时候,计算车子拉手刹一瞬间的转弯角和惯性方向,使用transform.translate来实现甩尾,有效规避掉不必要的摩擦判断和物理判断。我画个图示意下漂移大致原理(云姐要是看到肯定很高兴^^):



unity3d赛车游戏开发 - 漂移算法解决方案_第1张图片


    由于手刹后前后轮抱死产生的摩擦和离心力的作用改变了整辆车合力的方向,所以导致汽车运动方向的改变,产生漂移。那我们假设他拉得不是手刹,而只是普通的制动闸,只有制动减速效果,所以先用wheelcollider做正常的拐弯减速运动,然后单独写一个traslate按预计漂移方向做物体移动,并判断当手刹按钮按下后再进行强行物体移动加以模拟减速移动来产生漂移的摩擦衰减效果(transform的坐标移动是不受物理引擎影响的,所以写起来就很简单。)


unity3d赛车游戏开发 - 漂移算法解决方案_第2张图片


    这样最后综合起来的效果就能产生漂移效果的最初框架了。玩家操作简单,开发者开发也简单,何乐而不为。最后剩下的工作就是要去慢慢调试一些数据来改变用户体验了。

    欢迎大家提出宝贵意见或者建议,我会慢慢完善赛车引擎脚本的。




你可能感兴趣的:(unity3d赛车游戏开发 - 漂移算法解决方案)