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


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏Unity游戏demo

⭐🅰️Unity3D赛车游戏⭐



文章目录


⭐前言⭐

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



🎶(A)系统的优化------漂移


  • 插件工具

😶‍🌫️效果对比:


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

😶‍🌫️漂移的实质:


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

  • 相关参数
  • 重要参数官方手册解释

描述轮胎的摩擦属性_WheelFrictionCurve

关节弹簧_JointSpring

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

  • 关键代码:
csharp 复制代码
    //漂移相关
    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)系统的优化------转向 ,阻力 和 制动


😶‍🌫️阻力优化


静止时空气阻力我们设置大一点

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

😶‍🌫️转向优化


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

😶‍🌫️制动优化


  • 手刹管理优化前代码
  • 优化后:

------ 为什么这样,刹车这么小能刹住吗?

可以我们的自动变速器会自动减慢速度

csharp 复制代码
 //手刹管理
    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#专题篇】---核心章题单实践练习


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



相关推荐
仙魁XAN3 小时前
Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】
unity·设计模式·工厂方法模式·抽象工厂模式
我要吐泡泡了哦5 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
躺下睡觉~13 小时前
Unity-Transform类-父子关系
java·unity·游戏引擎
躺下睡觉~13 小时前
Unity-Transform类-缩放和看向
unity·游戏引擎
君莫愁。15 小时前
【Unity】检测鼠标点击位置是否有2D对象
unity·c#·游戏引擎
咩咩觉主16 小时前
Unity实战案例全解析:PVZ 植物卡片状态分析
unity·c#·游戏引擎
稳联技术17 小时前
汽车焊机数据通信:Profinet转Canopen网关的神奇连接
服务器·网络·汽车
毕设木哥18 小时前
计算机专业毕业设计推荐-基于python的汽车汽修保养服务平台
大数据·python·计算机·django·汽车·毕业设计·课程设计
achirandliu18 小时前
汽车电子电气架构从12V提升至48V,带来那些好处? 包括那些改变?
架构·汽车·汽车电子电气架构·从12v升到48v
蓝裕安19 小时前
伪工厂模式制造敌人
开发语言·unity·游戏引擎