unity中汽车经过加速带如何实现加速

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity中汽车经过加速带如何实现加速相关的知识,希望对你有一定的参考价值。

从物理受力的角度分析:汽车前进的动力就是:汽车的驱动轮(胎)先转动,称为主动轮,地面就对主动轮就有摩擦力的作用,方向与车行驶的方向相同,这就是汽车前进的驱动力(牵引车)F!而地面与从动轮的摩擦力,轮胎的滚动阻力,空气阻力(速度快,空气阻力大)等就是汽车行驶时的阻力f,与汽车运动的方向相反。对于前后轮双驱的汽车,前后轮均为主动轮,地面对汽车的摩擦力均与汽车运动方向相同,驱动力增大,阻力就是滚动力和空气阻力等。

当驱动力F大于阻力f时,汽车加速前进,加速度a由牛顿第二定律F-f=ma计算,其中m是汽车的总质量。

当F=f时,汽车加速度a等于0,汽车匀速前进,F由功率公式P=Fv,其中汽车的最大功率P是有限度的,它由发动机决定,可当为一定。随着汽车速度v的增大,汽车的牵引力F就会减小,当驱动力F减小到等于阻力f时,汽车的加速度a=0,汽车的速度达到最大值,此时汽车就以最大速度匀速前进!当然:将油门关小时,汽车实际功率变小,驱动力F随之减小,汽车减速,汽车所受阻力减小,直至减速的加速度a=0时,汽车就会以另一速度值做匀速运动!汽车在小油门行驶时的情况与以上分析相同,只是实际功率小于额定功率而已。所以:汽车的最大速度是由汽车发动机的最大功率和汽车行驶时的阻力f(地面与从动轮的摩擦力,轮胎的滚动阻力,空气阻力(速度快,空气阻力大等)决定的!

以下为汽车在行驶过程中的大体受力分析图
参考技术A 玩家按下W键并且车辆没有达到最大速度时,则车辆加速,若达到最大速度,则车辆速度保持不变。
当玩家按下S键并且车辆速度没有达到最小时,则车辆减速,并且减速速率大于加速。
参考技术B 材质和shader
Shader 是一种给GPU执行的代码,GPU的渲染流水线,为了方便开发人员定制效果,开放出接口给程序员编写代码来控制,这种程序叫作shader, shader开发语言,cocos采用的是GLSL编程语言。开发人员可以在下图顶点Shader和着色Shader来插入代码。

材质是一种配置文件,选择好一个Shader(算法), 并给这个Shader提供必要的参数,当游戏引擎绘制物体的时候,先读取材质,根据材质, 给GPU配置shader和shader要的参数, 这样管道流水线就可以完成的绘制出来这个物体。

2: 准备工作
准备一个子弹头模型(子弹列车^_^)



准备一个加速特效的火焰与透明渐变的贴图:



3: 实现的效果:

角色移动、加速 C# Unity

【中文标题】角色移动、加速 C# Unity【英文标题】:Character Movement, Acceleration C# Unity 【发布时间】:2019-09-23 14:03:21 【问题描述】:

大家好,这里是新手。

自上而下的塞尔达风格游戏。

我正试图弄清楚如何让我的播放器建立速度到最大速度然后降低速度到停止。

我已经使用 GetRawAxis 进行了移动,但是当我使用此方法按下移动时,我的字符以最大速度移动。

private void PlayerMovement()

    var playerMovement = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized * Time.deltaTime * moveSpeed;

    transform.position = new Vector3(
        transform.position.x + playerMovement.x,
        transform.position.y + playerMovement.y,
        transform.position.z);

【问题讨论】:

请提供代码和/或更多信息 你可以尝试使用 RigidBody 的 AddForce 在摇杆的方向上,而不是设置速度,并添加一些阻力以使他在没有主动施加力的情况下缓慢停止 这是我当前的移动方法 private void PlayerMovement() var playerMovement = new Vector2(Input.GetAxisRaw("Horizo​​ntal"), Input.GetAxisRaw("Vertical")).normalized * Time.deltaTime *移动速度; transform.position = new Vector3(transform.position.x + playerMovement.x, transform.position.y + playerMovement.y, transform.position.z); 抱歉不知道如何让代码看起来正常 @Tas7e 嘿,我在这里看到了你刚刚删除的问题:***.com/questions/67320573/… 我正要发布答案,所以无论如何希望它对 pastebin.com/6ZRed1eu 有所帮助 【参考方案1】:

这是一个场景,您可以在 x 轴上移动对象,逐渐提高速度。你可以对减速做同样的事情。逐渐将速度降低一个值。

float acceleration = 0.6;
float maxSpeed = 30;
float speed = 0;

void Update()
   if(speed < maxSpeed)
      speed += acceleration * Time.deltaTime;
    

   transform.position.x = transform.position.x + speed*Time.deltaTime;


【讨论】:

1) 这仅适用于 X 轴上的运动 2) 不考虑玩家输入和 3) 不包括减速。 是的,我知道它不会做任何事情,但这就是重点。我只是在为他指出正确的方向。他可以将逻辑应用到其他场景。【参考方案2】:

你可以试试Vector3.SmoothDamp

这使用了一个存储当前“速度”的 Vector 并缓慢转储。

可以在此处找到示例: https://docs.unity3d.com/ScriptReference/Vector3.SmoothDamp.html

【讨论】:

以上是关于unity中汽车经过加速带如何实现加速的主要内容,如果未能解决你的问题,请参考以下文章

如何加速无尽的跑步者

C/C++编程:C++中的抽象——知识详解

Javascript如何实现GPU加速?

unity 如何让物体匀加速和匀减速运动,求代码

角色移动、加速 C# Unity

如何加速基于Python的libsvm速度