Unity官网赛车教程第二部分—调整赛车

来源:互联网 发布:淘宝如何提高转化率 编辑:程序博客网 时间:2024/05/23 19:17

在Unity中创建一个赛车游戏


CarTutorialSection_21.jpg

第二部分:调整赛车

完成了教程的上一步之后,赛车已经有了不错的效果。但在赛道跑上几圈,我们明显的感觉到赛车不太完美,仍需改进。

现在我们开始优化,当我们开发游戏时,好的优化将会使我们的游戏更加有趣,具有挑战性,更加完美,除此以外,还能达到我们的其他目标。具体来说,当我们初步完成游戏并开始测试时,多多少少有些地方不尽如人意。比如说我们希望使赛车的操作更加顺畅,最高速度更快,场景的光照更加充沛一点。

强大的优化能力是Unity的一大特长,我们在inspector中可以修改public变量。更强大的是,但我们运行游戏时,可以更改其中的变量,并实时看到变化。而不是每更改一个变量就要重新编译一次。


重心

  现在最迫切的问题就是翻滚了,在转弯的时候,赛车十分容易发生翻滚(如果你还没有测试过,那请在游戏中加速转弯,你会发现赛车很容易出现这种情况)。原因是我们没有定义赛车的重心。对于赛车刚体来说,所有力都施加在它的重心(译者注:并非如此,作者此处可能做了简化处理)。Unity会依照添加到刚体(Rigidbody)的碰撞器(Collider)计算刚体的重心,所以它可能会在赛车游戏对象或它的子对象中。鉴于重心并不在赛车的中心(可能也不在Unity计算的中心),所以我们需要做一些调整。

CarTutorialSection_22.jpg

汽车的重心通常在引擎位置和一些其他因素决定,不同的车辆的重心差异很大。在这个教程中,赛车重心在引擎的下方不远,地面的上方。如图片所示。






1.建立一个新的GameObject,并添加到Car gameobject中(成为子对象)。

2.重命名为CenterOfMass

3.重置CenterOfMass的变换属性(在InspectorTransform面板中点击右侧的锯齿状按钮,

打开下拉菜单,选择“Reset”,这个操作将会将父对象(Car)的属性赋予给它)。

4.通过移动对象或输入坐标调整它到你想要的地方。或者参考下面这个位置(0,0.1,0.65)。

5.Inspector中,将CenterOfMass拖拽到Carscript组件的对应属性中。




通常来说,将重心偏离赛车的对称面会产生一些古怪的效果,所以我们需要将X变量设置为0.

我们需要将摄像机目标设置为CenterOfMass游戏对象。这可能会和设置为Car有些不同,但不会带来很大变化。体验这两种方式,并选择一个自己喜欢的设置。






悬挂系统

悬挂是另一个影响赛车的重要因素,它的功能是使轮胎和地面之间的摩擦力达到最大。但我们的赛车经过突起的路面时,轮胎上所有垂直方向的能量将会转化给车身。如果没有悬挂这种交互部件,那么轮胎会轻易离开地面,然后受重力作用于地面发生碰撞。

CarTutorialSection_24.jpg

CarTutorialSection_23.jpg


















在Inspector中,有3个变量可供调整:幅度(range),阻尼器(damper),弹簧(spring)。它们在刹车轮胎的WhellCollider类中。

在上图中,左边是赛车的标准设置,右边中的赛车有一个很大的悬挂幅度。结合幅度,阻尼,弹簧这个三个属性,我们可以逼真的模拟从一级方程式赛车到怪物卡车的不同车辆,当然,我们的模型和动画也需要和这些设置完美匹配,以获得最佳效果。


悬挂幅度

这是悬挂被完全压缩到立车最远时的距离。



悬挂弹簧


这里的变量决定了弹簧的劲度系数,当它的值被设置得很大时,悬挂更容易完全伸展,轮胎和车身会有较大的距离;但它被设置的很低时,悬挂系统更具有弹性。设置这个变量时,需要考虑到赛车的重量,一辆很重的赛车比很轻的赛车需要更硬度系数更高的弹簧。通常,我们将前轮的悬挂系统较后轮设置得更硬,因为赛车的重心偏前部,那里需要更硬的悬挂。到这里,请读者尝试不同的设置,并在游戏中体验不同悬挂效果。


悬挂阻尼

阻尼用于控制悬挂的运动。如果没有阻尼器,悬挂系统的弹簧会不停的压缩,伸长直到弹簧中的机械能用尽。这会使赛车不停的弹跳并难以控制。阻尼器或震动控制器将那些没有用的机械能转化为内能,并传递到到液压机液体中(hydraulic fluid),使赛车更加流畅。


阻力乘数

当我们给赛车添加刚体属性时,我们就考虑过阻力属性,这种阻力是外接施加给刚体的摩擦力或空气阻力,阻碍它的运动。但我们设计赛车外形时,都会考虑到空气动力学因素,减少赛车的空气阻力。所以我们也应该将外形考


虑在内,在三个视图中观察我们的模型,它是流线型的。

我们通过自己创建的阻力乘数属性代替刚体的属性设置阻力属性。在Inspector的Car script中找到Drag Multiple变量,它有x,y和z三个数值。这使我们有足够的自由分别设置前面,侧面,顶部的阻力,使赛车的驾驶更加真实。



•        X数值是侧面的阻力

•        Y数值是顶部的阻力

CarTutorialSection_25.jpg

•        Z数值是前面的阻力



X数值对应的阻力防止赛车在转弯的时候发生侧滑。X数值越大,转弯的

难度越大。

Z数值可以增加或者减少影响赛车速度的阻力,调整它的数值会很有趣。如果数值小于1,加速度和最高时速会更大;如果数值大于1,赛车不得不努力挣脱强大的阻力,速度自然变慢。这个数值十分敏感,我一我们建议调整这个数值时,使用更小的变化量。

因为赛车只是在赛道上运动,所以我们对它不太感兴趣。因为在Y轴上最重要的力是施加在刚体上的重力。



速度,转弯和传动转置

现在我们开始调整更加直观的变量,他们对我们赛车也有很大的影响。

调整最高时速无需太多的思考,这决定了赛车行进的速度。因为我们赛车模型比实际中简单多了,除了阻力之外,我们无需为赛车加速设置其他参数。最高时速也不是直接影响因素。设置这个参数更高会使我们赛车速度更高,反之亦然。如果你想得到一个很高的速度,可以同时调整最高时速和Z轴的阻力数值。

对于转弯设置,我们有两个变量,最大转弯属性(Maximum Turn)和最小转弯属性(Minimum Turn),它们共同决定赛车转弯的性能。把它们设置的很高,我们可以获得很好的转弯体验,反之亦然。我们在Car script中依照汽车的速度设置这些数值。





•               在很低的速度时,我们在转弯中使用最大转弯属性(Maximum Turn)


•                在很高的速度时,我们在转弯中使用最大转弯属性(Minimum  Turn)





当使用默认数值时(最小10,最大15),速度越大,转弯越困难。这种体验十分真实,想象下,我们不可能在赛车处于最高速度时进入发卡弯,并希望它可以顺利通过。我们可以设置不同的参数,得到不同的过弯体验。

最后我们设置档位数目变量(Number Of Gears)。在后面的部分中,我们将研究他在Car script中的作用。因为我们的模型并不是真正的车辆,所以我们也不会模拟真正赛车的档位。不过我们使用它模拟引擎的动力,以及对声音的控制(这个好像更重要)。我们通过它的大小调整声音表现引擎的动力,模拟在每一个档位中,开始时转速较低,然后增加转速,到达极限并切换到下一个档位。这个参数通过不同的声音模拟不同的档位。

将赛车以package导出

如果你按照上面的步骤设置了你自己的赛车,那我们应该学习如何将它导入到我们自己的项目中,一个简单的方法就是将我们的Prefabs做成Unity Package。



首先我们先将我们的赛车整合到Prefab中,下次我们就不必再次组转和调试。





•       在项目(project)面板中,点击“create”选择“Prefab”,我们会得到一个名字为“newprefab”的空的Prefab

•       将Prefab命名为‘RaceCar’或其他你喜欢的名字。


•       将Car  GameObject拖拽到Prefab中



虽然这一步已经做好了,但我们需要自己动手创建一个。



在我们创建package过程中,在CarPrefab里,我们需要除去一些组件

(Skidmarks,Main_Camera 和 Directional_Light_Car_Road.),使我

们得到一个纯净的赛车。


另外,我们还需要添加一些脚本到我们的package中(如果我们不指定它们不会被导出),包括SoundToggler.js,ImageEffects.cs 和ImageEffectsBase.cs它们虽然没有在场景中使用,但是在游戏代码中用到。Pro Assets中含有imagescripts,但是我们还是要导出它,以便我们在空白的项目中用到它。

CarTutorialSection_26.jpg




• 在项目(Project)面板中我们选择以下对象


•       Prefabs/VFX: Directional_Light_Car_Road,Main_Camera,


Skidmarks


•        scripts/Javascripts:SoundToggler.js


•        ProStandard Assets/Image Based/ImageEffects.cs 和


ImageEffectsBase.cs


•      你创建的Car Prefab.


•      点击 ‘Export package...’


•      在弹出对话框中确定选中 “Include dependencies”。这个设置将会导出你选中的那些在代码中用到的资源


•      点击导出,并保存。





在你自己的项目中使用Car十分轻松


•      在你的项目中点击 Assets->Import package...


•      选择到你的包并导入。


•       确保每一项都被选中,导入他们


•      Unity会导入prefab中的所用资源,接下来就可以使用了





这个car prefab 是完全免费的,你可以随意使用。现在我们学习了如何将汽车组装,调试,并且导出package,在不同的项目中使用。接下来,我们将会学习更加有趣,具有挑战性的内容。