unity3d 三分钟实现简单的赛车漂移
提到赛车游戏,大家最关心的应该就是漂移吧?!
从学unity开始,我就一直在断断续续的研究赛车
因为自己技术太烂、悟性太差等原因,我走了不少弯路
也许你会说,网上那么多资料,你不会查啊
是啊!网上一搜一大把unity赛车例程,还有好几篇被转发了很多次的赛车漂移实现思路
【wheelcollider:自己技术太烂搞不定】
赛车例程几乎都是用wheelcollider来实现的
我一直以为wheelcollider的参数简直就不是人能调的
直到上个星期我才听我好朋友 阿亮 说wheelcollider的参数不是随便调的
它是按照真实赛车来实现的,所以参数也要按照真实赛车来调
比如赛车车轮的间距、赛车重量、悬挂高度......
就好比小轿车使用了大货车的悬挂参数、大货车使用了小轿车的车轮参数
好吧,我承认我自己也是听得迷迷糊糊!
反正总而言之一句话:wheelcollider的参数的确是非常难调,但是懂的人还是能一下子就调好的(好像说的是废话,我是不懂的- -)
【实现思路的文章:自己悟性太差搞不定】
然后是关于赛车漂移实现思路的文章
有几篇被转发了很多次的文章,被转发了那么多次,那么漂移应该就是这个实现思路吧?可是大家的实现方式都不一样
我根本不知道漂移的实现是否有一个唯一的标准,如果有,那这个标准又是什么呢?
看了这些文章,漂移我还是没有研究出来,还是一点思路都没有
后来我偶然得到了一份商业赛车游戏的代码,然后漂移就实现出来了- -
听我说起来好像挺容易的!其实研究那份代码的过程特别煎熬!唉,不说了,都是泪啊
声明:下文中我要实现出来的漂移仅仅是个简单的漂移,非常简单!!!一个思路而已,并没有用到那份商业赛车游戏中的任何一句代码
注意:请使用Unity4.X版本,5.X版本的wheelcollider参数又变了,要哭了
准备工作:
1、下载CarWaypoint插件,使用插件中的demo。地址:http://www.cnblogs.com/shenggege/p/4295616.html
2、easytouch插件
导入CarWaypoint插件和easytouch插件
打开CarWaypoints/demo/Car Physics 场景,可以看到一辆车

Hierarchy面板除了前四项其余全部隐藏,运行起来跑一下,还是挺有漂移的感觉的,这是调wheelcollider参数调出来的
我们现在需要做的是用摇杆操作赛车,用另外一个思路让赛车转弯时会漂移

创建一个虚拟摇杆取名为:MoveJoystick,InteractionType选择Event Notification
新建一个C#脚本:RockerController,复制以下代码
#region HeadComments
/* ========================================================================
* Copyright (C) 2015 ArthunGame
*
* 作 者:Arthun
* 文件名称:RockerController
* 功 能:摇杆控制器
*
* =========================================================================
*/
#endregion using UnityEngine; public class RockerController : MonoBehaviour
{
public static RockerController Instance; /// <summary>
/// 摇杆移动回调
/// </summary>
/// <param name="isMove"></param>
/// <param name="angle"></param>
/// <param name="move"></param>
public delegate void RockerMoveCallback(bool isMove, float angle, MovingJoystick move);
public RockerMoveCallback rockerMoveCallback; void Awake()
{
if (Instance != null)
Debug.LogError("Instance RockerController x2"); Instance = this;
} /// <summary>
/// 当摇杆可用时注册事件(程序启动执行)
/// </summary>
void OnEnable()
{
EasyJoystick.On_JoystickMove += OnJoystickMove;
EasyJoystick.On_JoystickMoveEnd += OnJoystickMoveEnd;
} /// <summary>
/// 当摇杆不可用时移除事件(程序关闭时执行)
/// </summary>
void OnDisable()
{
EasyJoystick.On_JoystickMove -= OnJoystickMove;
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveEnd;
} /// <summary>
/// 当摇杆销毁时移除事件 (程序关闭时执行)
/// </summary>
void OnDestroy()
{
EasyJoystick.On_JoystickMove -= OnJoystickMove;
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveEnd;
} /// <summary>
/// 移动摇杆结束
/// </summary>
/// <param name="move"></param>
void OnJoystickMoveEnd(MovingJoystick move)
{
OnRockerMoveInfo(false, -1f, move);
} /// <summary>
/// 正在移动摇杆
/// </summary>
/// <param name="move"></param>
void OnJoystickMove(MovingJoystick move)
{
if (move.joystickAxis.x != || move.joystickAxis.y != )
{
OnRockerMoveInfo(true, circularAngle(move), move);
}
} /// <summary>
/// 获取摇杆全角度 0~360
/// </summary>
/// <param name="move"></param>
/// <returns> 左边0 上90 右180 下 270</returns>
float circularAngle(MovingJoystick move)
{
Vector2 pos = new Vector2
{
x = move.joystickAxis.x * 90f + 90f,
y = move.joystickAxis.y * 90f + 90f
}; if (pos.y < 90f)
{
if (pos.x < 90f)
{
return 270f + pos.y;
}
else if (pos.x > 90f)
{
return 180f + (90f - pos.y);
}
} return pos.x;
} /// <summary>
/// 摇杆移动信息
/// </summary>
/// <param name="isMove"></param>
/// <param name="angle">当前摇杆角度 取值范围0~360 -1为未操作</param>
void OnRockerMoveInfo(bool isMove, float angle, MovingJoystick move)
{
if (rockerMoveCallback != null)
{
rockerMoveCallback(isMove, angle, move);
}
}
}
RockerController挂到MoveJoystick上
新建一个脚本:FollowCamera并复制以下代码
#region HeadComments
/* ========================================================================
* Copyright (C) 2016 ArthunGame
*
* 作 者:Arthun
* 文件名称:FollowCamera
* 功 能:跟随摄像机
* 创建时间:2016/03/11 19:38:35
*
* =========================================================================
*/
#endregion using UnityEngine; public class FollowCamera : MonoBehaviour
{
static FollowCamera _instance;
public static FollowCamera GetInstance()
{
return _instance;
} public Transform Target;
public float Distance = 10f;
public float Height = 20f;
public float HeightDamping = 2f; void Awake()
{
if (_instance != null)
Debug.LogError("Instance FollowCamera x2"); _instance = this;
} void LateUpdate()
{
float currentHeight = Mathf.Lerp(transform.position.y, Target.position.y + Height, HeightDamping * Time.deltaTime); transform.position = Target.position;
transform.position -= Vector3.forward * Distance;
transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z); transform.LookAt(Target);
} public void SetTarget(Transform target)
{
Target = target;
} public void SetParame(float dis, float height, float heightDamp)
{
Distance = dis;
Height = height;
HeightDamping = heightDamp;
}
}
将MainCamera上的SmoothFollowA脚本删除,替换为刚才新建的FollowCamera脚本
打开CarController脚本,添加几个变量
public float EngineTorque = 1500f;//引擎扭矩
public WheelCollider WheelBL;//后左轮
public WheelCollider WheelBR;//后右轮
public Vector3 CenterOfMass = Vector3.zero;//质量中心 bool mRockerIsMove = false;//摇杆是否移动
Vector3 mTargetBodyAngle = Vector3.zero;//目标车身角度
float mBodyRotateSpeed = 3f;//旋转速度
在Start中设置赛车质量中心(越低越不容易翻车)和摇杆回调
void Start()
{
rigidbody.centerOfMass = CenterOfMass;
RockerController.Instance.rockerMoveCallback += rockerMoveCallback; //获取路标点数据
_WaypointsXML.GetXmlData(WaypointsModelAll, null, waypointsData.text); Debug.Log("赛道总长度:" + CalcTotalDis().ToString());//计算赛道长度
} /// <summary>
/// 摇杆移动回调
/// </summary>
/// <param name="isMove"></param>
/// <param name="angle"></param>
/// <param name="move"></param>
void rockerMoveCallback(bool isMove, float angle, MovingJoystick move)
{
if (move.joystickName != "MoveJoystick")
return; mRockerIsMove = isMove;
mTargetBodyAngle.y = move.Axis2Angle(true);
}
最后,在FixedUpdate中加入三句代码
if (mRockerIsMove)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(mTargetBodyAngle), Time.fixedDeltaTime * mBodyRotateSpeed);
} WheelBL.motorTorque = WheelBR.motorTorque = -EngineTorque * (mRockerIsMove ? 0.7f : 0f) * 5000f * Time.fixedDeltaTime;
看到这里,是不是吓了一跳,这漂移也太简单了吧!一句代码搞定漂移、一句代码搞定动力
原理是根据摇杆旋转的角度车身也相对应的旋转,加上动力有惯性,就产生圆弧形的漂移了
思路就是这么简单,也许你认为这实在是太简单得离谱了,可我却花费了一年多的时间才明白
现在,你只需要花几分钟看看这篇没什么高深技术的文章,就能知道漂移实现的思路
运行跑一下,有漂移效果,但是似乎不怎么明显,不够顺是不是?
解决方法很简单,在后面两个车轮处加一个向前推的力,在加一个目标方向侧推的力,就能每次都画出完美的漂移弧度
文章标题叫《三分钟实现简单的赛车漂移》,写的过程中才发现三分钟更本做不完
因为我自己在做的时候,很多代码都是之前写好了的,直接实现漂移部分的代码就可以了,所以感觉三分钟应该够了,就几句代码
好吧,我就当一次标题党吧!哈哈哈哈
原文链接:http://www.cnblogs.com/shenggege/p/5393815.html
unity3d 三分钟实现简单的赛车漂移的更多相关文章
- 简单三分钟,本地搭建 k8s
使用 minikube 在本地搭建 k8s 已经比以前要简单很多了.本文,我们通过简短的三分钟来重现一下在本地搭建 k8s 实验环境的步骤. Newbe.Claptrap 是一个用于轻松应对并发问题的 ...
- 三分钟部署Laxcus大数据管理系统
Laxcus是Laxcus大数据实验室历时五年,全体系自主设计研发的国内首套大数据管理系统.能够支撑百万台级计算机节点,提供EB量级存储和计算能力,兼容SQL和关系数据库.最新的2.x版本已经实现对当 ...
- JUnit三分钟教程 ---- 实际应用
JUnit三分钟教程 ---- 实际应用 摘自http://lavasoft.blog.51cto.com/62575/65775 接上文"JUnit三分钟教程 ---- 快速起步&qu ...
- JUnit三分钟教程 ---- 快速起步
JUnit三分钟教程 ---- 快速起步 摘自http://lavasoft.blog.51cto.com/62575/65625/ JUnit是个好东西,做大点的项目离不开这东西,实际中用的时候也因 ...
- windows+mysql集群搭建-三分钟搞定集群
注:本文来源: 陈晓婵 < windows+mysql集群搭建-三分钟搞定集群 > 一:mysql集群搭建教程-基础篇 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一 ...
- Powershell极速教程-如何在三分钟内编写项目编译脚本
分析及思路 来看一下项目目录结构 炒鸡正常的三板斧src+docs+tests.咦,怎么会多出一个build的文件夹呢,这就是我们今天要研究的目录.今天我会带着大家在五分钟之内编写一个极简的编译脚本. ...
- 【转】iPhone易被窃听应用三分钟即可获取所有信息
2011年8月9日10:19 “你有iPhone吗?这下你麻烦了!”昨天香港<东方日报>封面文章用这样的语气报道说,一种iPhone等智能手机窃听程序,正引爆香港. 该报记者亲自试验,发现 ...
- 三分钟彻底禁用、隐藏Android设备底部虚拟按钮(亲测有效)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7613970.html Android设备屏幕底部一般都有虚拟导航栏,上面有 back.home等按钮. ...
- 转载:Windows下三分钟搭建Shadowoscks服务器端
Windows下三分钟搭建Shadowoscks服务器端 之前在V2EX上有人问为啥没人做个在Windows上一键运行Shadowsocks服务器端的程序,我只想说……这是因为没人关注我的libQtS ...
随机推荐
- SQL Server 2012实施与管理实战指南(笔记)——Ch4数据库连接组件
4.数据库连接组件 访问数据库有多种不同的技术,包括ADO,ODBC,OLEDB,ADO.NET等这些都有一些共性.首先要建立连接(Connection),然后通过命令(Command)对数据库进行访 ...
- The Accidental DBA
The Accidental DBA (Day 1 of 30): Hardware Selection: CPU and Memory Considerations 本文大意: 全篇主要讲 ...
- 讲讲js中的逻辑与(&&)以及逻辑或(||)
前几天看到一个函数,百思不得其解,今天早上醒来看了本js的书,正好讲到操作符的用法,给大家分享下js中的&&,||,和我们用的其他的编程语言还是有点区别的. 直接上那个函数的代码: f ...
- Ambari工具之认识学习01
随着大数据的越发流行,大大小小的互联网公司都开始参与一些大数据相关的业务,都想从中分一杯羹.Hadoop是大数据的典型代表,也可以说现在的领头大哥,很多互联网巨头都在使用hadoop,包括BAT等大公 ...
- android 导入数据(通讯录)
接着android 中导出数据 一文,下面介绍在android中导入数据的思路: 1.将数据从文本中读取出来 2.封装处理成自己想要的对象或模型 3.将处理好的数据对象插入自己应用的数据库中 4.更新 ...
- DPM检测模型 VoC-release 5 linux 下编译运行
(转载请注明作者和出处 楼燚(yì)航的blog :http://www.cnblogs.com/louyihang-loves-baiyan/ 未经允许请勿用于商业用途) DPM目前使非神经网络方法 ...
- 第五章项目:QuickHit
需求概述: 根据输入速率和正确率将玩家分为不同级别,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级(为了简单起见, ...
- CSS中单位px和em,rem的区别
PX特点: 1 IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...
- QuickFix/N简介
QuickFix/N简介 FIX是Financial Information eXchange的简称.FIX是一种专门为实时电子证券交易设计的标准消息协议.该协议由FIX protocol, Ltd ...
- [No000022]他们说:得诺贝尔奖到底有多难?