unity car demo解析

目的

  对unity的car demo进行解析,看下wheelcollider的运行原理。

结果

  下图就是我用unity的基础模型搭建起来的车子,实现了前进、后退、转弯、刹车等功能,当然就是抄的官方的代码。

搭建模型

  摄像机、灯光使用创建场景时默认的。

  创建一个plane当道路使用,一个cube用来检测碰撞。

  cube有三种用来测试碰撞的状态。一是可以不添加rigidbody,此时cube为静态刚体,碰撞时不会动。而是添加rigidbody但是使用is kinematic选项,此时cube为动态运动学刚体,碰撞效果和静态刚体一样,不会动。三是使用rigidbody,但是不勾选is kinematic,对刚体的mass大小进行修改,我们的车子默认是1000kg,可以看到不同障碍物的碰撞反应。

  主体car,也就是车子就比较复杂了。如上图所示,主要分为模型和碰撞体两部分,碰撞体又分为车身碰撞体和车轮碰撞体。

  

车身碰撞体

  车身碰撞体用的是简单的unity中自带的boxcollider,分别用了三个表示车身、车底座、车头,当然你还可以增加你需要的collider。

车轮碰撞体 wheelcollider

  车轮碰撞体用的是unity中自带的wheelcollider,分别有前左轮、前右轮、后左轮、后右轮,参数暂时使用默认的参数。

模型

  车身模型都是使用的unity中自带的cube,车轮使用的是unity中自带的sphere。注意,需要把他们自带的collider都删除掉,因为我们在前两步已经添加了对应的collider了。

关键代码解释

方向控制

m_steerAngle = steering*m_maxSteerAngle;
            //Debug.Log(m_steerAngle);
            m_wheelColliders[0].steerAngle = m_steerAngle;
            m_wheelColliders[1].steerAngle = m_steerAngle;

wheelcollider有个参数为steerAngle,通过调节这个参数就可以控制车子的转向,这个地方需要注意车子的转向角度有个最大值,例子中给的是25°。

油门控制

 private void ApplyDrive(float accel, float footbrake)
        {
            float thrustTorque;
            switch (m_carDriveType)
            {
                case CarDriveType.FourWheelDrive:
                {
                    thrustTorque = accel*(m_currentTorque/4f);
                    for (int i = 0; i < 4; i++)
                    {
                        m_wheelColliders[i].motorTorque = thrustTorque;
                    }
                    break;

                }
                case CarDriveType.FrontWheelDrive:
                {
                    thrustTorque = accel * (m_currentTorque / 2f);
                    m_wheelColliders[0].motorTorque = m_wheelColliders[1].motorTorque = thrustTorque;
                    break;
                }
                case CarDriveType.RearWheelDrive:
                {
                    thrustTorque = accel * (m_currentTorque / 2f);

                    m_wheelColliders[2].motorTorque = m_wheelColliders[3].motorTorque = thrustTorque;
                    break;
                }
            }

            for (int i = 0; i < 4; i++)
            {
                if (CurrentSpeed > 5 && Vector3.Angle(transform.forward, m_rigidbody.velocity) < 50f)
                {
                    m_wheelColliders[i].brakeTorque = m_brakeTorque*footbrake;
                }
                else if (footbrake > 0)
                {
                    m_wheelColliders[i].brakeTorque = 0f;
                    m_wheelColliders[i].motorTorque = -m_reversTorque*footbrake;
                }
            }
        }

case语句将车子分为四驱、前驱、后驱,本例按四驱来解释。当车子为四驱时,向前的牵引力需要分配给四个轮子,所以需要除以4。accel为油门系数,当我们按”w“键时,这个值就会慢慢变为1,这时我们通过修改motorTorque参数的值就可以控制车子前进起来了。
footbrake为刹车系数,当我们按”s“键的时候,这个值会慢慢变为1,这时我们通过修改brakeTorque的值就可以给车子增加刹车力矩。当然刹车力矩时在车速比较高的条件下才需要修改的,这里我们当速度大于5km/h时就添加刹车力矩。

当汽车速度较小,footbrake参数将会用来当倒车系数,这个和油门系数一样,乘以倒车力矩的最大值,即可获得实时的倒车力矩,用来实现倒车的效果。

源码放在了360上 https://yunpan.cn/crmv3BMX49vAV  访问密码 ebc0

时间: 2024-10-09 21:03:01

unity car demo解析的相关文章

Element demo解析

Element demo解析

Unity中场景解析成Json和XML并还原场景

其实关于这部分内容,雨松研究院已经写得很清楚了,也比较权威,链接在此:http://www.xuanyusong.com/archives/1919,但是现在还是想根据自己的思路整理一下 其实原理就是讲Hierarchy中所有的父物体(即transform.parent == null)都做成预设,然后记录下每个父物体的Transform里的属性,记录到Xml或者Json文件中,然后再解析文件,把其中的预设加载到新场景里,就会得到与原场景一模一样的场景了 首先在Project里新建一个Edito

转:RealThinClient LinkedObjects Demo解析

这个Demo源码实现比较怪,有点拗脑,原因估是作者想把控件的使用做得简单,而封装太多. 这里说是解析,其实是粗析,俺没有耐心每个实现点都查实清楚,看源码一般也就连读带猜的. 这个Demo表达出的意义,在于在HTTP访问方式下,很方便的实现了客户端和服务端相互的主动通讯能力,这在需要实时消息交互,控制交互,数据互传上非常有意义,非常给力. 一.Demo工作过程 1. 实现功能:实现了上传文件到HTTP服务端的能力,大文件上传成功率极高,并且始终保持非常少的内存占用量. 2. 工作过程:客户端和服务

unity商店demo学习:俯视视角RPG游戏

一下所有素材和源码都来自unity商店的实例 Top-Down RPG Starter Kit ,这个demo是unity商店上最好的入门级rpg游戏实例,麻雀虽小,五脏俱全,想要弄清楚一个标准的rpg游戏的方方面面,这个是很好的选择. ps:demo写得很高深,看得不是很懂,准备慢慢研究. 来一张工程全貌图. 这是一个俯视视角(可以调整视角)的卡通风格3D角色扮演游戏,配着动听又欢快的背景音乐,还有那萌萌哒的怪物,仿佛又回到了初中时玩冒险岛online的时候~~,额,不废话,主要模块如下: 游

Unity之数据解析————自己小白做的一些解析数据。

本人:目前接触的只有三种C#字符串,XML,Json: c#中的字符串截取(c#的理解) 主要是运用截取字符串的方法:texe(string) 文件是utf-8的txt格式 例子: private List<class> Taskclass = new List<Taskclass>();//用来存储解析的数据 public TextAsset text; public void Read()//在此方法来解析 { string tasktext = text.ToString()

Android蓝牙联机Demo解析

写在前面: 手游的双人对战实现方式有很多,比如: 联网对战(需要一个服务器负责转发客户端请求,各种大型手游的做法) 分屏对战(手机上下分屏,典型的例子就是切水果的双人对战) 蓝牙联机对战(通过蓝牙联机,典型的例子是三国Kill联机版) 首先,联网对战不考虑(成本高,服务器贵..),而分屏对战局限性太大(两个人用一个手机玩,太不方便了) 所以蓝牙联机对战是不错的选择,低成本,可实现(三国Kill就是最好的例子,至少证明了这是可行的) 一.资源搜集 搜索“安卓开发蓝牙联机”,找到很多有用的信息,经过

【Unity】JsonUtility解析集合(collections)类型(List)

Unity自带的Json解析工具类JsonUtility居然没有API用于解析集合类型,也太鬼扯了吧. https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity http://www.boxheadproductions.com.au/deserializing-top-level-arrays-in-json-with-unity/

Android端小米推送Demo解析和实现方法

前言 最近这几个月都是在准备找工作和找工作中,付出了很多,总算是有点收获,所以都没有怎么整理笔记.到了最近才有空把自己的笔记整理一下发上来,分享一下我的学习经验. 推送 由于最近项目要用到Android的消息推送,关于Android推送的解决方案有很多种,有C2DM,轮询, SMS,MQTT协议,XMPP协议和第三方平台,经过我们对项目需求的考虑之后我们选择了第三方平台推送的小米推送,下面就是小米推送的实现方法. 实现准备 想要用小米推送首先要去小米开发者平台注册申请开发者账号,经过1到3天的审

ActivityLifeCycle官方demo解析

1.关于Activity的生命周期的几篇文章: http://1.duoinfo.sinaapp.com/?p=330 http://1.duoinfo.sinaapp.com/?p=332 http://1.duoinfo.sinaapp.com/?p=335 http://1.duoinfo.sinaapp.com/?p=337 training课程给的图是这样的: 2.运行官方的程序 看到这个demo含有四个Activity,最后一个Activity的样式文件为dialog.并且在下面用T