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

news2024/11/26 0:39:17

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

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

🅰️Unity3D赛车游戏



文章目录

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


前言


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



🎶(A系统的优化——漂移


  • 插件工具
    在这里插入图片描述

😶‍🌫️效果对比:


  • 加上漂移代码
    在这里插入图片描述
  • 未加漂移代码、
    在这里插入图片描述

😶‍🌫️漂移的实质:


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

  • 相关参数
    在这里插入图片描述
  • 重要参数官方手册解释

描述轮胎的摩擦属性_WheelFrictionCurve

关节弹簧_JointSpring

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

在这里插入图片描述

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


😶‍🌫️阻力优化


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

在这里插入图片描述

😶‍🌫️转向优化


在这里插入图片描述

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

😶‍🌫️制动优化


  • 手刹管理优化前代码
    在这里插入图片描述
  • 优化后:

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

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


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


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/973542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P3074 [USACO13FEB] Milk Scheduling S(拓扑排序)

思路&#xff1a; 核心&#xff1a;拓扑排序 ans[x]max(ans[x],ans[t]f[x]); 注意比当前大才更新&#xff01;&#xff01;&#xff01; 接下来几乎就是拓扑排序模板啦~ ACcode: #include<bits/stdc.h> using namespace std; #define int long long const int N5e41…

在windows 安装JDK17 指南

一、下载jdk 去oracle官网下载jdk压缩包&#xff0c; 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java17 二、解压jdk 将下载好的jdk压缩包&#xff0c;解压到要安装jdk的路径&#xff08;不要有中文&#xff09;&#xff0c; 三、配置环…

2023年7月婴幼儿辅食市场数据分析(京东商品数据)

随着人们对婴幼儿饮食健康的关注不断增加&#xff0c;市场对高品质、安全、营养丰富的辅食需求也日益旺盛。婴幼儿辅食市场增长放缓&#xff0c;但整体仍保持上升态势。鲸参谋数据显示&#xff0c;今年7月份&#xff0c;京东平台婴幼儿辅食市场的销量为1000万&#xff0c;同比增…

高级IO 1

1.IO 等 数据拷贝 等好了 -> IO事件就绪 &#xff08;“等”是做了条件检测&#xff09; 2. IO的五种模型 1.阻塞IO 2.非阻塞IO 如果内核还未将数据准备好 , 系统调用仍然会直接返回 , 并且返回 EWOULDBLOCK 错误码 非阻塞 IO 往往需要程序员循环的方式反复尝试读写文…

Java“牵手”京东商品价格数据,京东商品历史价格数据接口,京东API接口申请指南

京东平台商品历史价格接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片&#xff0c;历史价格&#xff0c;现在的价格等详细信息 。 获取商品价格接口API是一种用于获…

配置markdown图片粘贴地址

背景 由于最近需要写较多文档&#xff0c;涉及到大量的图片存储&#xff0c;但又不想买图床&#xff0c;所以选择最简单的图片存储方式&#xff1a;将图片存储在文档所在目录下的另一个文件夹中。那么要实现这个功能就需要借助VScode的插件了&#xff0c;插件名&#xff1a;Pa…

嵌入式学习笔记(12)汇编写启动代码之设置栈和调用C语言

C语言运行时需求和栈的意义 “C语言运行时&#xff08;runtime&#xff09;”需要一定的条件&#xff0c;这些条件由汇编来提供。C语言运行时主要是需要栈。 C语言和栈的关系&#xff1a;C语言中的局部变量都是用栈来实现的。如果我们汇编部分没有给C部分预先设置合理合法的栈…

windows从0搭建python3开发环境与开发工具

文章目录 一、python3下载安装1、下载2、安装3、测试 二、安装VS Code1、安装2、安装python插件3、测试 三、pip命令的使用1、基本命令2、修改pip下载源 一、python3下载安装 1、下载 打开 WEB 浏览器访问 https://www.python.org/downloads/windows/ &#xff0c;一般就下载…

机器视觉工程,如何快速摸清即将面试公司的基本情况

1.公司背景调查 企业查&#xff0c;天眼查&#xff0c;对一家公司的股东信息&#xff0c;知识产权&#xff0c;经营范围&#xff0c;是否有诉讼&#xff0c;经营范围等等信息&#xff0c;以及网上对其的整体评价&#xff0c;薪资整体水平等等。 2.公司官方网站 有些公司的网…

Navicat连接mysql报错2003(10060)的解决方法

1、MySQL的服务没有启动&#xff0c;这个是最常见的问题原因 WINR&#xff0c;输入services.msc打开服务管理器&#xff0c;找到mysql 如果显示mysql为禁用状态&#xff0c;可以右键启动服务&#xff0c;然后在Navicat重新测试连接

mFast解析FAST行情内容

目录 一、准备 二、mFast功能 三、解码 四、结果 mFAST FAST协议解析&#xff08;五&#xff09;开源解析库mFAST的使用 - nil - xuanyu.li FAST是将明文内容通过一定规则编码为二进制内容&#xff0c;目的是压缩数据&#xff0c;减小传输压力。解码的时候&#xff0c;可…

vue antv X6流程图

第一 下载2.0插件 第二 引入代码 <!-- --> <template><div id"container" style"min-width: 400px; min-height: 600px"></div> </template><script > //这里可以导入其他文件&#xff08;比如&#xff1a;组件&am…

视频号如何做视频任务进行变现

上节给大家分享了在视频号中的视频如何挂橱窗商品链接进行变现 如果有不清楚的&#xff0c;可以看我上一条视频 以防失联&#xff0c;建议点赞&#xff0c;收藏&#xff0c;加关注 今天跟大家分享的是视频号如何做任务进行变现 只要参与视频号平台变现任务&#xff0c;一条视频…

嵌入式学习笔记(13)汇编写启动代码之开关iCache

什么是cache&#xff0c;有什么用 cache是一种内存&#xff0c;叫高速缓存。 从容量来说&#xff1a;CPU < 寄存器 < cache < DDR 从速度来说&#xff1a;CPU > 寄存器 > cache > DDR cache的存在&#xff0c;是因为寄存器和DDR之间速度差异太大了&#x…

源码角度解析SpringBoot 自动配置

文章目录 前言一、了解相关注解1.Condition注解2.Enable注解 二、SpringBoot自动配置1.SpringBootApplication注解2.SpringBootConfiguration注解3.EnableAutoConfiguration注解4.Conditional注解 总结 前言 Spring Boot 自动配置是 Spring Boot 的核心特性之一&#xff0c;它…

无人化在线静电监控系统的组成

无人化在线静电监控系统是一种用于检测和监控静电情况的系统&#xff0c;它可以自动地实时监测各个区域的静电水平&#xff0c;并在出现异常情况时发出报警信号。静电监控报警器则是该系统中的一个重要组成部分&#xff0c;用于接收和传达报警信号。 无人化在线静电监控系统通…

【人工智能】—局部搜索算法、爬山法、模拟退火、局部剪枝、遗传算法

文章目录 局部搜索算法内存限制局部搜索算法示例&#xff1a;n-皇后爬山算法随机重启爬山模拟退火算法局部剪枝搜索遗传算法小结 局部搜索算法 在某些规模太大的问题状态空间内&#xff0c;A*往往不够用 问题空间太大了无法访问 f 小于最优的所有状态通常&#xff0c;甚至无法储…

SpringMVC入门篇

目录 1.SpringMVC工作流程 2.SpringMVC核心组件 2.1 DispatcherServlet 2.2 HandlerMapping 2.3 Handler 2.4 HandlerAdapter 2.5 ViewResolver 2.6 View 3.SpringMVC的入门 3.1 添加相关依赖 3.2 创建Spring-mvc.xml 3.3 配置web.xml 3.4 效果演示 4.静态资源处…

静态路由——实现两个不相连的网段通信实验

路漫漫其修远兮&#xff0c;吾将上下而求索 今天做一个简单的实现两个不相连的网段通信实验&#xff0c;本实验使用静态路由配置&#xff0c;主要 加强初学者对静态路由的理解。 实际中不可能只使用静态路由&#xff0c;还要使用诸多的其他网络协议&#xff0c;达到安全可靠的…

揭榜!9家行业代表性企业获得软件/智舱/车联细分赛道标杆奖

过去几年&#xff0c;在特斯拉及新势力的带动下&#xff0c;车企的盈利模式正在寻求从“一次售卖”转变为“硬件预埋&#xff0b;软件付费解锁”&#xff0c;背后是驱动汽车软件架构的迭代&#xff0c;即从面向信号的软件架构&#xff0c;过渡至面向服务的SOA架构。 同时&#…