zoukankan      html  css  js  c++  java
  • 关于Unity中网格导航与寻路

    寻路思路

    1.烘焙出地形数据,导航数据,区分哪些是路径,哪些是障碍物

    2.给要寻路的角色添加寻路的组件,加好了以后就会有速度和目的地之类的参数设置

    3.只要设置好目的地,角色就会根据烘焙好的地图自己走过去

    4.要实现鼠标点哪里,就去哪里,也很简单,使用之前学习过的3D拾取的技术,找到当前鼠标点击的是哪个位置,设置一下目标点,那么主角就会走到鼠标点击的位置

    5.如果是敌人怪物的话,有一个搜索的目标,目标到哪里,就会跟到哪里,属于敌人AI的决策

    6.如果目的地找不到,主角就会走到他自己能走的某个相应地方

    Window---->Navigation

    Navigation栏的Object是要设置的对象列表,可以是All全部,Mesh Renderer有网格的或者是Terrains地形。

    Bake是全局的参数的设置。

    Area是层,这些层可以自定义,层的cost是寻路的代价,代价越高计算次数越高。

    Nav Mesh Agent组件

    1:代理器,角色或NPC(非玩家控制角色)关联好这个组件就能够使用这个组件在在地图上行走;
    2: nav mesh agent 参数:
      (1)Radius 代理器半径;
      (2)Speed代理器移动速度;
      (3)Acceleration 代理器加速度;
      (4)Angular Speed代理器角速度;
      (5)Stop distance 代理器到达时与目标的距离;
      (6)Auto Tranver OffMesh Link 是否穿过自定义路线;
      (7)Auto Baking 是否自动停止无法达到目的地的路线;
      (8)Auto Repath: 原有路线发生变化的时候,是否重新寻路;
      (9)Height: 代理器的高度;
      (10)Base Offset: 代理器相对导航网格的偏移;
      (11)Obstacle AvoidanceType: 代理器回避级别;
      (12)Avoidance Priority 代理器回避优先级;
      (13)Area Mask: 代理器可使用的导航网格层,unity对导航网格层以2^0, 2^1次对第0层第1层进行编码, Walkable是各层数据的和,比如3,可以在第0层和第1层移动;

    寻路实例

    1.创建Unity项目和文件目录

    2.创建一个平面Plane和一个胶囊体Capsule,和一个立方体Cube

    3.调出Navigation 导航窗口,Window-->Navigation, 将plane勾选为 Navigation Static,在Navigation Area选择Walkable,该窗口下按下Bake按钮,进行网格导航烘培;

    4.被标记为Navigation Static的对象,都会出现青色的导航网格层,同时在Assets目录下会生成Pathing文件NavMesh.asset;

    5.将Cube勾选为Navigation Static,在Navigation Area选择Not Walkable,该窗口下按下Bake按钮,进行网格导航烘培;

    6.给胶囊体Capsule添加寻路组件Nav Mesh Agent,也叫导航代理

    7.创建一个脚本nav_agent_test挂载Capsule下,来控制鼠标点到哪里,胶囊体Capsule就走到哪里

     打开nav_agent_test脚本

    using UnityEngine;
    using UnityEngine.AI;
    using System.Collections;
    
    public class nav_agent_test : MonoBehaviour
    {
    
        public NavMeshAgent agent;//要引入using UnityEngine.AI;库才可以使用
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButtonDown(0))//鼠标按下
            {
                //注意:要使用3D拾取技术,被点击所有物体必须有Collider碰撞检测器组件
                // 发射一条射线
                Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(r, out hit))//射线是否点击到物体
                { // 射线点击到了某个物体;
                    Debug.Log(hit.collider.gameObject.name);//打印出当前射线点击到的物体的名字
                    this.agent.SetDestination(hit.point);//把当前点击到的物体的坐标设置为寻路代理组件的目的地坐标
                }
                // end 
            }
        }
    }

    8.关联好Capsule节点到它自己的nav_agent_test脚本的public属性

    9.运行,点击Game视图中的plane的任意一个位置,Capsule都会走过去,而且过程中会绕开Cube

    自定义路线

    有的时候想从一个地方爬过去,有楼梯直接跳下来啊之类的,默认的Navigation Area已经满足不了我们了

    1: 为了满足复杂的地形而提供的特殊组件,开发人员可以自行设计所需路线,该路线会并入到导航网络中;一并参与寻路计算;

    2: Off Mesh Link组件参数:
      Start: 定义路线的起始位置信息;
      End 自定义路线的目标位置信息;
      Cost Override: 自定义路线的成本覆盖;
      Bi directional 自定义路线是否允许双线穿越;
      Activated: 是否激活改路线;

    3: 自定义Area Type,自定义的层会和下面三个并列存在于Object的Navigation Area的选项中
      Walkable: 这个区域可以行走;
      Not Walkable: 这个区域不可以行走;
      Jump: 可跳过,将会自动生成auto-generated Off-Mesh Links

    自定义路线实例

    1.创建一个新场景nav_map,保存到scene文件夹下

    2.导入资源包map.unitypackage(第61),把模型map拖进场景中,把整个map节点右上角设置为Navigation Static

    3.先选择map节点,再点击Navigation面板的bake栏的右下角的bake,烘焙好可以行走的路线

    4.给每个map的子节点添加Mesh Collider,为等一下的3D拾取做准备

    5.导入资源包hero.unitypackage(第61),把主角hero模型拖进场景中,把它放在某个位置,添加组件Nav Mesh Agent和关联刚才写好的脚本nav_agent_test

    6.运行,发现中间有隔断的时候是过不去的,这时候就需要自定义路线

    7.创建一个空节点offmesh,它的坐标从主角hero那边拷贝过去,比较好调接下来的位置,给它添加Off Mesh Link组件

    8.在offmesh节点下再创建两个空子节点,为start和end,关联start和end节点到offmesh节点的Off Mesh Link组件的start和end属性里面

    9.把start节点放在路的一边,end节点放在路的另一边,调整两个节点的位置,直到出现圈圈为止才算搭桥完成

                    

    10.运行,发现点击中间有隔断的路的另一侧的时候,可以飞过去

  • 相关阅读:
    PHP正则表达式入门教程[转]
    微信公众平台消息接口开发(6)电话号码链接与网址链接
    微信公众平台消息接口开发(7)快递查询
    server后台程序的内存使用问题
    支持向量机(SVM)(三)-- 最优间隔分类器(optimal margin classifier)
    NYOJ-451-光棍节的快乐
    为什么我们想法非常多,付诸行动的却非常少?
    ios两视图间托付(delegate)传值
    Kettle变量和自己定义java代码的实例应用
    測试Service
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7270547.html
Copyright © 2011-2022 走看看