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


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



相关推荐
虾球xz10 分钟前
游戏引擎学习第15天
学习·游戏引擎
Java Fans4 小时前
在Unity中实现电梯升降功能的完整指南
unity·游戏引擎
qq_428639617 小时前
植物明星大乱斗15
c++·算法·游戏
vir029 小时前
好奇怪的游戏(BFS)
数据结构·c++·算法·游戏·深度优先·图论·宽度优先
GrimRaider10 小时前
[Unity]TileMap开发,TileMap地图缝隙问题
unity·游戏引擎·tilemap
无敌最俊朗@10 小时前
unity3d——基础篇小项目(开始界面)
unity·游戏引擎
suzh1qian10 小时前
Unity类银河战士恶魔城学习总结(P133 Merge skill tree with Parry skill把技能树和格挡技能相组合)
学习·unity·c#·游戏引擎
泠曦れいひ10 小时前
Unity的反射机制及游戏场景
游戏·unity·游戏引擎
tealcwu10 小时前
【Unity踩坑】在Mac上安装Cocoapods失败
unity·ios·游戏引擎
作孽就得先起床11 小时前
cesium for unity的使用
unity·游戏引擎