一直没有时间写博客

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

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

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

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

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

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

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

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

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

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

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

新技能,赶快GET起来

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

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

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

首先,我们需要waypoint

我昨天刚做好这个插件

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

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

当赛车复位时

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

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

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

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

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

     /// 获取距离最近的路径点 <summary>
/// 获取距离最近的路径点
/// </summary>
/// <param name="DPs">路径点集合</param>
/// <param name="myPosition">当前坐标</param>
/// <returns>返回最近距离的路标点</returns>
private WaypointsModel GetClosestWP(List<WaypointsModel> all, Vector3 myPosition)
{
WaypointsModel tMin = null;
float minDist = Mathf.Infinity;//正无穷 for (int i = ; i < all.Count; i++)
{
float dist = Vector3.Distance(all[i].Position, myPosition);
if (dist < minDist)
{
tMin = all[i];
minDist = dist;
}
}
return tMin;
}

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

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

     /// 重置赛车 <summary>
/// 重置赛车
/// </summary>
private void RecoverCar()
{
//获取距离最近的路标点
WaypointsModel ClosestWP = GetClosestWP(WaypointsModelAll, transform.position); //置赛车位置
transform.position = ClosestWP.Position; //置车头朝向
transform.rotation = Quaternion.LookRotation(ClosestWP.Rotation * Vector3.forward); //移动速度归零
rigidbody.velocity = Vector3.zero; //角速度归零
rigidbody.angularVelocity = Vector3.zero;
}

这个方法更简单了是吧!

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

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

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

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

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

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

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

     /// 重置赛车 <summary>
/// 重置赛车
/// </summary>
private void RecoverCar()
{
//获取距离最近的路标点
WaypointsModel ClosestWP = GetClosestWP(WaypointsModelAll, transform.position); //下个路标点索引
int nextIndex = ClosestWP.Index + ; //最近路标点
Vector3 nearestPoint; //下一个复位点索引 小于 路标点数量 - 1
if (nextIndex < WaypointsModelAll.Count - )
{
//获取两个路标点间离赛车最近的点
nearestPoint = NearestPoint(
ClosestWP.Position,
WaypointsModelAll[nextIndex].Position,
transform.position);
}
else
{
//最后一个点和起点之间时取最后一个点的位置
nearestPoint = WaypointsModelAll[WaypointsModelAll.Count - ].Position;
} transform.position = nearestPoint;
transform.rotation = Quaternion.LookRotation(ClosestWP.Rotation * Vector3.forward);
rigidbody.velocity = Vector3.zero;
rigidbody.angularVelocity = Vector3.zero;
} /// 获取两点之间离赛车的最近点 <summary>
/// 获取两点之间离赛车的最近点
/// </summary>
/// <param name="lineStart">最近路标点</param>
/// <param name="lineEnd">下一个路标点</param>
/// <param name="point">赛车位置</param>
/// <returns></returns>
private Vector3 NearestPoint(Vector3 lineStart, Vector3 lineEnd, Vector3 point)
{
//线方向
Vector3 lineDirection = Vector3.Normalize(lineEnd - lineStart); //最近点
float closestPoint = Vector3.Dot((point - lineStart), lineDirection); //返回最近点
return lineStart + (closestPoint * lineDirection);
}

思路看下图:

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

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

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

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

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

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

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

复位点优化以及其他功能地址:http://www.cnblogs.com/shenggege/p/4295986.html

文中不足之处欢迎批评指正,如果本文对你有帮助请点一下右下角的推荐

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

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

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

    接着上一篇文章说 因为代码简短且思路简单 所以我就把这几个功能汇总为一篇文章 因为我之前就是做游戏外挂的 经过验证核实,**飞车的复位点检测.圈数检测就是以下的方法实现的 至于反向检测和赛道长度计算, ...

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

    最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...

  3. 使用Unity3D引擎开发赛车游戏

    Car Tutorial 在Unity3D的Asset Store有一个赛车的Demo —— Car Tutorial,看起来特别酷的赛车游戏Demo,不过我还没有下载下来,因为在公司下载Assets ...

  4. Unity的赛车游戏实现思路

    unity目前版本实现赛车的技术方案主要有3种: 1.wheelCollider,设置motorTorque.brakeTorque.steerAngle来实现车子的推动和转弯,优点是上手简单,而且很 ...

  5. Unity创作赛车游戏的四款插件

    本文,我们将介绍其中4款:Racing Game Starter Kit.GeNa 2 .NWH Vehicle Physics.Curvy Splines. Racing Game Starter ...

  6. Unity赛车游戏之移动

    这个赛车游戏真是让我费劲脑汁啊.尤其是写这种系统化的东西. 目前漂移还没找到更好的算法,不过基本的移动还是可以做到的. 别看就光是个移动,其实也是很费事的. Unity给了个对于赛车系统很好的碰撞组件 ...

  7. unity3D:游戏分解之曲线

    一提到曲线,很多新手就头疼了,包括我.查了很多资料,终于有个大概的了解.想深入了解曲线原理的,推荐一个链接http://www.cnblogs.com/jay-dong/archive/2012/09 ...

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

    关于<Unity3D/2D游戏开发从0到1>第一版本在2015年7月1日全国发行,累计得到不少国内高校教师.培训机构的好评.但是由于Unity官方对于技术不断的升级与版本的快速迭代,基于U ...

  9. 《Unity3D/2D游戏开发从0到1(第二版本)》 书稿完结总结

    前几天,个人著作<Unity3D/2D游戏开发从0到1(第二版)>经过七八个月的技术准备以及近3个月的日夜编写,在十一长假后终于完稿.今天抽出一点时间来,给广大热心小伙伴们汇报一下书籍概况 ...

随机推荐

  1. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  2. JS高级程序设计2nd部分知识要点3

    对象转换方法:1> toLocaleString(),2> toString(),ValueOf()方法会返回相同的值 栈方法是 LIFO (后进先出)的数据结构 -push ,pop 方 ...

  3. FQ 也要使用 Telegram

    不知怎么回事,一款优秀的开源,跨平台,安全的即时通讯工具 Telegram 就被 GG 了. 但是我们还得继续使用--那就 FQ 吧.用 ShadowSocks FQ 还不错. 安装 ShadowSo ...

  4. sqoop sample code

    本文使用的数据库是mysql的sample database employees. download url:https://launchpad.net/test-db/employees-db-1/ ...

  5. [麦先生]在Laravel框架里实现邮箱验证---发送邮件

    在经过一段时间的使用后,发现在项目中很多地方需要用到用户验证,以短信验证和邮箱验证为主流趋势,小麦总结了如果在Laravel框架中实现发送邮件功能,以后会陆续更上如何实现短信验证..... 在.env ...

  6. selenium读取txt文件的几种方式

    1.用java读取txt文件 public static String readFJ(String path) { path = "D:/workspace/hetong.txt" ...

  7. Zbrush 4R7 P3中各类模型怎么快速隐藏

    在ZBrush®软件中除了遮罩功能可以对模型局部进行编辑外,我们还可以通过显示和隐藏来对模型的局部进行控制. 查看更多内容请直接前往:http://www.zbrushcn.com/jichu/xia ...

  8. Zbrush遮罩边界该怎么实现羽化和锐化

    很多情况下为了雕刻制图需要,在ZBrush®中不仅要使用边缘清晰的遮罩,有时还要将遮罩边缘变得模糊,做羽化效果.那么如何在ZBrush中实现羽化遮罩效果或锐化遮罩效果,本文将做详细讲解. 若有疑问可直 ...

  9. UESTC 886 方老师金币堆 --合并石子DP

    环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...

  10. 2014 Super Training #4 D Paint the Grid Again --模拟

    原题:ZOJ 3780 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3780 刚开始看到还以为是搜索题,没思路就跳过了.结 ...