unity3d 导航_unity3d导航 - CSDN
  • Unity3D AI导航 Navigation

    2019-11-03 17:04:48
    设置步骤: 调出Navigation面板:Window -> AI -> Navigation 选择所有环境物体(静止物体),勾选【Navigation Static】,如果是不连接的对象勾选【Navigation OffMesh】 ...设置环境物体(静止物体)是否...

    设置步骤:

    1. 调出Navigation面板:Window -> AI -> Navigation
      在这里插入图片描述
    2. 选择所有环境物体(静止物体),勾选【Navigation Static】,如果是不连接的对象勾选【Navigation OffMesh】
      在这里插入图片描述
    3. 设置环境物体(静止物体)是否能通过,山体、墙设置【Not Walkable】,平面设置【Walkable】
      在这里插入图片描述
    4. 其他数据都调整完成后,可以点击【back】按钮。(圆柱体的半径越小,导航的边缘空白越小)
      在这里插入图片描述
    5. 选择移动物体,添加 Navigation -> Nav Mesh Agent,还有刚体(Rigidbody)
      在这里插入图片描述

    设置脚本

    1. 脚本调用navigation组件,必须先引用包:using UnityEngine.AI;
    2. 通过摄像机屏幕点击获取射线对象:Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    3. 射线是否有碰撞对象:Physics.Raycast(ray,out hit, 20) “hit”是射线碰撞的点对象,“20”是射线最远距离
    4. 设置导航组件的终点:nav.SetDestination(hit.point);
    public class NavigationTest : MonoBehaviour
    {
        //先引用UnityEngine.AI包
        private NavMeshAgent nav;
    
        // Start is called before the first frame update
        void Start()
        {
            //获取导航组件
            nav = GetComponent<NavMeshAgent>();
        }
    
        // Update is called once per frame
        void Update()
        {
            //判断用户是否按鼠标左键
            if (Input.GetButtonDown("Fire1"))
            {
                //通过摄像机屏幕点击获取射线对象
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                //碰撞对象变量
                RaycastHit hit;
                //判断射线是否有碰撞对象,射线长度限制为20
                if(Physics.Raycast(ray,out hit, 20))
                {
                    //设置导航组件的终点,有了终点导航就会指引物体移动
                    nav.SetDestination(hit.point);
                }
            }
        }
    }
    

    讲解Area用法:https://blog.csdn.net/shenqiankk/article/details/100145696

    展开全文
  • Unity3D 导航系统

    2020-07-03 21:37:58
    打开导航页面 Window ==》Navigation Agents 可以设置多种导航类型 AgentTypes:设置不同的导航者类型 Name:导航者的名字 Radius:导航碰撞体的半径 Height:导航碰撞体的高度 SetpHeight:导航者的脚步高度 ...

    打开导航页面

    Window ==》Navigation
    在这里插入图片描述

    Agents 可以设置多种导航类型

    在这里插入图片描述
    AgentTypes:设置不同的导航者类型
    Name:导航者的名字
    Radius:导航碰撞体的半径
    Height:导航碰撞体的高度
    SetpHeight:导航者的脚步高度
    MaxSlope:导航者爬坡的最大坡度

    Areas

    在这里插入图片描述
    对导航设置不同的区域
    Name:区域名称
    Cost:导航消费值
    通过不同区域的导航消费值的高低来计算那一条导航路径消费最低

    Bake

    导航前需要先烘焙导航网格
    在这里插入图片描述
    Agent Radius:代理半径,地图宽度大于2倍半径的道路才可以通过。
    Agent Height:导航高度,导航代理能通过的最低高度
    Max Slope:最大斜坡角度,导航代理最大能爬上的斜坡角度
    Step Height:脚步高度,导航代理能通过的最大台阶高度
    Drop Height:跳下高度,导航代理能跳下的最大高度
    Jump Distance:跳跃距离,导航代理能跳过得最大距离
    Manual voxel size :是否可以改变烘焙操作过程中的精确性
    Voxel Size:体素大小,默认的体素设置最好的权衡了准确性和烘焙速度。
    Min Region Area:允许你剔除掉小的非连接NavMesh区域,当NavMesh区域小于指定值时将被剔除
    Height mesh :允许你为角色提供更精准的位置
    Clear:清除导航网格
    Bake:将设置烘焙成网格

    Object

    在这里插入图片描述
    ALL:所有对象 Mesh Renderers:带此组件的对象 Terrains:地形对象
    Navigation Static :上面说了只有选中了Navigation Static之后才能进行网格导航。
    Generate OffMeshLinkes:处于勾选状态的话,网格导航可以Jump和Drop。
    Navigation Area:导航网格层

    导航组件

    在进行添加组件前,先将地形中不能移动的障碍物将Navigation Static勾选上
    在这里插入图片描述
    Static:
    Nothing:没有任何属性;
    Everyting:所有的都是静态的,Unity可以优化;
    LightMap Static:光照阴影是固定不变的;
    Occluder Static: 遮挡静态
    Batching Static:静态批处理
    Navigation Static:导航静态
    Occludee Static:被遮挡静态
    Off Mesh Link Generation:连接两个不连续的区域,在导航时可以在两个点进行跳跃
    Reflection Probe Static:反射

    Nav Mesh Agent 寻路组件

    在这里插入图片描述
    Agent Type:代理类型,选择导航类型
    base offset : 导航碰撞体底部和挂载该组件的物体中心点的偏移

    Speed:最大移动速度
    Angular Speed :最大转向速度
    Acceleration :最大加速度
    Stopping distance:最后停留点与目标点的距离
    Auto Braking:是否自动刹车,如果勾选在达到目标点之前会慢慢减速至0

    Radius:导航组件的半径
    Height:导航组件的高度
    Quality:躲避障碍物的精确度,越高耗能越大
    Priority:0-99之间,两个导航者在一起时,低的先走,高的避开

    Auto Traverse OffMesh Link:导航者到达导航跳跃点,是否自动越过起点到终点
    Auto Repath:是否自动再次定位,导航者不能达到目标点时停留在某一处,如果突然有一条路能达到目标点,这个时候如果这个开启则会重新寻路,否则不会
    Area Mask:规定导航着可以行走的区域,自己可以定义不同的导航网格,在烘焙导航网格的时候

    Off-Mesh Link 跳跃

    在这里插入图片描述
    Start:跳跃的起点
    End:跳跃的终点
    Cost Override:成本覆盖,值为正,则在路径请求处理中计算路径成本时使用该属性,否则,我们使用默认成本
    BiDirectional:双向开关,若不勾选则只能从Start到End跳跃
    Activated:导航是否可以使用该跳跃路径
    Auto Update Positions:勾选则自动完成跳跃,不勾选则可通过代码实现跳跃
    Navigation Area:设置导航区域

    Nav Mesh Obstacle 动态路障

    在这里插入图片描述
    Shape:选择形状,有Box和Capsule两种类型
    Center:形状的位置
    Size:形状的大小
    Carve:选中后导航体会自动换路,不会在一个树上吊死(有其他路的话)

    • Move Threshold:超过这个值导航体才会重新生成网格
    • Time To Stationary:超过这个值的时间才会开始生成网格
    • Carve Only Stationary:是否实时生成网格

    导航类

    NavMeshAgent

    字段

    名称 作用
    acceleration 最大加速度,面板上的辣锅
    agentTypeID 导航区域的ID
    angularSpeed 最大转向速度
    areaMask 指定哪一个NavMesh区域是可用的
    autoBraking 自动刹车,避免超过目的地点
    autoRepath 自动重新获取路径
    autoTraverseOffMeshLink 自动穿过Off Mesh Link(上面有介绍)
    avoidancePriority 当代理是一个障碍物时,级别低的代理被忽视
    baseOffset 基础偏移
    currentOffMeshLinkData 当前分离路⾯导航的数据,有字段:activated:是否处于激活状态 startPos:分离路⾯起点 endPos:分离路⾯终点 offMeshLink:是否是手动放置的 valid:链接是否有效 linkType:LinkTypeManual:使⽤OffMeshLink组件完成分离路⾯导航 LinkTypeDropDown:跳下⽅式 LinkTypeJumpAcross:⽔平跳跃⽅式
    desiredVelocity 期望速度
    destination 获取或设置目的地
    hasPath 当前是否有路径到达目的地
    height 可以通过的高度
    isOnNavMesh 该代理当前绑定到导航网格吗
    isOnOffMeshLink 代理当前的位置在一个OffMeshLink上吗
    isPathStale 当前路径是否陈旧
    isStopped 是否开始/停止导航
    navMeshOwner 返回代理当前所在的NavMesh的拥有对象
    nextOffMeshLinkData 当前路径的下一个OffMeshLinkData
    nextPosition 下一步应该走的位置
    obstacleAvoidanceType 规避质量的水平,上图有,就是修改Quality
    path 设置或者获取当前路径,返回的是NavMeshPath类型,有字段corners:路径的拐点 status:路径的状态(到达目标,中途到达目标或完全无效) 和方法ClearCorners:从路径中删除所有拐角点 GetCornersNonAlloc:计算路径的拐角
    pathPending 进程中的路径正在被计算但是还没转备好,bool值
    pathStatus 返回的是NavMeshPathStatus类型,当前路径的状态(PathComplete:完成,PathPartial:局部或PathInvalid:无效)
    radius 代理的避让半径,如上图的Radius
    remainingDistance 在当前路径中,代理的位置和目标位置的距离,如果这个距离是未知的那么这个值是infinity
    speed 在一条路径上行走时的最大移动速率
    steeringTarget 获得路径上的当前转向点
    stoppingDistance 当距离目标位置这个距离的时候停止,如上图Stopping distance
    updatePosition 获取或设置transform position是否与模拟的代理位置同步。默认为true
    updateRotation 代理是否更新方向
    updateUpAxis 允许您指定是将代理对齐到NavMesh的上轴还是将其放置在其上的链接
    velocity 获取NavMeshAgent组件的当前速度,或者手动为代理设置一个速度

    方法

    名称 作用
    ActivateCurrentOffMeshLink(bool activated) 激活当前分离网格链接
    CalculatePath(Vector3 targetPosition, NavMeshPath path) targetPositon 路径要求的重点位置。path 作为结果的路径,如果路径被找到返回true
    CompleteOffMeshLink 结束当前OffMeshLink上的移动,代理会移动到离当前OffMeshLink另一端最近的有效的位置
    FindClosestEdge(out NavMeshHit hit) hit 掌握定位结果的性能返回的NavMeshHit 包含最近的边缘上的最近的点的位置和细节,distance:到击中点的距离 hit:命中时设置标志 mask:在命中点指定 NavMesh:区域的蒙版 normal:(不清楚) position:命中位置。如果最近的边缘被找到返回True
    GetAreaCost(int areaIndex) areaIndex 区域索引,返回指定的区域索引当前的消耗
    Move(Vector3 offset) offset 相对的移动向量,申请一个相对当前位置的移动,如果代理有一个路径他将被校正
    Raycast(Vector3 targetPosition, out NavMeshHit hit) targetPosition 将要移动到的终点 hit 被射线发现的障碍物的属性(如果有) ,如果代理和目标位置之间有障碍物返回True,否则false
    ResetPath 清除当前路径,路径清除之后代理不会寻找一个新的路径直到SetDestination 被调用,如果调用该函数时在OffMeshLink上,则会立即完成
    SamplePathPosition(int areaMask, float maxDistance, out NavMeshHit hit) areaMask 一个位域标志,指定了寻路是哪个区域可以通过 maxDistance 超出这段距离则终止搜索路径 hit 保存结果地理位置的属性 ,如果在maxDistance之前结束返回true,否则false
    SetAreaCost(int areaIndex, float areaCost) areaIndex 区域索引 areaCost 指定的区域的新的消耗,设置穿过某种类型的区域时的消耗,如果你启用或废除代理,那么消耗将会被重置为默认值
    SetDestination(Vector3 target) target 导航到的目标点,如果目标地址请求成功返回True,否则false
    SetPath(NavMeshPath path) path 新的寻路路径,指定一段新路径给代理
    Warp(Vector3 newPosition) 让代理移动到指定的newPosition,之后代理不做任何移动

    AreaMask值

    -1表示全选
    若是挑选部分层,则该值的计算方法为:层编号-1,此值作为2的幂,将所有选定层的值相加
    例如,选定1,3,5,6层AreaMask的值
    2(1-1)+2(3-1)+2(5-1)+2(6-1)=53

    展开全文
  • unity3d 导航栏 组件

    2018-12-19 21:51:46
    //脚本不需要挂载, 所有方法都是静态方法 public MenuItem(string itemName); public MenuItem(string itemName, bool isValidateFunction); public MenuItem(string itemName, bool isValidateFunction, int ...
    //脚本不需要挂载, 所有方法都是静态方法
    
    public MenuItem(string itemName);
    public MenuItem(string itemName, bool isValidateFunction);
    public MenuItem(string itemName, bool isValidateFunction, int priority);
    
    
        public static void Handles()
        {
            Object[] gos = Selection.objects;
    
            //Debug.Log("go " + gos);
            foreach (var go in gos)
            {
    
                string path = AssetDatabase.GetAssetPath(go);
    
                string extname = Path.GetExtension(path);
                string goname = Path.GetFileNameWithoutExtension(path);
                string pathname = Path.GetDirectoryName(path);
                File.Copy(path, newPath + goname + "_UI" + extname, true);
            }
        }
    
    
        [MenuItem("测试/测试", false, 101)]
        public static void MyTest()
        {
            Debug.LogError("dddddddddddddddd GGGGGGGGGGGGG");
        }
    
        // 1.在菜单栏添加按钮
        [MenuItem("测试/Mybutton", false, 101)]
        public static void OnClick()
        { 
            Debug.Log("按下button");
        }
        
        // 4.Selection 获取当前选中物体
        [MenuItem("测试/11__Mydelete", false, 11)]
        public static void SeletionTest()
        {
            //打印当前选中物体的个数
            Debug.LogError(Selection.objects.Length);
            //如果你删除了你选中的物体,可以点击此按钮恢复这些物体
            foreach (Object item in Selection.objects)
            {
                Debug.LogError("item", item);
    
                //可以撤销删除操作
                Undo.DestroyObjectImmediate(item);
            }
        }
    
        //5.为按键添加快捷键​
        // %ctrl   #shift  &amp;alt
        // ctrl+shift+w
        [MenuItem("测试/MyButton/Debug %#w")]
        public static void MyButton1()
        {
            Debug.LogError("Debug ctrl+shift+w");
        }
    

     

    展开全文
  • unity3d 的NavMesh导航系统是一种用于动态物体自动寻路的技术。动态物体就是在游戏中可以运动的物体,一般是有生命的游戏角色,比如玩家英雄、怪物等。很多rpg游戏、实时对战游戏都是使用导航寻路,鼠标右击地图上的...

    什么是导航网格系统?

    前言:作为刚开始学习unity3d的菜鸟,将学习中觉得值得记笔记的地方分享给大家一起探讨,文中有理解错误的,勿怪哈!
    unity3d 的NavMesh导航系统是一种用于动态物体自动寻路的技术。动态物体就是在游戏中可以运动的物体,一般是有生命的游戏角色,比如玩家英雄、怪物等。很多rpg游戏、实时对战游戏都是使用导航寻路,鼠标右击地图上的某点,游戏角色自动找出到达该地点的最佳路线,然后以一定速度前往该目的地,这就是导航寻路。静态物体就是游戏地图中位置和形状稳定的、可以形成导航网格的物体,常见的有地形、建筑物等。
    unity3d的NavMesh导航系统的原理是根据A算法演变而来的,A算法是针对2D地图生成导航网格的算法,简单的说是把2D地形分成一个个矩形网格,然后按照广度优先算法,从起始点格子向周围的各自一层层探测,直到探测到目标点所在网格,比如
    在这里插入图片描述
    从A点导航到B点,首先将地图分成矩形网格,然后从A格子开始向周围的8个格子依次探索,如果周围的8个格子没有找到目标点B,则依次探索8个格子周围未探索的格子,直到找到B点所在格子,然后生成从A点到B点的路线。具体A算法可以自行查找资料。
    unity3d的NavMesh所使用的导航网格算法源于A
    算法,只不过为了扩展到三维世界的寻路,NavMesh将地图分成三角形网格(梯形也是由三角形组成),然后也使用广度优先算法从起始三角形一层层向外遍历,直到找到目标点所在的三角形,最后生成导航路线。
    比如我们搭建一个简单场景
    在这里插入图片描述
    地面上放置4个立方体,地形plane和4个cube的static都选中Navigation Static,表示这5个对象都参与导航网格的烘焙,其中黑色的两个cube的Navgation Area选项设置为Not Walkable,表示障碍物,障碍物所在区域无法生成行走路线。其余的两个白色cube和地面都设置为Walkable,表示可以通行的区域。我们点击Bake选项卡右下角的Bake按钮对场景进行导航网格的烘焙,可以看到生成的导航网格。
    在这里插入图片描述
    如图,凡是可以通行的地方都生成了蓝色的导航网格。这张导航网格保存后将作为整个游戏场景的导航网格,在开始游戏后,挂载Nav Mesh Agent组件的游戏角色在使用导航寻路时会按照这张保存的导航网格进行寻路。注意,导航网格是提前烘焙好的静态的地图,即使在游戏中Navgation Static对象发生了变化(移动、变形、毁灭),导航网格也不变,比如事先烘焙一座桥为可行进的导航网格,在游戏中桥被毁坏了,使用导航时游戏角色依然认为桥是存在的,导航路线不变。如果游戏中出现非Navgation Static的对象挡住了导航网格,游戏角色依然认为没有阻挡,不会改变导航路线,只不过行进的路上会被挂载碰撞体的对象所阻挡。
    接下来编辑Nav Mesh Agent组件,在场景中放置一个绿球代表玩家hero,放置一个小红球代表目的地。给hero球加上Nav Mesh Agent组件,然后编写脚本TestNavMesh.cs来开启导航系统的使用。代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;
    
    public class TestNavMesh : MonoBehaviour
    {
        public Transform target;
        void Start()
        {
            if(target != null)
            {
                GetComponent<NavMeshAgent>().destination = target.position;
            }
        }
    }
    

    将TestNavMesh.cs放到hero球上作为脚本组件,然后将target球赋予target变量。接着运行游戏,即可看到绿球主动走到红球的位置,过程中虽有障碍物,但是导航路线自动避开了障碍物。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Unity3D 导航寻路

    2019-07-26 14:19:06
    先选择Window-->...给需要导航的物体添加NavMeshAgent组件。可以调整速Speed Radius 等。 然后 1 NavMeshAgent agent = this.GetComponent<NavMeshAgent>(); 2 //设置目标 3 agent.SetDestinat...

    先选择Window-->Navigation 在新打开的窗口中点击Bake.

    待烘焙结束之后。

    给需要导航的物体添加NavMeshAgent组件。可以调整速Speed Radius 等。

    然后

    1 NavMeshAgent agent = this.GetComponent<NavMeshAgent>();
    2 //设置目标
    3 agent.SetDestination(player.position);
    4 //停止
    5 agent.Stop();

     

    转载于:https://www.cnblogs.com/Akishimo/p/4758614.html

    展开全文
  • Unity3d 导航系统

    2017-03-09 11:16:50
    Nav Mesh导航网格是3D游戏中实现动态物体自动寻路的技术
  • 导航系统又称寻路系统,在siki学院的视频教程中,我们将通过介绍内置的导航系统来深入学习Unity3D的人工智能。我将展示如何在场景找到最短的路径以及避开障碍。 第一步:要对场景进行网格烘焙。选择window-...
  •  Unity导航菜单栏位于游戏引擎界面的顶部,其中有很多选项且含义各不相同。Unity为开发者提供了导航菜单栏的程序接口,使用代码可以动态添加菜单栏中的选项以及子项   using UnityEngine; using System....
  • 大多数端游页游都会使用A*...现在学习的是Unity内置的导航系统,并结合案例进行讲解。开发版本:Unity 2017.1.1f1、VS 2017 适合人群:初学Unity者一.导航系统定义在Unity手册中是这样定义的:The Navigation Syste...
  • Unity自带导航系统 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心分享、心创新!助力快速...
  • 1.爬楼梯 (1)4个cube 、玩家...(4) 执行window——》AI——》Navigation 设置导航 设置高度 最后点击Bake 进行烘焙 (5)给玩家添加脚本 using UnityEngaine.AI; public class MouseMoveRay : MonoBehaviour...
  • 首先看一下效果 using UnityEngine; using UnityEngine.AI; // Use physics raycast hit from mouse click to set agent destination [RequireComponent(typeof(NavMeshAgent))] public class ClickToMove : ...
  • 旋转(欧拉、矩阵) 1.Transform:position(平移)、rotation(旋转)、scale(缩放)。 2.四元数:应于transform组件中的rotation属性,这个属性的类型其实就是四元数。 3.控制旋转的两种方式:矩阵旋转,欧拉...
  • NavMeshAgent 属性isOnOffMeshLink:表示是否处于链接线上 属性currentOffMeshLinkData:获取当前所在链接的数据,返回OffMeshLink类型的对象 方法stop():停止向导 方法resume():继续向导 ...
  • 目录:【Unity3D从入门到进阶】文章目录及设置这个专栏的初衷 二、导航系统面板 Agents模块: Name:设置烘培Agents的名字 Radius:烘培的半径,也就是物体的烘培的半径。这个值影响物体能通过的路径的大小 越小...
  • NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。。导航时,只需要给导航物体挂载...
  • Nav Mesh Agent 效果图 创建地面. 1.1 在Hierarchy下创建一个空的游戏对象命名为Ground: 右键 –&...重命名为Ground.... 3D Object –&amp;amp;amp;amp;gt; Plane, 创建一个之后进行复
  • 最新版本的Unity导弹自动追踪算法演示,按住右键可以调整视角,鼠标滚轮可以缩放。另外导弹的各种参数可以通过面板UI进行调整。相关文章请参见:https://blog.csdn.net/sdhexu/article/details/77962134
  • Unity 3D - 导航系统 ( NavMesh ) :效果图 :NavMeshAgent 属性分析 :Agent Size ( 代理尺寸 ) : 名称 作用 Radius 半径 代理半径 ( 仅用于寻路目的,可以跟实际对象的半径大小不一样,一般比实际对象的半径大 ) ...
  • unity3d之Navigation <一>

    2014-07-03 23:05:15
    今天打算实现一个怪物在场景中的训,便开始接触学校Navigation
1 2 3 4 5 ... 20
收藏数 3,070
精华内容 1,228
关键字:

unity3d 导航