Unity3d 寻路功能 介绍及项目演示
2016/09/07更新
NavMeshAgent 默认是会有碰撞效果的,就是说 玩家和玩家是会有碰撞,不能重叠。
这是因为NavMeshAgent 默认设置了体积,而且开启了障碍物检测。
只要把 Radius 改成0,或者关闭 Obstacle Avoidance,人物就可以重叠了。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Unity3d中的寻路,可以使用AStarPath 寻路插件。现在也可以使用Unity自带的 Navigation 功能来做。
来做一个例子:
上面的图片中,Cube 是阻碍物体,球 是代表玩家,要寻路。
设置Cube为不可通过物体
首先我们点击Window - Navigation 窗口,然后选中4个Cube,按照下图设置这4个Cube为不可通过,然后烘培
设置地面为可通过,然后烘培
我们给圆球也就是我们的主角加上控制脚本
using UnityEngine;using System.Collections;public class findpath : MonoBehaviour { public NavMeshAgent agent; Vector3 point; Ray aray; RaycastHit ahit; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { aray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(aray,out ahit)) { point = ahit.point; } agent.SetDestination(point); } }}
达到圆球朝鼠标点击的地方寻路效果 转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
注意到在使用NavMesh的时候,发现 NavMeshAgent 的物体,是不能移除到 NavMesh 范围外的。
如果NavMeshAgent 在 NavMesh 范围之外,也会被自动的设置到NavMesh里面去。
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
而且当执行一次寻路之后,如果我们改变Cube的位置,Cube又会寻路回到原来的目的地,感觉就像是这一次寻路没有完成。
这就需要我们增加判断,在Cube 移动到目的地之后,结束这一次的寻路。
代码修改如下
using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour { public NavMeshAgent agent; Vector3 point; Ray aray; RaycastHit ahit; bool mDoFindPath = false; // Use this for initialization void Start() { } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { aray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(aray, out ahit)) { point = ahit.point; } agent.SetDestination(point); mDoFindPath = true; } //增加已经寻路到目的地的判断,然后结束这一次寻路 if(mDoFindPath && !agent.pathPending&& agent.remainingDistance !=Mathf.Infinity && agent.pathStatus==NavMeshPathStatus.PathComplete && agent.remainingDistance<=agent.stoppingDistance) { Debug.Log("NavMeshAgent Pathfinding End"); mDoFindPath = false; agent.ResetPath(); } }}
主要是这个函数,清除这一次的寻路
NavMeshAgent.ResetPath();
比如在游戏寻路的过程中,我们可以中断寻路,自己操作,就可以调用。
现在寻路之后可以随意拖动了转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
我们在玩3D游戏的时候,一般游戏里都有一个脱离卡死的按钮。
这是因为在玩游戏的过程中,可能会有各种原因,导致玩家走到地图之外,比如穿墙了,穿地了,一直往下面掉。点脱离卡死,就能重置玩家的位置。
上面说了,如果Cube 在 NavMesh 范围之外,那么运行游戏之后,Cube 会自动移动到 NavMesh 的范围内。
这是Cube 的 NavMeshAgent 产生的效果。
但是如果Cube离NavMesh比较远的话,就没有这个效果了
并且产生了一个警告。
Failed to create agent because it is not close enough to the NavMesh
意思就是说,Cube 离 NavMesh 范围外太远了,创建 NavMeshAgent 失败了……
这样的话,依靠NavMeshAgent ,是达不到 脱离卡死的目的的,距离稍微远点就不给力了。
这个时候只好自己到 NavMesh 中找一个点,然后把玩家 移动到这个点。
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
代码修改如下:
using UnityEngine;using System.Collections;public class NewBehaviourScript : MonoBehaviour{ NavMeshAgent agent = null; Vector3 point; Ray aray; RaycastHit ahit; bool mDoFindPath = false; // Use this for initialization void Start() { agent = gameObject.AddComponent<NavMeshAgent>(); } void OnGUI() { if (GUILayout.Button("脱离卡死")) { //寻找导航网格上,距离玩家最近的点,然后把玩家设置为点的坐标,就脱离卡死了。 NavMeshHit tmpNavMeshHit; if (NavMesh.SamplePosition(transform.position, out tmpNavMeshHit, 10000f, NavMesh.AllAreas)) { transform.position = tmpNavMeshHit.position; agent.enabled = false; agent.enabled = true; } } } // Update is called once per frame void Update() { if (agent == null) { return; } if (agent.isOnNavMesh == false && agent.isOnOffMeshLink == false) { return; } if (Input.GetMouseButtonDown(0)) { aray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(aray, out ahit)) { point = ahit.point; } agent.SetDestination(point); mDoFindPath = true; } //增加已经寻路到目的地的判断,然后结束这一次寻路 if (mDoFindPath && !agent.pathPending && agent.remainingDistance != Mathf.Infinity && agent.pathStatus == NavMeshPathStatus.PathComplete && agent.remainingDistance <= agent.stoppingDistance) { Debug.Log("NavMeshAgent Pathfinding End"); mDoFindPath = false; agent.ResetPath(); } }}
效果
关于 OffMeshLinks
在游戏的场景中,可能会出现两个 Mesh 没有连在一起的情况。这个时候寻路会被中断。
Unity 提供了 OffMeshLinks 给我们使用,字面上的意思就是,分离 Mesh 的连接器。
只要提供一个 Start 和一个 End ,两个Mesh 就可以连接起来。
首先搭建下面的场景
并添加两个Cube,一个作为起点 Start,一个作为终点 End
然后在作为Player的Cube上再添加一个 OffMeshLink,并把 起点、终点的Cube 拖过去
然后Bake,在 Start 和 End 之间,生成了一条曲线,把 分离的两个 地板 连接起来
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
运行游戏测试
测试工程下载:
http://pan.baidu.com/s/1pLD3HEj
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
Unity3d 寻路功能 介绍及项目演示相关推荐
- SSM综合练习功能介绍与项目演示
功能介绍 主要讲解maven工程搭建,以及基于oracle数据库的商品表信息,并完成SSM整合. 商品查询 基于SSM整合基础上完成商品查询,要掌握主面页面main.jsp及商品显示页面product ...
- python flask实战订餐系统微信小程序-00课程介绍及项目演示
讲课流程 从管理员后端到小程序会员端,按照功能展开讲解 核心代码同步编写,重点代码反复分析讲解 建议大家按顺序观看视频 课程收获 主流的Python3 火爆的小程序 Centos云主机部署 搭建高可用 ...
- Unity3D基本入门及功能介绍
第一,界面入门 Unity3D 最经典 2 by 3 结构界面,上面呈现了 Unity3D 最为常用的几个面板,下面为各个面板的详细说明. 1.Scene[场景面板]:该面板为 Unity3D 的编辑 ...
- 网络云盘项目——HTTP接口介绍、功能介绍、服务端/客户端代码解析
一.本文目的 本项目分为6篇博客文章完成: 1.项目总体介绍:https://blog.csdn.net/qq_41453285/article/details/107871393. 2.Redis部 ...
- SpringBoot个人博客项目搭建—前端页面功能介绍(一)
SpringBoot个人博客-前端页面功能介绍(一) 项目首页地址:https://blog.csdn.net/weixin_45019350/article/details/108869025 一. ...
- Github新功能 个人展示项目--首页展示个人介绍 图片and so on(2020.08.05)
目录 一.功能介绍及示例 1.通过html编写自己的页面介绍. 2.挂图片 自定义链接等介绍 二.实现方法: 1.创建一个同名的project 2.编辑内容(附源码) 三.GitHub展示地址:htt ...
- 仓库管理系统商业项目功能介绍
仓库管理系统商业项目功能介绍 课程简介 仓库管理系统是为企业定制开发的仓库管理系统,功能完善,使用方便,主要功能有质量检测,采购入库,采购退货,销售出库,销售退货,仓库盘点,库存报表,Excel导入导 ...
- 探花交友_第1章_项目介绍以及实现登录功能_第1节_功能介绍
探花交友_第1章_项目介绍以及实现登录功能_第1节_功能介绍 文章目录 探花交友_第1章_项目介绍以及实现登录功能_第1节_功能介绍 1.功能介绍 1.1.功能列表 1.2.注册登录 1.3.交友 1 ...
- Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(项目演示、涉及知识点、源码分享)
基于 Vue3.x + Vant UI 的多功能记账本(一) 文章目录 基于 Vue3.x + Vant UI 的多功能记账本(一) Vue3.x 实现多功能记账本 1.前言 2.项目演示 3.涉及知 ...
最新文章
- python中对数组合并的方法
- java压缩对象_Java 对象指针压缩
- 监督学习无监督学习_无监督学习简介
- Teamcenter - Index search 找不到相关物件的解决方法
- 分享 | 绝对值得一看的深度学习三巨头之一的Yoshua Bengio清华大学讲座视频
- springboot 整合腾讯云短信
- 外币兑换c语言编程,货币转换 C
- win10 uwp 关联文件
- 搭建微步蜜罐,启动通用OA系统仿真登陆蜜罐,使用awvs来去进行扫描通用OA系统仿真登陆蜜罐,nmap工具扫描搭建蜜罐的系统。
- codeforces #309 div2
- 总监的烦恼:技术丢了怎么办?
- 天星数科首页CSS布局回顾
- 一个相当有用的利器,提高检索匹配的效率!
- php tp5上传图片到阿里云OSS
- K8S控制器介绍与使用
- ubuntu使用sudo su进入root报错Cannot execute /bin/csh: No such file or directory解决方法
- PyQt(Python+Qt)学习随笔:invisibleRootItem方法访问QTreeWidget树型部件的隐形根节点
- CSS奇思妙想—这里是CSS创造的世界!
- 各大EMM厂商功能比较 第二部分 MAM Container比较
- layui 表无法渲染问题
热门文章
- Mura-最小可觉差
- 家庭养老床位,新导智能居家养老的智能床垫
- windows解决系统禁止运行脚本问题
- BAPC2018 K kingpin escape
- php给文章关键词加内链,WordPress文章关键词如何实现自动添加内链方法?
- 模型预测控制在路径规划中的应用
- The 50 Most Essential Pieces of Classical Music
- 开放式激光振镜+运动控制器(四):PSO位置同步输出在激光振镜加工中的应用
- 同样可用来建站,云服务器和硅云虚拟主机到底哪个更好?
- 分析解决11gR2 双节点RAC环境下的gc cr block busy/gc buffer busy acquire等待