unity3d 三分钟实现简单的赛车漂移
2016-04-15 03:05
423 查看
提到赛车游戏,大家最关心的应该就是漂移吧?!
从学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,复制以下代码
RockerController挂到MoveJoystick上
新建一个脚本:FollowCamera并复制以下代码
将MainCamera上的SmoothFollowA脚本删除,替换为刚才新建的FollowCamera脚本
打开CarController脚本,添加几个变量
在Start中设置赛车质量中心(越低越不容易翻车)和摇杆回调
最后,在FixedUpdate中加入三句代码
看到这里,是不是吓了一跳,这漂移也太简单了吧!一句代码搞定漂移、一句代码搞定动力
原理是根据摇杆旋转的角度车身也相对应的旋转,加上动力有惯性,就产生圆弧形的漂移了
思路就是这么简单,也许你认为这实在是太简单得离谱了,可我却花费了一年多的时间才明白
现在,你只需要花几分钟看看这篇没什么高深技术的文章,就能知道漂移实现的思路
运行跑一下,有漂移效果,但是似乎不怎么明显,不够顺是不是?
解决方法很简单,在后面两个车轮处加一个向前推的力,在加一个目标方向侧推的力,就能每次都画出完美的漂移弧度
文章标题叫《三分钟实现简单的赛车漂移》,写的过程中才发现三分钟更本做不完
因为我自己在做的时候,很多代码都是之前写好了的,直接实现漂移部分的代码就可以了,所以感觉三分钟应该够了,就几句代码
好吧,我就当一次标题党吧!哈哈哈哈
原文链接:http://www.cnblogs.com/shenggege/p/5393815.html
从学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 != 0 || move.joystickAxis.y != 0) { 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
相关文章推荐
- Community Value再理解
- unity3d热更新插件uLua学习整理
- Unity中使用ulua的个人经验总结
- 小译UnityAPI-Awake,Start,Reset
- unity使用WorldMachine修整地形
- unity脚本中内部类的使用
- Unity3D 全局逻辑事件/消息派发 实现
- Unity中NGUI里ScrollView选中的item遮挡自动滚动到中间或者合适位置
- unity_Editor自定义窗口顶部添加小图标
- unity AR实物识别
- Unity之SceneView视图中不可选择游戏对象
- Unity Mono foreach BUG性能测试
- Unity UGUI —— 无限循环List
- EMC新一代中端存储Unity点评
- unity iOS 集成ShareSDK步骤
- unity打包iOS上线归纳
- Unity3d Dictionary简单用法
- Unity定制 Image、Text的对象生成
- Unity3打开照相机与本地相册进行裁剪显示
- 全面理解Unity加载和内存管理