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 寻路功能 介绍及项目演示相关推荐

  1. SSM综合练习功能介绍与项目演示

    功能介绍 主要讲解maven工程搭建,以及基于oracle数据库的商品表信息,并完成SSM整合. 商品查询 基于SSM整合基础上完成商品查询,要掌握主面页面main.jsp及商品显示页面product ...

  2. python flask实战订餐系统微信小程序-00课程介绍及项目演示

    讲课流程 从管理员后端到小程序会员端,按照功能展开讲解 核心代码同步编写,重点代码反复分析讲解 建议大家按顺序观看视频 课程收获 主流的Python3 火爆的小程序 Centos云主机部署 搭建高可用 ...

  3. Unity3D基本入门及功能介绍

    第一,界面入门 Unity3D 最经典 2 by 3 结构界面,上面呈现了 Unity3D 最为常用的几个面板,下面为各个面板的详细说明. 1.Scene[场景面板]:该面板为 Unity3D 的编辑 ...

  4. 网络云盘项目——HTTP接口介绍、功能介绍、服务端/客户端代码解析

    一.本文目的 本项目分为6篇博客文章完成: 1.项目总体介绍:https://blog.csdn.net/qq_41453285/article/details/107871393. 2.Redis部 ...

  5. SpringBoot个人博客项目搭建—前端页面功能介绍(一)

    SpringBoot个人博客-前端页面功能介绍(一) 项目首页地址:https://blog.csdn.net/weixin_45019350/article/details/108869025 一. ...

  6. Github新功能 个人展示项目--首页展示个人介绍 图片and so on(2020.08.05)

    目录 一.功能介绍及示例 1.通过html编写自己的页面介绍. 2.挂图片 自定义链接等介绍 二.实现方法: 1.创建一个同名的project 2.编辑内容(附源码) 三.GitHub展示地址:htt ...

  7. 仓库管理系统商业项目功能介绍

    仓库管理系统商业项目功能介绍 课程简介 仓库管理系统是为企业定制开发的仓库管理系统,功能完善,使用方便,主要功能有质量检测,采购入库,采购退货,销售出库,销售退货,仓库盘点,库存报表,Excel导入导 ...

  8. 探花交友_第1章_项目介绍以及实现登录功能_第1节_功能介绍

    探花交友_第1章_项目介绍以及实现登录功能_第1节_功能介绍 文章目录 探花交友_第1章_项目介绍以及实现登录功能_第1节_功能介绍 1.功能介绍 1.1.功能列表 1.2.注册登录 1.3.交友 1 ...

  9. Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(项目演示、涉及知识点、源码分享)

    基于 Vue3.x + Vant UI 的多功能记账本(一) 文章目录 基于 Vue3.x + Vant UI 的多功能记账本(一) Vue3.x 实现多功能记账本 1.前言 2.项目演示 3.涉及知 ...

最新文章

  1. python中对数组合并的方法
  2. java压缩对象_Java 对象指针压缩
  3. 监督学习无监督学习_无监督学习简介
  4. Teamcenter - Index search 找不到相关物件的解决方法
  5. 分享 | 绝对值得一看的深度学习三巨头之一的Yoshua Bengio清华大学讲座视频
  6. springboot 整合腾讯云短信
  7. 外币兑换c语言编程,货币转换 C
  8. win10 uwp 关联文件
  9. 搭建微步蜜罐,启动通用OA系统仿真登陆蜜罐,使用awvs来去进行扫描通用OA系统仿真登陆蜜罐,nmap工具扫描搭建蜜罐的系统。
  10. codeforces #309 div2
  11. 总监的烦恼:技术丢了怎么办?
  12. 天星数科首页CSS布局回顾
  13. 一个相当有用的利器,提高检索匹配的效率!
  14. php tp5上传图片到阿里云OSS
  15. K8S控制器介绍与使用
  16. ubuntu使用sudo su进入root报错Cannot execute /bin/csh: No such file or directory解决方法
  17. PyQt(Python+Qt)学习随笔:invisibleRootItem方法访问QTreeWidget树型部件的隐形根节点
  18. CSS奇思妙想—这里是CSS创造的世界!
  19. 各大EMM厂商功能比较 第二部分 MAM Container比较
  20. layui 表无法渲染问题

热门文章

  1. Mura-最小可觉差
  2. 家庭养老床位,新导智能居家养老的智能床垫
  3. windows解决系统禁止运行脚本问题
  4. BAPC2018 K kingpin escape
  5. php给文章关键词加内链,WordPress文章关键词如何实现自动添加内链方法?
  6. 模型预测控制在路径规划中的应用
  7. The 50 Most Essential Pieces of Classical Music
  8. 开放式激光振镜+运动控制器(四):PSO位置同步输出在激光振镜加工中的应用
  9. 同样可用来建站,云服务器和硅云虚拟主机到底哪个更好?
  10. 分析解决11gR2 双节点RAC环境下的gc cr block busy/gc buffer busy acquire等待