unity3d 赛车游戏——复位点检测

一直没有时间写博客

昨天我的CarWaypoints插件也告一段落了

今年没回家,过年就我一个人

挺无聊的,那就休息一天写几篇博客吧

我的代码可能很少,但是思路很重要

希望不懂的朋友别只copy代码

赛车游戏的话赛车难免会冲出跑道、掉入水坑、卡在障碍物上....等情况

那么问题来了,遇到这些情况怎么办呢?

玩家玩得好好的,难道就因为遇到这些情况要退出游戏重新进入吗?

那当然是不现实的,要是我的话果断卸载游戏

还要骂一句做游戏的人是脑残啊

我想你不希望玩家骂你是脑残吧,哈哈哈

新技能,赶快GET起来

遇到这类情况通常的赛车游戏做法是复位到赛道中央

这个功能听起来貌似挺简单的,但实际上做起来还是有些小复杂的

让我们脱掉衣服直奔主题吧

首先,我们需要waypoint

我昨天刚做好这个插件

CarWaypoint插件教程以及下载地址:http://www.cnblogs.com/shenggege/p/4295616.html

ok,编辑好路标点数据后我们整理一下复位功能的思路

当赛车复位时

我们需要获得离赛车距离最近的一个路标点

然后设置赛车的车头朝向为当前最近路标点的朝向

当然,我们也要把赛车的移动速度和角速度归零

以保证赛车复位后不会自动向前冲(你也可以不归零)

思路就是这么简单,下面我们来看看代码怎么实现

 1     /// 获取距离最近的路径点 <summary>
 2     /// 获取距离最近的路径点
 3     /// </summary>
 4     /// <param name="DPs">路径点集合</param>
 5     /// <param name="myPosition">当前坐标</param>
 6     /// <returns>返回最近距离的路标点</returns>
 7     private WaypointsModel GetClosestWP(List<WaypointsModel> all, Vector3 myPosition)
 8     {
 9         WaypointsModel tMin = null;
10         float minDist = Mathf.Infinity;//正无穷
11
12         for (int i = 0; i < all.Count; i++)
13         {
14             float dist = Vector3.Distance(all[i].Position, myPosition);
15             if (dist < minDist)
16             {
17                 tMin = all[i];
18                 minDist = dist;
19             }
20         }
21         return tMin;
22     }

这是一个获取距离最近的路标点的方法
用for循环计算所有路标点距离当前赛车位置的距离

取出最小距离的路标点,这个不难理解吧,我们继续!

 1     /// 重置赛车 <summary>
 2     /// 重置赛车
 3     /// </summary>
 4     private void RecoverCar()
 5     {
 6         //获取距离最近的路标点
 7         WaypointsModel ClosestWP = GetClosestWP(WaypointsModelAll, transform.position);
 8
 9         //置赛车位置
10         transform.position = ClosestWP.Position;
11
12         //置车头朝向
13         transform.rotation = Quaternion.LookRotation(ClosestWP.Rotation * Vector3.forward);
14
15         //移动速度归零
16         rigidbody.velocity = Vector3.zero;
17
18         //角速度归零
19         rigidbody.angularVelocity = Vector3.zero;
20     }

这个方法更简单了是吧!

获取到最近的路标点后在设置赛车的位置朝向,归零参数即可

这样做的确而已复位了,但是运行游戏跑一局发现还是有一些小问题

什么问题呢?你的赛车明明跑到某路标点之前了,但是复位之后,居然倒退到这个路标点的位置了

不知道我这么说能不能理解,如果不理解马上运行你的游戏跑一局试试就知道了

那我们要怎么解决这个问题呢

当我们复位的时候,赛车不仅仅是复位到赛道中央,还缩短了一段距离

为了解决这个问题,我们在写一个新的方法,并且修改刚才写的代码,如下:

 1     /// 重置赛车 <summary>
 2     /// 重置赛车
 3     /// </summary>
 4     private void RecoverCar()
 5     {
 6         //获取距离最近的路标点
 7         WaypointsModel ClosestWP = GetClosestWP(WaypointsModelAll, transform.position);
 8
 9         //下个路标点索引
10         int nextIndex = ClosestWP.Index + 1;
11
12         //最近路标点
13         Vector3 nearestPoint;
14
15         //下一个复位点索引 小于 路标点数量 - 1
16         if (nextIndex < WaypointsModelAll.Count - 1)
17         {
18             //获取两个路标点间离赛车最近的点
19             nearestPoint = NearestPoint(
20                 ClosestWP.Position,
21                 WaypointsModelAll[nextIndex].Position,
22                 transform.position);
23         }
24         else
25         {
26             //最后一个点和起点之间时取最后一个点的位置
27             nearestPoint = WaypointsModelAll[WaypointsModelAll.Count - 1].Position;
28         }
29
30         transform.position = nearestPoint;
31         transform.rotation = Quaternion.LookRotation(ClosestWP.Rotation * Vector3.forward);
32         rigidbody.velocity = Vector3.zero;
33         rigidbody.angularVelocity = Vector3.zero;
34     }
35
36     /// 获取两点之间离赛车的最近点 <summary>
37     /// 获取两点之间离赛车的最近点
38     /// </summary>
39     /// <param name="lineStart">最近路标点</param>
40     /// <param name="lineEnd">下一个路标点</param>
41     /// <param name="point">赛车位置</param>
42     /// <returns></returns>
43     private Vector3 NearestPoint(Vector3 lineStart, Vector3 lineEnd, Vector3 point)
44     {
45         //线方向
46         Vector3 lineDirection = Vector3.Normalize(lineEnd - lineStart);
47
48         //最近点
49         float closestPoint = Vector3.Dot((point - lineStart), lineDirection);
50
51         //返回最近点
52         return lineStart + (closestPoint * lineDirection);
53     }

思路看下图:

ok,现在保存代码,在运行游戏复位试试

怎么样,是不是会自动计算出最近的点了!

复位点功能就这样轻松实现了

我的游戏中是不需要计算出最近的点,只需要得到最近的路标点位置就可以了

所以具体的实现方案按照你的需求来做,这里我提供的仅仅是思路

先发布这篇文章到首页,每发一次首页都要间隔六小时比较蛋疼

我在写两篇关于赛车游戏的检测文章,一会儿直接把地址贴到这篇文章中

unity3d 赛车游戏——反向检测:等待更新............................

unity3d 赛车游戏——圈数检测以及赛道长度计算:等待更新............................

本文链接:http://www.cnblogs.com/shenggege/p/4295617.html

时间: 2024-12-24 15:40:15

unity3d 赛车游戏——复位点检测的相关文章

unity3d 赛车游戏——复位点检测优化、反向检测、圈数检测、赛道长度计算

接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算,没去深入研究,不过应该也八九不离十 在告诉大家个小秘密: **飞车的复位点检测和圈数检测利用以下文章中的代码思路可以做出外挂 感兴趣的可以试试!我只是技术交流,不是传播外挂,别打我 复位点检测优化: 首先感谢 @太粗难进 他的原话: “不过 你知道 高架桥么?就是 如果大的轮船经过 会 把 桥 中间

使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3D的设计思想(即一切游戏对象皆空对象,拖拽组件才使其具有了活力)来实现却需要花费大量时间与精力,究竟它神奇在什么地方?本文通过实现这个小例子来看看. 一.空对象与组件 在Unity3D最常见的就是GameObject,而一个GameObject被实例化后确啥特性与行为都没有,只有当我们往其中拖拽了一

使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (六)之自动寻路及优化

一.综述 赛车游戏的敌人赛车自动寻路一般有两种方式,一种是路点寻路,另外一种就是使用Unity自带组件NavMeshAgent进行寻路了,我介绍的是后者,另外后者在水平面上的汽车寻路导航还不错,但是一旦有Y方向的爬坡.下坡等,汽车就会因为角度依然保持水平显得很不自然,并且轮胎也不会旋转,我对此进行了优化 二.NavMeshAgent 这个和NavMesh是一对,用来设置寻路的游戏对象.关于属性,我不再一一介绍,我就距我的设置来说一下: 1.AgentSize 如下图中,那个圆柱形就是NavMes

Unity3D ARPG游戏开发《最初的幻想》之第一张地图与跳跃的改善详解

前面我们终于实现了人物动画.相机控制及昼夜系统,现在继续吧,为了方便继续编写的敌人之类的脚本,所以打算今天先把第一张地图画个大概.结果,画了我好久的地图….. ≡(▔﹏▔)≡ 我对美术方面的天赋简直是惨不忍睹了…..加之地图中途画的差不多的时候Unity又崩溃了一次….忘了保存(ㄒoㄒ).于是又忙活半天….这个地图完全靠临时发挥了,第一张地图我画了好几次了,基本上每次画出来的地形之类的都完全不一样,所以就不多解释了,就上一张大概的场景图吧: 看起来好简单吧?唉……开启编辑器,这时侯如果在场景中转

关于《Unity3D/2D游戏开发从0到1》书籍再版说明

关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于Unity4.6版本的教学知识体系,则略显滞后.    随着2017年7月份,Unity2017.1正式版本的推出,<Unity3D/2D游戏开发从0到1>书籍的再版,则正式提上日程. 目前2017年8月份再版工作已经进行过半,现在给各位小伙伴汇报一下工作,希望得到更好的建议.现在说说第二版本的总体

《Unity3D/2D游戏开发从0到1》正式出版发行啦

书籍信息:   书籍的名称: <Unity3D/2D 游戏开发从0到1>   书号(ISBN): 978-7-121-26239-5    出版社: 电子工业出版社   发行时间:2015年7月1日 写作背景:    2015年6月30日我收到电子工业出版社张迪老师寄来,正式发行的<Unity3D/2D游戏开发从0到1>书籍.这本凝结着大半年心血的作品让我感慨万千.   本人从事游戏.软件与教学十多年,一直梦想可以进一步服务于全国广大的游戏与软件从业开发人员.14年下半年电子工业出

Unity3D 入门 游戏开发 Unity3D portal game development

Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 视频学习链接:Video learning link: [教学视频]深入浅出Unity3D--第一篇-何韬-CSDN学院-在线学习教程 u3d 4.6 c#  性能上 比 java脚本 好一些 C # is better than a Java

unity3d 给游戏添加音源 Unity3d adds a sound source to the game

unity3d 给游戏添加音源 Unity3d adds a sound source to the game 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 视频目录及链接: 16 创建游戏工程和游戏场景,添加游戏对象  9:00  17 创建游戏脚本,脚本与对象绑定  5:43  18 游戏发布与运行   | 6:15  19 常用的四种外部资源导入方法  4:10  20 采用包和

unity3D:游戏分解之曲线

一提到曲线,很多新手就头疼了,包括我.查了很多资料,终于有个大概的了解.想深入了解曲线原理的,推荐一个链接http://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html 之前写了一篇博文<unity3D:游戏分解之角色移动和相机跟随>,里面用到了曲线插值,这里算是对上篇博文的一个补充 先看一下曲线的效果 在使用NGUI的过程中,发现iTween.cs里面有两个很有用的方法,一个是输入指定路点数组,一个就是曲线的插值算法.今天我们主