【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?


‍个人主页:@元宇宙-秩沅

‍ hallo 欢迎 点赞 收藏⭐ 留言 加关注✅!

本文由 秩沅 原创

‍ 收录于专栏:Unity游戏demo

️Unity3D赛车游戏



文章目录

    • ️Unity3D赛车游戏
    • 前言
    • (==A==)系统的优化——漂移
        • ‍️效果对比:
        • ‍️漂移的实质:
    • (==B==)系统的优化——转向 ,阻力 和 制动
        • ‍️阻力优化
        • ‍️转向优化
        • ‍️制动优化


前言


‍️版本: Unity2021
‍️适合人群:Unity初学者
‍️学习目标:3D赛车游戏的基础制作
‍️技能掌握:



A系统的优化——漂移


  • 插件工具

‍️效果对比:


  • 加上漂移代码
  • 未加漂移代码、

‍️漂移的实质:


拦截后轮运动,发生滑动,我们向前行驶时车轮的摩擦力更大,而侧向行驶时车轮的摩擦力则非常小

  • 相关参数
    【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?_第1张图片
  • 重要参数官方手册解释

描述轮胎的摩擦属性_WheelFrictionCurve

关节弹簧_JointSpring

轮式碰撞机悬架弹簧_WheelCollider.suspensionSpring

【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?_第2张图片

  • 关键代码:
    //漂移相关
    public void Drift()
    {
        //漂移平滑因素
         drfitSmoothFactor = 0.7f * Time.deltaTime;

        if (InputManager.InputManagerment.handbanl)//如果按下空格刹车
        {
            //给轮胎侧向和前滑摩擦属性初始化赋值
            sidewaysFriction = wheels[0].sidewaysFriction;
            forwardFriction = wheels[0].forwardFriction;
            float velocity = 0;
            //侧滑摩擦特性的极值 =  侧滑渐进点打滑的力 = 前滑摩擦特性的极值 = 前滑渐进点打滑的力 = 
            sidewaysFriction.extremumValue = sidewaysFriction.asymptoteValue = forwardFriction.extremumValue = forwardFriction.asymptoteValue

            //前滑摩擦特性的极值 向 漂移参数*手刹系数 平滑移动
            = Mathf.SmoothDamp(forwardFriction.asymptoteValue, driftFactor * handBrakeFrictionMultiplier, ref velocity, drfitSmoothFactor);

            for (int i = 0; i < 4; i++)
            {
                //将初始化好的摩擦特性赋给车轮
                wheels[i].sidewaysFriction = sidewaysFriction;
                wheels[i].forwardFriction = forwardFriction;
            }
            //侧滑摩擦特性的极值 =  侧滑渐进点打滑的力 = 前滑摩擦特性的极值 = 前滑渐进点打滑的力 = 1.1f
            sidewaysFriction.extremumValue = sidewaysFriction.asymptoteValue = forwardFriction.extremumValue = forwardFriction.asymptoteValue = 1.1f;

            //给前轮增添前轮的额外抓地力
            for (int i = 0; i < 2; i++)
            {
                wheels[i].sidewaysFriction = sidewaysFriction;
                wheels[i].forwardFriction = forwardFriction;
            }

            //刚体额外添加向前的牵引力
            rigidbody.AddForce(transform.forward * (Km_H / 400) * 10000);
        }
        else  //未按下刹车的状态
        {
            //给轮胎侧向和前滑摩擦属性初始化赋值
            forwardFriction = wheels[0].forwardFriction;
            sidewaysFriction = wheels[0].sidewaysFriction;

            forwardFriction.extremumValue = forwardFriction.asymptoteValue = sidewaysFriction.extremumValue = sidewaysFriction.asymptoteValue
                = 
                ((Km_H * handBrakeFrictionMultiplier) / 300) + 1;

            for (int i = 0; i < 4; i++)
            {
                wheels[i].forwardFriction = forwardFriction;
                wheels[i].sidewaysFriction = sidewaysFriction;

            }

            //检查后轮打滑量以控制漂移

            for (int i = 2; i < 4; i++)
            {
                //声明轮胎接触信息
                WheelHit wheelHit;

                //得到轮胎接触地面的信息
                wheels[i].GetGroundHit(out wheelHit);

                smoke
                //if (wheelHit.sidewaysSlip >= 0.3f || wheelHit.sidewaysSlip <= -0.3f || wheelHit.forwardSlip >= .3f || wheelHit.forwardSlip <= -0.3f)
                //    playPauseSmoke = true;
                //else
                //    playPauseSmoke = false;

                //当侧身滑 轮胎向侧向打滑的信息
                if (wheelHit.sidewaysSlip < 0) //向右边打滑时

                    driftFactor = (1 -InputManager.InputManagerment .horizontal ) * Mathf.Abs(wheelHit.sidewaysSlip);

                if (wheelHit.sidewaysSlip > 0)//向左边打滑时

                    driftFactor = (1 + InputManager.InputManagerment.horizontal) * Mathf.Abs(wheelHit.sidewaysSlip);
            }
        }
  
    }

B系统的优化——转向 ,阻力 和 制动


‍️阻力优化


静止时空气阻力我们设置大一点
运动时我们的空气阻力就设置小一点

【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?_第3张图片

‍️转向优化


在这里插入图片描述

因为当速度越快的时候转向的角度若还是还速度慢的时候转向的角度一样很容易出现过度侧滑和大角度漂移

‍️制动优化


  • 手刹管理优化前代码
    【Unity3D赛车游戏优化篇】【九】Unity中如何让汽车丝滑漂移?_第4张图片
  • 优化后:

—— 为什么这样,刹车这么小能刹住吗?
可以我们的自动变速器会自动减慢速度

 //手刹管理
    public void HandbrakControl()
    {
        for (int i = 0; i < wheels.Length; i++)
        {
            //将车轮的制动力度初始化
            wheels[i].brakeTorque = brakVualue ;
        }

        //当按后退键时 速度大于10 km/h 制动力为500
        if (InputManager.InputManagerment .vertical  < 0)
        {
            brakVualue = (Km_H  >= 10) ? 500 : 0;
        }
        else if (InputManager.InputManagerment.vertical == 0 && (Km_H <= 10 || Km_H  >= -10))
        {
            brakVualue = 10;
        }
        else
        {
            brakVualue = 0;
        }

        //------------刹车效果平滑度显示------------

        for (int i = 0; i < slip.Length; i++)
        {
            WheelHit wheelhit;

            wheels[i].GetGroundHit(out wheelhit);

            slip[i] = wheelhit.forwardSlip; //轮胎在滚动方向上打滑。加速滑移为负,制动滑为正
        }
    }


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞 收藏⭐ 留言 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


你可能感兴趣的:(#,unity游戏demo制作,游戏,unity,汽车,游戏引擎,游戏开发)