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,现在保存代码,在运行游戏复位试试
怎么样,是不是会自动计算出最近的点了!
复位点功能就这样轻松实现了
我的游戏中是不需要计算出最近的点,只需要得到最近的路标点位置就可以了
所以具体的实现方案按照你的需求来做,这里我提供的仅仅是思路
先发布这篇文章到首页,每发一次首页都要间隔六小时比较蛋疼
我在写两篇关于赛车游戏的检测文章,一会儿直接把地址贴到这篇文章中
复位点优化以及其他功能地址:http://www.cnblogs.com/shenggege/p/4295986.html
文中不足之处欢迎批评指正,如果本文对你有帮助请点一下右下角的推荐
本文链接:http://www.cnblogs.com/shenggege/p/4295617.html
转载于:https://www.cnblogs.com/shenggege/p/4295617.html
unity3d 赛车游戏——复位点检测相关推荐
- Unity3D赛车游戏+脚本基础
前言 游戏对象实例化 Scenes游戏场景 GameObject游戏对象 Component组件 Component使用方法 预制体 Unity事件函数 Instantiate():实例化对象 什么是 ...
- 使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (一)之赛车游戏总体介绍
我之前一直在做C# 的Winform多媒体软件开发.从去年十一月份开始转型自学Unity3D.发现对这个领域.这个方向更为喜爱.在经过两个多月的跟书自学.跟游戏实例教程练习之后,决定自己完成一款游戏, ...
- 使用Unity3D 自主实战开发的赛车游戏实例
一.综述 赛车游戏源码下载:http://fanshubbs.com/thread-255-1-1.html 赛车游戏的敌人赛车自动寻路一般有两种方式,一种是路点寻路,另外一种就是使用Unity自带组 ...
- 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景
最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...
- Unity3d WheelCollider制作赛车游戏
真实赛车游戏 车轮碰撞器 车轮碰撞器 首先我们要知道车轮碰撞器里面的一些数据,给大家看一张表: 1.我们可以去资源商店里面找一个车子的模型下载下来,要车身和轮胎是分开的.WheelCollider 2 ...
- 关于制作赛车游戏的一些入门知识
在过去的几个月里,我拉着几个死党一起搞了一个iOS赛车游戏.由于当时还在上班,所以我一边白天上班,一边晚上+周末倒腾这个游戏.尽管这只是一个很简单的2D游戏,但我却在里面用了一些比较'有趣'的方法来使 ...
- UnityStandardAsset工程、源码分析_5_赛车游戏[AI控制]_AI机制
上一章地址: UnityStandardAsset工程.源码分析_4_赛车游戏[玩家控制]_摄像机控制 前几章我们已经将赛车游戏的绝大多数机制分析过了,而Unity还提供了不同的操控模式--AI控制. ...
- 无缝切地图的3D赛车游戏火了,小哥花16个月用JS打造,浏览器免费就能玩
萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 一位小哥耗时16个月打造的3D版赛车游戏,这两天忽然火了起来. 只需一个浏览器,就能驾车从森林.海滩,"无缝切换"到广袤的沙漠 ...
- 赛车游戏的2D 编程(VC++)
赛车游戏的2D 编程 转载请注明出处 本文章的下载地址,请单击此链接 赛车是一个简单的游戏,可是麻雀虽小,五脏具全.它用DDraw实现了精灵的绘制,用 ...
最新文章
- Cubieboard ARM 集群
- 运营商与SP再次博弈手机广告
- Spring Session官方介绍及spring框架学习方法
- Python基础入门6_文件和异常
- 不会诈骗的公司 都倒闭了
- 最短路径——SPFA算法(蓝桥杯试题集)
- BZOJ1492: [NOI2007]货币兑换Cash(CDQ分治,斜率优化动态规划)
- Android一种常见的布局困扰
- Android Gradle配置构建
- EXECUTE IMMEDIATE oracle介绍
- java 学生考勤系统(三、签到功能)
- 概要设计和详细设计(软件)
- 3D美术8——max——多个bip动画文件,导入,并且合并成一个动画文件
- ssm酒店预订系统(ssm酒店管理系统民宿预订)ssm酒店客房预订系统宾馆JSP客房预订系统
- 升级mac系统正在计算机,Mac升级卡死解决办法
- 听风的插件-正在战斗中
- scorm标准平台有哪些是免费的?
- nodejs 将对象转化为query(URLSearchParams)
- Java互联网架构-企业级实战秒杀系统优化方案与应用思路
- ERROR CODE: 0xC004F069 解决办法
热门文章
- 登录网银显示服务器内部错误怎么办,网银提示无法大额转账?点击登录出现报错?解决方法看这里...
- java zoneoffset_Java 8:如何从ZoneOffset派生ZoneId
- 《秋天的怀念》读后感
- 【瑞萨RA_FSP】DMAC/DTC编程实战
- R-Studio万能通用数据恢复方法
- 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?
- 基于灰色神经网络的订单需求预测算法研究
- 【机器学习】推荐系统、机器学习面试题整理
- 突发!AI视觉大牛陶大程被爆将离职京东探索研究院院长!
- HSC-1th大赛 writeup