怎么在unity调用ios AR导航地图 unity的导航系统


Unity导航系统

一、NavMeshAgent组件

1. 导航系统介绍

首先看两个导航系统的应用:

  • 网络游戏中的自动寻路功能,点击地图上的某个位置,角色自动跑到这个位置
  • RTS 和 Moba 类游戏中鼠标右键点击一个位置,角色自动走向这个位置,并且还具备规避障碍物的能力

以上使用的功能就是导航,或者叫寻路,主要具备两个特点:

  • 以最短路径前往目标
  • 规避障碍物

2. 导航烘培

既然要导航,那么必须先确定一张“地图”,确定玩家什么地方可以去、什么地方不能去。


  • Navigation(导航)面板
  • 功能:导航面板的主要功能就是规划场景中哪里可以去哪里不能去
  • 面板:Window -> AI -> Navigation

但是需要导航就必须先简单烘培一下地图才能继续


  • 烘培地图的步骤
  1. 选择场景中,将地形、场景相关的游戏物体设置为 Static 模式,这是烘培的前提
  2. 直接选择子栏目 Bake
  3. 点击Bake按钮
  4. 场景中部分区域呈现成蓝色,意味着烘培成功,蓝色就是角色可以前往的地方



3. 核心组件

场景烘培好后,已经确定了哪些地方角色可以前往,但是具体如何进行导航?

这就需要游戏物体身上具有 NavMeshAgent 这个组件,导航代理组件承担具体如何导航的计算。


NavMeshAgent 组件:

添加这个导航代理组件的游戏物体,身上会增加一个圆柱体形状的碰撞体

  • Agent Type:代理类型,我们在 Navigation 中添加类型,主要是设置这个角色的尺寸
  • Base Offset:碰撞体和角色的高度偏移
  • Speed:导航时的最大移动速度
  • Angular Speed:导航时的最大旋转速度
  • Acceleration:导航刚开始时加速到Speed 需要的程度,越大越快
  • Stopping Distance:距离终点多远则停止
  • Auto Braking:勾选后表示到达目标点或离目标点的距离满足 Stopping Distance 时自动停止,如果不勾选即使到达终点,角色也围着重点转来转去



4. 障碍规避

  • 障碍规避设置(同样在NavMeshAgent 组件中)
  • Radius:碰撞体半径
  • Height:碰撞体高度
  • Quality:躲避障碍物的行为质量,质量越高躲避行为越好,越智能
  • Priority:优先级,范围为 0~99,(0 优先级最高,99 优先级最低),高优先级的 Agent 不会与低优先级的 Agent 进行碰撞。



5. NavMeshAgent 常用属性与方法

导航系统的代码相关操作都有先 using UnityEngine.AI 命名空间

  • 常用方法:
  • navMeshAgent.SetDestination(Vector3 position):设置导航,填写目标位置
  • 常用属性:
  • navMeshAgent.isStopped:获取和修改,是否停止导航



登录后复制

using UnityEngine.AI;

public class NavMeshAgentTest : MonoBehaviour
{
    private NavMeshAgent navMeshAgent;
    public Transform target;
    
    void Start()
    {
        navMeshAgent = GetComponent<NavMeshAgent>();
    }
    
    void Update()
    {
        navMeshAgent.SetDestination(target.position);
        if(Input.GetKeyDown(KeyCode.Space))
        {
            agent.isStopped = !agent.isStopped;
        }
    }
}

二、Navigation面板

导航面板分为4个部分:

1. Agents 代理设置

Agents ,用于对需要进行导航的角色进行分类,默认有一个 Humanoid,也就是人类。

但是常规情况下,导航网格并不基于这个生成


主要设置:

  • Name:名称
  • Radius:半径
  • Height:高度
  • Step Height:能上多高的台阶
  • Max Slope:能上多陡峭的坡度


2. Areas 区域设置

  • 在游戏场景中,不同区域的行走代价是不同的,比如在陆地上肯定比在沼泽地走起来更快,所谓代价就是移动成本,代价越高的地方,导航系统会尽可能地绕过去。
  • Areas 面板主要用来设置不同区域的不同成本,但是这里只有预先设计好不同区域类型的成本,并不能直接设置场景中具体“这个游戏物体属于什么区域”。



3. Bake

  • 这个面板中有很多Agent相关的设置,实际上是在设置一个最极限的情况,可以理解成需要导航的最小单位,设置等同于 Agents 面板。
  • 点击 Bake 生成导航网格。


4. Object

  • Scene Filter:场景过滤,主要影响层级面板中的显示
  • Navigation Areas:设置所选游戏物体的区域设置,可以多选游戏物体

选中一个游戏物体后,Object面板中会出现一定的变化,我们会发现只有静态物体才可以进行 Navigation Areas(导航区域)的设置,这也意味着只有静态物体可以烘培到导航网格中去。



三、NavMeshObstacle组件

目前我们的导航网格,是通过将地形游戏物体设置为静态模式,然后导航烘培后实现,但是游戏中可能存在这种情况:

RTS 或 Moba 类型游戏中,可能因为玩家的建造、角色的技能,出现一个障碍物,我们右键移动角色的时候,需要避开这些障碍物。

故需要使用 NavMeshObstacle 组件

NavMeshObstacle 属性

要使用这个组件就直接给游戏物体添加这个组件即可。


参数:

  • Shape:形状,类似碰撞体的蓝色外框,但是实际上并不具备碰撞体的特性,可以穿模,仅仅用于导航计算上
  • Center:中心点
  • Size:尺寸
  • Carve:不勾选的情况。该障碍物只是阻挡了物体前进路线,并没有改变物体导航网格的(导航只会不断地计算最短路径,依旧认为该条路径是最短的,不会重新计算路径)。物体不会绕过该障碍物进行导航。

四、案例:鼠标点击移动

应用之前学习的动画系统、射线、导航系统等知识来完成一个点击移动的小案例。

登录后复制

using UnityEngine.AI;

public class NavigationTest : MonoBehaviour
{
    private Animator animator;
    private NavMeshAgent agent;

    void Start()
    {
        animator = GetComponent<Animator>();
        agent = GetComponent<NavMeshAgent>();

    }

    void Update()
    {
        if(Input.GetMouseButtonDown(1))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out RaycastHit hitinfo, 1000))
            {
                Debug.DrawLine(ray.origin, hitinfo.point, Color.red);

                agent.SetDestination(hitinfo.point);

                animator.SetBool("IsWalk", true);
                agent.isStopped = false;
            }

        }

        if(Vector3.Distance(transform.position, agent.destination) <= agent.stoppingDistance)
        {
            animator.SetBool("IsWalk", false);
            agent.isStopped = true;
        }
    }
}

   

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空