unity基础——Navigation导航系统(补充)

news/2025/3/19 17:29:11/

1、Off Mesh Link 过渡动画设置

  • 首先创建一个动画  
  • 关闭 Nav Mesh Agent 中的 Auto Traverse Off Mesh Link
  • 编写脚本
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.AI;public class OffMeshTest : MonoBehaviour
    {//Playerpublic NavMeshAgent agent;//跳跃动画public Animation ani;//是否正在传送bool isTransfering;//传送目标OffMeshLinkData omld;void Update(){// 检测是否处于OffMeshLink上if(agent.isOnOffMeshLink){if(!isTransfering)   //未开始传送{ani.Play("offmeshAni");omld = agent.currentOffMeshLinkData;isTransfering = true;   }else                //开始传送{ // 获取动画的归一化进度(0到1之间)float timeLerp = ani["offmeshAni"].normalizedTime;// 计算线性插值位置(从起点到终点)var posLerp = Vector3.Lerp(omld.startPos, omld.endPos, timeLerp);// 添加Y轴的正弦曲线运动,模拟跳跃抛物线posLerp.y+= Mathf.Sin(timeLerp * Mathf.PI) * 2;if(!ani.isPlaying)    //动画停止播放{agent.transform.position = omld.endPos;isTransfering = false;// 完成OffMeshLink过渡agent.CompleteOffMeshLink();}}}}
    }
    

    2、Navigation Area导航区域成本设置

成本设置——代码实现:

1)修改 door 的成本

2)Area Mask  

代码实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;public class NavAreaTest : MonoBehaviour
{//Playerpublic NavMeshAgent agent;void Update(){if (Input.GetKeyDown(KeyCode.T)){NavMesh.SetAreaCost(NavMesh.GetAreaFromName("Door"), 10000.0f);}if(Input.GetKeyDown(KeyCode.M)){int walkable = 1 << NavMesh.GetAreaFromName("Walkable");int jump= 1 << NavMesh.GetAreaFromName("Jump");int door = 1 << NavMesh.GetAreaFromName("Door");agent.areaMask = walkable + jump+ door;}}
}

3、多导航场景叠加跳转

实现代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;public class Test : MonoBehaviour
{public OffMeshLink oml;GameObject linkGo;void Update(){if (Input.GetKeyDown(KeyCode.A)){//  Scene加载模式 为 叠加 LoadSceneMode.Additive (两个Scenes同时出现)SceneManager.LoadScene("SceneAdd2", LoadSceneMode.Additive);}if (Input.GetKeyDown(KeyCode.B)){linkGo = GameObject.FindGameObjectWithTag("Link");oml.endTransform = linkGo.transform;}}
}

 4、Nav Mesh Agent (导航代理组件)

         

 1)Steering

  • Stopping Distance:到达目标位置立即停止运动(不为0)
  • Auto Braking:自动刹车

         多个寻路点  不勾选

2)Obstacle Avoidance

  • Radius(半径)

  • Height(高度)

  • Quality(质量):质量越高,监测频率越高
  • Priority(优先级):数字越小,优先级越高

3)Path Finding

  • Auto Repath(重新规划路径):

不勾选   遇到障碍 障碍消失  Player 未到达指定位置

勾选       遇到障碍 障碍消失  Player 到达指定位置

5、其他问题

人物运动打滑

偏离中心点

Unity导航系统 | Unity 中文课堂

12--15


http://www.ppmy.cn/news/1580371.html

相关文章

使用 NetworkX 进行图论分析与可视化

使用 NetworkX 进行图论分析与可视化 NetworkX 是一个用于创建、操作和研究复杂网络的 Python 库。它提供了丰富的图论算法和数据结构&#xff0c;适用于各种网络分析任务。本文将分点介绍 NetworkX 的主要功能&#xff0c;并通过代码示例进行详细说明。 1. 安装 NetworkX 在…

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…

iOS底层原理系列05-内存管理:从核心原理到高级优化

1. Objective-C 内存管理基础 1.1 堆与栈内存管理 iOS 系统区分堆栈内存&#xff0c;采用不同的管理策略&#xff1a; • 栈内存特性&#xff1a; 自动分配与释放&#xff0c;遵循 LIFO (后进先出) 原则存储局部变量、函数参数和返回地址具有极高的访问速度与效率容量有限&a…

游戏引擎学习第158天

回顾和今天的计划 我们在这里会实时编码一个完整的游戏&#xff0c;没有使用引擎或库&#xff0c;一切都由我们自己做所有的编程工作&#xff0c;游戏中的每一部分&#xff0c;无论需要做什么&#xff0c;我们都亲自实现&#xff0c;并展示如何完成这些任务。今天&#xff0c;…

NLP高频面试题(四)——BN和LN的区别与联系,为什么attention要用LN

在深度学习模型中&#xff0c;Normalization是一种极为重要的技巧&#xff0c;Batch Normalization&#xff08;BN&#xff09;和Layer Normalization&#xff08;LN&#xff09;是其中最为常用的两种方法。然而&#xff0c;二者在实际应用中有着明显的区别与联系&#xff0c;尤…

[从零开始学习JAVA] Stream流

前言&#xff1a; 本文我们将学习Stream流&#xff0c;他就像流水线一样&#xff0c;可以对我们要处理的对象进行逐步处理&#xff0c;最终达到我们想要的效果&#xff0c;是JAVA中的一大好帮手&#xff0c;值得我们了解和掌握。&#xff08;通常和lambda 匿名内部类 方法引用相…

从PDF文件中提取数据

笔记 import pdfplumber # 打开PDF文件 with pdfplumber.open(数学公式.pdf) as pdf:for i in pdf.pages: # 遍历页print(i.extract_text()) # extract_text()方法提取内容print(f---------第{i.page_number}页结束---------)

基于PMU的14节点、30节点电力系统状态估计MATLAB程序

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介&#xff1a; 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步向量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; …