精华内容
参与话题
问答
  • unity 自动寻路

    千次阅读 2018-10-28 12:04:36
    在项目开发中有时候,会用到unity自带的自动寻路系统NavMesh,今天就说下他的简单用法,NavMesh就是将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,进而在这些网格的基础上通过一系列的计算来实现自动寻路...

    在项目开发中有时候,会用到unity自带的自动寻路系统NavMesh,今天就说下他的简单用法,NavMesh就是将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,进而在这些网格的基础上通过一系列的计算来实现自动寻路,在导航中,只需要给导航物体挂载到导航物体上,导航物体便会自行根据目标点来寻找符合条件的路线,并沿着该路线行进到目标点。

    一、实现物体通过自动寻路移动到指定地点

    1.首先就是编辑一个简易的场景:

    2.选中场景中的对象物体,将Static设置为Navigation Static复选框,unity就会通过选中的对象生成导航网格:

    3.选择菜单栏中的Window--->Navigation命令,弹出Navgation视图。然后选择Navgation视图中的Bake按钮生成导航网格

    4.就会生成相应的bake信息,其中蓝色区域就是可以进行移动的区域:

     

    5.创建一个可移动的物体,这里就用一个胶囊体代替,为其添加NavMesh Agent组件,下面讲解一下这个组件的具体信息:

    Base offset                与地面偏移高度
    speed                        移动速度
    Angular Speed             转角速度 ,转身速度    角速度: 最高转速(度/秒)。
    Acceleration                 加速度,启动时的 最大加速度。
    Stopping Distance         停止距离 ,,制动距离:制动距离。到目的地的距离小于这个值,代理减速。
    Auto Traverse OffMesh Link 自动遍历OffMesh链接:自动移动并关闭OffMeshLinks
    Auto Repath                 自动重新寻路:如果现有的部分已失效,获得新的路径。
    Height                         高度:代理的高度(用于调试图形)。
    Base offset                   基本偏移:碰撞几何体相对于实际几何体垂直的偏移。
    Obstacle Avoidance Type 障碍躲避类型 :躲避的质量水平。
    NavMesh Walkable          导航网格行走:指定代理可以遍历的导航网格层类型。这个参数很有用,在接下来的实例中可以用到。

    6.为胶囊体添加移动脚本,通过鼠标点击移动到指定地点,代码如下:

        public Camera camera;  //相机    
        private NavMeshAgent navMeshAgent;
    
        // Use this for initialization
        void Start()
        {
            navMeshAgent = GetComponent<NavMeshAgent>();
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                if (navMeshAgent != null)
                {
                    //获取从主相机发出的一条射线
                    Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
                    RaycastHit mHit;
                    if (Physics.Raycast(mRay, out mHit))
                    {
                        //当碰撞到Terrain使获取到当时的位置
                        if (mHit.collider.gameObject.tag == "Player")
                        {
                            navMeshAgent.destination = mHit.point;
                        }
                    }                              
                }
            }
        }

    具体效果:

    备注:如果想实现可以直接跳跃到指定的目标位置处,可以设置Drop和Jump Distance,然后重新Bake就可以了:

    二、实现不同物体,沿自己的专有道路移动到指定位置

    1.搭建自己想要的场景信息:

    2.像上面的方式一样,对所有路径进行bake处理,但是唯一不同的需要设置不同的Layer,这里我们设置三个不同的layer

    3.先为不同的路径设置对应的layer

    4.为不同的移动的物体设置对应的layer:

    5.然后添加移动代码:

        public GameObject TargetGo;
        public GameObject[] Solider;
    
        // Use this for initialization
        void Start()
        {
            for (int i = 0; i < Solider.Length; i++)
            {
                Solider[i].GetComponent<NavMeshAgent>().destination = TargetGo.transform.position;            
            }
        }

    6.移动效果

    想了解更多相关信息,可以关注下方公众号或者QQ群:879354767

    展开全文
  • Unity自动寻路功能的实现(一)

    千次阅读 2018-08-11 23:25:07
    Unity自动寻路功能的实现 在Unity中,要实现自动寻路功能,其实是有很多办法的,今天我就介绍三种比较简单的办法,入手即会。 方法一:使用自带的Navigation寻路组件 操作如下:打开Unity,新建项目,新建一个...

    Unity自动寻路功能的实现

    在Unity中,要实现自动寻路功能,其实是有很多办法的,今天我就介绍三种比较简单的办法,入手即会。

    方法一:使用自带的Navigation寻路组件

    操作如下:打开Unity,新建项目,新建一个Plane,随便建一两堵墙,创建一个cube作为玩家,创建一个空物体,作为目的地,如下图
    这里写图片描述
    然后,把地面Plane和wall设置为静态,
    这里写图片描述
    点开Windows菜单栏,选择Navigation,打开Bake烘焙,点击Bake,可以看到蓝色部分,便是玩家可以行走的部分
    这里写图片描述
    随后给玩家也就是Cube加上Nav Mesh Agent组件
    这里写图片描述
    再新建一个名为NavTest脚本,挂在Cube上,脚本如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    public class NavTest : MonoBehaviour {
    
        public Transform targetpos;
        private NavMeshAgent nav;
        void Start () {
            nav = GetComponent<NavMeshAgent>();
            nav.SetDestination(targetpos.position);
        }
    
        // Update is called once per frame
        void Update () {
    
        }
    }

    把目标点赋上去,运行,发现玩家走向目标点,而且还机智地避开墙壁。

    展开全文
  • Unity自动寻路的几种方法(一)

    万次阅读 2014-11-19 16:54:07
    在游戏中,我们经常会用到角色自动寻路这个功能,

    在游戏制作中,我们经常会用到角色自动寻路这个功能,点击小地图或者场景中的某一处时,角色会自动走向目的地,并且自动避开期间的障碍物。不单单在游戏的制作中用得到这个功能,在虚拟现实的项目中同样有时候会需要这样的功能。

    在Unity中,有多种方法能够实现寻路的功能,我试用的有以下这些方法建议大家可以尝试。首先是在一些游戏制作中用得最多的A星寻路,其次是插件iTween,他提供了很多方法,用起来也十分的简单,Unity也有自带的寻路组件Navigation,还有就是一些程序逻辑来编写,类似于AI,或者结合Lookat方法自主编写随机或者预定好的行走路线。下面我会详细地介绍一下以上途径的具体实现方法:

    首先是A星寻路。这是在一些三维游戏制作以及VR中用得比较多的一个寻路插件。其原理是A星寻路算法,如果想对A星算法做深入的了解可以谷歌一下,网络上有一些大神对该算法做了详细得剖析,下面我介绍一下这个插件怎么在Unity实现自动寻路的功能。

    首先先从网上下载到A星寻路插件,百度下到处是,导入到Unity中,插件中已有了很多个示例。讲解了在多种情况下,游戏主题如何拐过障碍物,到达目的地的。我主要介绍一下这一实现过程。在新场景中建一个Plane作为地面,新建一个胶囊体作为移动对象,建一个球体作为移动的目的地,再建立一些障碍物。如下图所示:


    在移动对象上挂上AIFollow.cs脚本,再添加了这个脚本之后,它会自动帮你添加上Character Controller和Seeker脚本,同时,在该对象上再添加上Funnel Modifier.cs,Simple Smooth Modifier.cs,Navmesh Controller.cs这三个脚本,如下图所示:


    其主要脚本就是AIFollow.cs这个脚本。其Target就是你的目的地,下面是一些关于他更新 途中结点的频率,移动速度,旋转速度等等变量,可以控制是否画出路径等等。这些参数可以自行调节,上图仅供参考。

    接下来在场景中建一个空对象,挂上Astar Path.cs脚本,选择RecastGraph选项,如下图所示:


    下面就是关于这些变量的设置,Cell Size变量跟你障碍物之间间隙有关,当你的障碍物之间间隙比较小的时候,建议这个值设小一点,下面是一些可走区域的高度,攀爬高度,以及对象半径等参数,下面可以设置区域的坡度,Max Edge Length这个参数跟你线的复杂度有关,最小可设置到0.05,当然数据特别小的时候,线圈布局很繁忙,很耗资源,一般设置几百就好了,效果可以自行调节调试。设置完成之后可以点击一下Snap bounds to scene,来规定界限。也可以自己微调其区域大小和位置。

    在Settings中设置一下以上属性,如上图所示。还有一些参数可以参考插件中的一些demo场景。

    一切都设置好了之后,运行场景就可以看到下面的效果:


    其绿色部分为求即将行走的路线,黄色的圈是球会在途中去寻找结点,也就是读取地上生成的线条 来确定走的路线。

    展开全文
  • Unity3D】自动寻路

    千次阅读 2017-05-17 17:24:11
    不过,Unity3D自带的功能,就能完成这个看起来高大上的功能。下面举一个例子说明这个问题。 如下图,摆了4个cube当作墙,然后摆一个球,当作游戏的主角,鼠标点哪走哪,但关键是不会出现穿墙的情

    毕竟游戏里面,不能所有物体都要求它按照一条定向的路径移动的,需要给玩家一个操作空间,让玩家点哪,这东西自然而然地去哪里。因此自《【iTween】指定路径位移》(点击打开链接)之后,自动寻路的需求应运而生。不过,Unity3D自带的功能,就能完成这个看起来高大上的功能。下面举一个例子说明这个问题。

    如下图,摆了4个cube当作墙,然后摆一个球,当作游戏的主角,鼠标点哪走哪,但关键是不会出现穿墙的情况。


    具体做法如下:

    一、场景布置

    1、如下图所示,没什么好说的。


    2、之后先将这个场景保存为Navmesh,然后如下图打开自动寻路设置界面。


    如下图所示,在Navigation界面,对所有代表墙的Cube和地板Plane都勾上Navigation Static。表示这些都是寻路的阻碍物。

    都设置好再点击Bake。烘培之后就会出现如下图的淡蓝色的,可移动的区域。这是Unity3D自己能计算出来的。


    3、给球加上Nav Mesh Agent这个组件,表示它是一个被导航体。里面的半径、速度等,Unity3D给你上这个组件的时候,基本会给你计算好的,如果你是自己导入的3D模型估计需要将半径改到和你的3D模型基本匹配的程度。


    4、之后再给Plane上一个plane标签,用于碰撞检测。因为Unity3D中,鼠标点击Plane,需要是在鼠标点击的屏幕像素点,发出一条直线和Unity3D世界中物体碰撞,才能找到准确的点击的。这在《【Unity3D】判断是否鼠标点击物体与血条制作》(点击打开链接)已经说了,这里不再赘述了。毕竟这个plane注定要会被我们一会儿疯狂点击的。


    二、脚本设置

    给球sphere赋予如下的Navigation.cs:

    using UnityEngine;
    using System.Collections;
    
    public class Navigation : MonoBehaviour
    {
        private NavMeshAgent navMeshAgent;
        void Start()
        {
            navMeshAgent = gameObject.GetComponent<NavMeshAgent>();//初始化navMeshAgent
        }
        void Update()
        {
            if (Input.GetMouseButtonDown(0))//鼠标左键点下  
            {
                Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);//住摄像机向鼠标位置发射射线 
                RaycastHit mHit;
                if (Physics.Raycast(mRay, out mHit))//射线检验 
                {
                    if (mHit.collider.gameObject.tag == "plane")
                    {
                        navMeshAgent.SetDestination(mHit.point);//mHit.point就是射线和plane的相交点,实为碰撞点
                    }
                }
            }
        }
    }
    
    则能够享受NavMeshAgent带来的Unity3D自动寻路的欢乐~(*^_^*)
    展开全文
  • unity 自动寻路爬楼梯效果

    千次阅读 2018-03-25 15:18:18
    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; //自定义的类 public enum OffMeshLinkFlag ... //默认OffMeshLink没有开启的时候 ... //OffMeshLink处于下楼.....
  • Unity自动寻路的几种方法(三)

    千次阅读 2015-02-09 10:47:33
    使用Unity来开发手游,自动寻路可以有很多种实现方式。第一种比较传统的是使用A星寻路,它是一种比较传统的人工智能算法,在游戏开发中比较常用到。大部分的页游和端游都用到这种技术。在Unity游戏也可以用这种技术...
  • Unity 自动寻路

    2018-03-05 16:39:28
    Unity 开发的基于DFS和BFS算法的自动寻路功能,适用于2d类格子棋盘地图。
  • Unity Navigation system自动寻路AI

    千次阅读 2017-11-16 22:27:06
    Navigation system由四部分组成:1.Nav...可以自动寻路的角色都需要带的一个组件3.NavMesh Obstacle 组件。描述角色(agent)需要避开的动态障碍物。4.Off-Mesh Link 组件。用于描述不能用一般的可行走平面描述的置
  • Unity自动寻路功能的实现(二)

    千次阅读 2018-08-13 23:12:00
    方法二:自己写脚本,定义路点自动寻路 首先,新建一个地面,添加一个Cube作为玩家,改名Player,然后创建3个空物体,位置要不一样,然后改名为Point01,Point02,Point03,我设置的如下: 3个路点作为玩家要去...
  • Unity自动寻路

    2018-05-06 15:21:06
    我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。步骤:1.创建地形2.添加角色3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用...
  • 步骤 1.创建地形 2.添加角色 3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。 4.选中地形(Terrain),在Navigation窗口中,设置Navigation Static 5.依次选中障碍物,在avigation窗口中,...
  • using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; [RequireComponent(typeof(NavMeshAgent))] public class test : MonoBehaviour ... NavMeshAgent m_Ag...
  • 三种自动寻路的方法 写的不细致,有啥看不懂的留言哦,我会在添加的!
  • Unity3d中实现点击目标点,然后出现引路线段,动态更新线段等功能 。 1,新建一个3D Object Plane 地面,添加一个Cube...2·,烘焙可寻路区和障碍区,这个步骤同一 3,给Player添加NavMeshAgent组件,LineRend...
  • Unity 自动寻路入门 NavMeshComponents

    千次阅读 2019-03-27 14:01:22
    自动寻路是很多游戏必备的功能之一(虽然以前玩网游很多人都吐槽国产网游的自动寻路和挂机是很蠢的功能233)。这个功能可以帮助我们在各式各样的场景中实现点击屏幕就控制角色到达指定的地点。如图 ...
  • 我目前正在用鼠标控制人物行走,通过unity自带的自动寻路系统,人物朝向鼠标右键点击的地方移动,然而人物在自动寻路过程中,经常最终到达的地方与我鼠标点击的位置有一定的距离,不是精确,且有时候会因为惯性在一...
  • 在之前的几篇Blog总,我们已经系统学习了自动寻路插件Navmesh的相关概念和细节。然而,如果要做一个场景精美的手游,需要用到各种复杂的场景地形,而不仅仅是平地上的自动寻路。今天我们将通过一个完整的复杂的实例...
  • 参考文章:Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh) http://blog.csdn.net/yuxikuo_1/article/details/44974739 unity3D——自带寻路Navmesh入门教程(二) ... Unity3D自动寻路系统Navig

空空如也

1 2 3 4 5 ... 20
收藏数 1,474
精华内容 589
关键字:

unity自动寻路