Unity怎么设计opengl赛车游戏设计专用的街道/跑道

给我们留言
地址:福建省晋江市青阳街道洪山路国际工业设计园纳金网
(周一到周五, 周六周日休息)
设计师入口
当前位置:&
基于unity3D的赛车游戏
09:44264700
这是一个可玩性蛮高的unity3d赛车游戏。通过方向键来使用,允许飞跃赛道,算是个游戏设计上的突破吧。
您需要登录后才可以发帖 登录 |
福建省纳金网信息技术有限公司 闽ICP备
Copyright www.narkii.com
All Rights Reservedunity3d 三分钟实现简单的赛车漂移
我的图书馆
unity3d 三分钟实现简单的赛车漂移
提到赛车游戏,大家最关心的应该就是漂移吧?!
从学unity开始,我就一直在断断续续的研究赛车
因为自己技术太烂、悟性太差等原因,我走了不少弯路
也许你会说,网上那么多资料,你不会查啊
是啊!网上一搜一大把unity赛车例程,还有好几篇被转发了很多次的赛车漂移实现思路
【wheelcollider:自己技术太烂搞不定】
赛车例程几乎都是用wheelcollider来实现的
我一直以为wheelcollider的参数简直就不是人能调的
直到上个星期我才听我好朋友 阿亮 说wheelcollider的参数不是随便调的
它是按照真实赛车来实现的,所以参数也要按照真实赛车来调
比如赛车车轮的间距、赛车重量、悬挂高度......
就好比小轿车使用了大货车的悬挂参数、大货车使用了小轿车的车轮参数
好吧,我承认我自己也是听得迷迷糊糊!
反正总而言之一句话:wheelcollider的参数的确是非常难调,但是懂的人还是能一下子就调好的(好像说的是废话,我是不懂的- -)
【实现思路的文章:自己悟性太差搞不定】
然后是关于赛车漂移实现思路的文章
有几篇被转发了很多次的文章,被转发了那么多次,那么漂移应该就是这个实现思路吧?可是大家的实现方式都不一样
我根本不知道漂移的实现是否有一个唯一的标准,如果有,那这个标准又是什么呢?
看了这些文章,漂移我还是没有研究出来,还是一点思路都没有
后来我偶然得到了一份商业赛车游戏的代码,然后漂移就实现出来了- -
听我说起来好像挺容易的!其实研究那份代码的过程特别煎熬!唉,不说了,都是泪啊
声明:下文中我要实现出来的漂移仅仅是个简单的漂移,非常简单!!!一个思路而已,并没有用到那份商业赛车游戏中的任何一句代码
注意:请使用Unity4.X版本,5.X版本的wheelcollider参数又变了,要哭了
准备工作:
1、下载CarWaypoint插件,使用插件中的demo。地址:
2、easytouch插件
导入CarWaypoint插件和easytouch插件
打开CarWaypoints/demo/Car Physics 场景,可以看到一辆车
Hierarchy面板除了前四项其余全部隐藏,运行起来跑一下,还是挺有漂移的感觉的,这是调wheelcollider参数调出来的
我们现在需要做的是用摇杆操作赛车,用另外一个思路让赛车转弯时会漂移
创建一个虚拟摇杆取名为:MoveJoystick,InteractionType选择Event Notification
新建一个C#脚本:RockerController,复制以下代码
1 #region HeadComments
2 /* ========================================================================
3 * Copyright (C) 2015 ArthunGame
者:Arthun
6 * 文件名称:RockerController
能:摇杆控制器
9 * =========================================================================
11 #endregion
13 using UnityE
15 public class RockerController : MonoBehaviour
public static RockerController I
/// &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 rockerMoveC
void Awake()
if (Instance != null)
Debug.LogError("Instance RockerController x2");
Instance = this;
/// &summary&
/// 当摇杆可用时注册事件(程序启动执行)
/// &/summary&
void OnEnable()
EasyJoystick.On_JoystickMove += OnJoystickM
EasyJoystick.On_JoystickMoveEnd += OnJoystickMoveE
/// &summary&
/// 当摇杆不可用时移除事件(程序关闭时执行)
/// &/summary&
void OnDisable()
EasyJoystick.On_JoystickMove -= OnJoystickM
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveE
/// &summary&
/// 当摇杆销毁时移除事件 (程序关闭时执行)
/// &/summary&
void OnDestroy()
EasyJoystick.On_JoystickMove -= OnJoystickM
EasyJoystick.On_JoystickMoveEnd -= OnJoystickMoveE
/// &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并复制以下代码
1 #region HeadComments
2 /* ========================================================================
3 * Copyright (C) 2016 ArthunGame
者:Arthun
6 * 文件名称:FollowCamera
能:跟随摄像机
8 * 创建时间: 19:38:35
10 * =========================================================================
12 #endregion
14 using UnityE
16 public class FollowCamera : MonoBehaviour
static FollowCamera _
public static FollowCamera GetInstance()
public Transform T
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.
transform.position -= Vector3.forward * D
transform.position = new Vector3(transform.position.x, currentHeight, transform.position.z);
transform.LookAt(Target);
public void SetTarget(Transform target)
public void SetParame(float dis, float height, float heightDamp)
Distance =
HeightDamping = heightD
将MainCamera上的SmoothFollowA脚本删除,替换为刚才新建的FollowCamera脚本
打开CarController脚本,添加几个变量
public float EngineTorque = 1500f;//引擎扭矩
public WheelCollider WheelBL;//后左轮
public WheelCollider WheelBR;//后右轮
public Vector3 CenterOfMass = Vector3.//质量中心
bool mRockerIsMove = false;//摇杆是否移动
Vector3 mTargetBodyAngle = Vector3.//目标车身角度
float mBodyRotateSpeed = 3f;//旋转速度
在Start中设置赛车质量中心(越低越不容易翻车)和摇杆回调
void Start()
rigidbody.centerOfMass = CenterOfM
RockerController.Instance.rockerMoveCallback += rockerMoveC
//获取路标点数据
_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")
mRockerIsMove = isM
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.fixedDeltaT
看到这里,是不是吓了一跳,这漂移也太简单了吧!一句代码搞定漂移、一句代码搞定动力
原理是根据摇杆旋转的角度车身也相对应的旋转,加上动力有惯性,就产生圆弧形的漂移了
思路就是这么简单,也许你认为这实在是太简单得离谱了,可我却花费了一年多的时间才明白
现在,你只需要花几分钟看看这篇没什么高深技术的文章,就能知道漂移实现的思路
运行跑一下,有漂移效果,但是似乎不怎么明显,不够顺是不是?
解决方法很简单,在后面两个车轮处加一个向前推的力,在加一个目标方向侧推的力,就能每次都画出完美的漂移弧度
文章标题叫《三分钟实现简单的赛车漂移》,写的过程中才发现三分钟更本做不完
因为我自己在做的时候,很多代码都是之前写好了的,直接实现漂移部分的代码就可以了,所以感觉三分钟应该够了,就几句代码
好吧,我就当一次标题党吧!哈哈哈哈
原文链接:
TA的推荐TA的最新馆藏[转]&
喜欢该文的人也喜欢&>&unity3d制作赛车游戏教程之二
unity3d制作赛车游戏教程之二
上传大小:2.39MB
unity3d制作赛车游戏教程之二unity3d制作赛车游戏教程之二
综合评分:5(4位用户评分)
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有4条
还不错,步骤比较详细
,多谢分享哈
讲的很不错的教程
towangjindian
积分/C币:2
积分/C币:3
积分/C币:3
积分/C币:20
积分/C币:3
积分/C币:5
积分/C币:10
objectivess
积分/C币:3
lengyuefengqing
积分/C币:3
积分/C币:5
积分/C币:3
积分/C币:3
积分/C币:3
积分/C币:3
积分/C币:3
积分/C币:5
积分/C币:2
积分/C币:5
积分/C币:2
积分/C币:2
上传者其他资源
NGUI2.64最新插件
FastGUI 1.3最新版
FastGUI 1.2.1最新版使用手册
Unity 4.x Cookbook 2013
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
扫码关注并点击右下角获取下载码
输入下载码
为了良好体验,不建议使用迅雷下载
unity3d制作赛车游戏教程之二
会员到期时间:
剩余下载个数:
剩余积分:
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励5下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
unity3d制作赛车游戏教程之二

我要回帖

更多关于 3d赛车游戏设计 的文章

 

随机推荐