【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#专题篇】---核心章题单实践练习


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



相关推荐
老猿讲编程6 分钟前
航展畅想:从F35机载软件研发来看汽车车载软件研发
汽车·车载软件研发
qq22951165028 分钟前
微信小程序的汽车维修预约管理系统
微信小程序·小程序·汽车
半盏茶香1 小时前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
逐·風6 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
_oP_i8 小时前
Unity Addressables 系统处理 WebGL 打包本地资源的一种高效方式
unity·游戏引擎·webgl
PandaQue8 小时前
《怪物猎人:荒野》游戏可以键鼠直连吗
游戏
代码盗圣11 小时前
GODOT 4 不用scons编译cpp扩展的方法
游戏引擎·godot
Renderbus瑞云渲染农场12 小时前
云渲染与汽车CGI图像技术优势和劣势
汽车
白狐欧莱雅13 小时前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame
豆本-豆豆奶14 小时前
用 Python 写了一个天天酷跑(附源码)
开发语言·python·游戏·pygame·零基础教程