当前位置: 首页 > article >正文

【Unity】AI Navigation自动寻路(导航)功能

1.简介以及安装AI Navigation

1.1 简介

AI导航包包含高级组件,允许你在游戏中使用导航网格来整合导航和寻径。有了这个包,你可以在运行时和编辑时构建和使用导航网格,创建动态障碍,并使用链接来允许特定的动作(如跳跃),因为你的角色在导航网格之间导航。

1.2 安装方式

在Window->PackageManager中,搜索AI Navigation,安装导入即可

2.创建导航地面

这一步是为了确定要实现智能导航的区域

2.1 创建地面

在游戏场景中,创建一个3D Object—>Plane

或者,你可以使用自己已经搭建好的地面地形

2.2 添加网格表面导航

选中刚刚创建好的地面,然后添加NavMeshSurface组件

2.3 烘焙地面

在完成上述步骤之后,在NavMeshSurface组件中,点击Bake完成烘焙。

此时可以看到场景中出现了蓝色区域,这些区域就是允许导航的区域。

3.障碍物设置

如果在场景中需要添加阻碍角色移动的物体,你可以为其添加NavMeshObstacle组件

4.添加角色导航代理

在游戏角色身上添加NavMeshAgent,这样你的角色就可以受到智能导航的控制了!

在里面,你可以调整一些角色移动的基本参数,比如Speed(最大移动速度)、Angular Speed(最大转向角速度)、Acceleration(最大加速度)

还有身体的参数:

  • Radius(角色体积半径)

  • Height(角色高度)

  • Priority(权重),用于多角色导航时候的导航优先权设置,越大则越优先进行导航

  • Stop Distance(停止距离),如果你希望角色移动到目标位置时会保持一定的距离,可以设置该参数

  • Auto Breaking(自动刹车),如果希望在移动到目标位置的时候有一个缓慢停止的过程,可以启用该功能

5.实现角色智能导航移动

我们需要给地面在Insprctor窗口中添加一个Tag(我给Tag取名为“Ground”),同时确保地面有MeshCollider

我们来实现一个鼠标点击指定位置,然后角色会自动移动到点击的位置。

这里我们简单梳理一下逻辑:

  1. 鼠标点击屏幕

  2. 以鼠标点击的位置,向相机朝向的方向发射一条射线

  3. 射线命中地面,返回命中的点(Destination)

  4. 通过NavMeshAgent让角色移动到Destination

下面是C#代码(将这个脚本挂载在角色身上即可使用)

using System;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.AI;


public class MouseManager : MonoBehaviour
{
    //定义一个Unity事件,参数是Vector3,表示要移动的位置
    public UnityEvent<Vector3> onMouseClick;
    
    //角色的NavMeshAgent组件
    private NavMeshAgent _agent;
    
    //用于存储射线命中信息
    RaycastHit hitInfo;
    
    private void Awake()
    {
        _agent = GetComponent<NavMeshAgent>();
    }

    private void Update()
    {
        //将鼠标的位置(鼠标的屏幕坐标)转换为射线
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //发射射线,hitInfo接收命中信息
        Physics.Raycast(ray, out hitInfo)
        //如果鼠标左键按下,并且命中的目标的Collider不是空的
        if (Input.GetMouseButtonDown(0) && hitInfo.collider != null)
        {
            //如果命中的目标的Tag是地面(Ground),则激活事件
            if(hitInfo.collider.gameObject.CompareTag("Ground"))
                _agent.destination = hitInfo.position;
        }
    }
}


http://www.kler.cn/a/568127.html

相关文章:

  • Android15 Camera HAL Android.bp中引用Android.mk编译的libB.so
  • 前端请求乱序问题分析与AbortController、async/await、Promise.all等解决方案
  • 科技快讯 | DeepSeek繁忙次数少了;阿里Qwen团队发布新推模型QwQ;微信PC端可以收好友红包了
  • 从Java到MySQL8源码:深入解析PreparedStatement参数绑定与执行机制
  • 从实测看声网:用技术重构直播,为电商创业赋能
  • 用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较
  • 浅谈人工智能之Windows安装llama factory
  • 内容中台与企业内容管理架构解析
  • 每天一个Flutter开发小项目 (5) : 专业Flutter导航与路由 - 构建精美菜谱应用
  • TCP和UDP协议比较
  • win32汇编环境,对话框中使用IP地址控件示例
  • Redis的优势和特点
  • JAVA学习笔记038——bean的概念和常见注解标注
  • MySQL学习笔记(1)索引
  • 玩转 Netty : 如何设计高性能RPC通信组件
  • MTK 相机多帧拍照systrace 拆解笔记
  • 组件动态注册、布局引擎、Schema驱动渲染的可视化搭建系统架构设计之参考方案
  • 2.7 大模型RAG内容安全合规检查-大模型ACP模拟题-真题
  • 山大软院ai导论实验之采用BP神经网络分类MNIST数据集
  • 指纹细节提取(Matlab实现)