【Unity实战】NavMeshAgent实现Strafe固定朝向移动

embedded/2024/12/22 18:23:00/

众所周知,NavMeshAgent一旦设定了destination,它就会直奔目标。但是在一些场景中,比如NPC是个射手,除了瞄准玩家,也需要走位。如果不加以处理,我们恐怕会遇见瞄准IK和朝向…难以言表的表现,直接上图吧。

在这里插入图片描述
下文我就以我的测试项目为例去讲这个事情。

准备工作

在开始之前,确保你已经熟悉Unity引擎的基本操作和NavMesh的设置。另外,需要在角色身上添加NavMeshAgent组件,并保证角色所在的场景已经设置好了NavMesh。

在我这个项目里,使用了官方的第三人称控制器package和Mirror Networking,可以上Asset Store去找。我们NavMeshAgent除了修改position和rotation,还要把velocity转换成输入的x、y,模拟玩家输入,确保原Controller脚本的move函数正常进行,并且能够更新动画,这样改的量能少一些。

其次需要注意的是,动画机也有改动,动画机参数多了两个float,分别代表纵轴和横轴的输入。与此同时,还加入了一套平移用的动画StateMachine。

至于怎么实现ThirdPersonController的Move函数如何实现固定朝向,这里就不进行赘述。
在这里插入图片描述

实现Strafe移动

首先,我们需要在StarterAssetsInput的脚本中添加一个方法来处理NavMeshAgent的移动操作。要激活这套逻辑,**需要确保该角色处于瞄准的状态下,而且我们需要保证agent无论怎么移动都要始终面向目标。**下面是一个示例代码:

/// <summary>
/// NavMeshAgent操作移动
/// </summary>
[ServerCallback]
private void OnNavMeshAgentInput()
{if (!netIdentity.isServer) return;if (!_teamIdentifier || !_teamIdentifier.IsBot) return;if (!_agent || !_agent.enabled) return;if (aim){if(_agent.remainingDistance > _agent.stoppingDistance){Vector3 targetDirection = _agent.destination - transform.position;Vector3 desiredVelocity = targetDirection.normalized;_agent.velocity = desiredVelocity;}}MoveInput(new Vector2(_agent.velocity.x, _agent.velocity.z));// TODO: 跳跃、下蹲、跑步// 根据角色速度判断是否要切换到跑步状态// 跑步已改到Behavior Designer实现// sprint = _agent.velocity.magnitude > 3f; // 假设速度大于5时切换到跑步状态
}

上面的代码中,我们通过计算目标方向和期望速度来实现Strafe移动效果。当角色处于移动状态时,设置NavMeshAgent的速度为期望速度,从而实现横向移动。

然而没有完事,人的确固定朝向移动了,但是腿出了毛病,前进变后退,左右却在前进后退时播放。这个是因为velocity的x和z与正常玩家的输入的xy值是有出入的,我们需要特殊处理。

接着,我们需要更新动画控制器来反映角色的移动状态。下面是更新动画控制器的代码片段:

// update animator if using character
if (_hasAnimator)
{_animator.SetFloat(_animIDSpeed, _animationBlend);_animator.SetFloat(_animIDMotionSpeed, inputMagnitude);if (!_agent || !_agent.enabled){_animator.SetFloat(_animIDHorizontal, _speed * _input.move.x);_animator.SetFloat(_animIDVertical, _speed * _input.move.y);}else{_animator.SetFloat(_animIDVertical, Vector3.Dot(transform.forward, _agent.desiredVelocity), 0.1f, Time.deltaTime);_animator.SetFloat(_animIDHorizontal, Vector3.Dot(transform.right, _agent.desiredVelocity), 0.1f, Time.deltaTime);}
}

在上面的代码片段中,我们使用了Vector3.Dot方法来计算两个向量之间的点积。点积是一种向量运算,用于衡量两个向量之间的相似程度。具体来说,点积计算的是两个向量之间的夹角的余弦值乘以两个向量的长度之积。

在动画控制器中,我们使用Vector3.Dot方法来计算角色的前方向和NavMeshAgent的desiredVelocity向量之间的点积。这样做的目的是为了获取角色当前移动方向与期望移动方向之间的相似程度,从而在动画中正确地表现出角色的横向移动状态。

可能不是很完美,但希望能有所启发,至少在更新这个动画机参数这块。


http://www.ppmy.cn/embedded/97363.html

相关文章

electron 中的ipcMain.handle和ipcMain.on 的区别

在Electron中,ipcMain.handle和ipcMain.on是主进程(main process)用于处理来自渲染进程(renderer process)消息的两个主要方法,它们之间存在明显的区别,主要体现在消息处理的同步性、响应方式和应用场景上。 ipcMain.on 同步性:ipcMain.on是异步的。当渲染进程通过ipc…

Matlab simulink建模与仿真 第一章(simulink入门)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、simulink简介 1、simulink与MATLAB的关系 &#xff08;1&#xff09;MATLAB是一种以矩阵为来处理数据的的计算软件&#xff0c;其应用范围十分广泛&#xff0c;该产品由若干模块组成&#xff0c;simulin…

web开发环境搭配与创建javaee项目

一.web开发 (1)web开发指的是前端,后端,以及数据库进行交互&#xff0c;前端发送请求到后端&#xff0c;后端经过程序处理后到达数据库&#xff0c;最后在进行后端处理响应回前端。 (2)一次三端交互的doget或者dopost简单请求流程 (3)web开发除了需要前端,后端,数据库开发工具…

Docker-安装软件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装MySQL&#xff08;一&#xff09;拉取MySQL镜像&#xff08;二&#xff09;运行MySQL容器&#xff08;1&#xff09;数据卷概念 &#xff08;三&#x…

git的学习教程

目录 1.初始化仓库 2.环境配置 2.1配置用户姓名&#xff1a; 2.2配置用户邮箱&#xff1a; ​编辑 2.3删除姓名配置&#xff1a; 2.4删除邮箱配置&#xff1a; 2.5全局配置姓名&#xff1a; 2.6全局配置邮箱&#xff1a; 2.7全局删除姓名&#xff1a; 2.8全局删除邮箱…

vue 拦截器

拦截器——main.js中&#xff0c;可以编写 Axios.interceptors.request.use()来拦截所有的请求&#xff0c;对请求做相应护理后再放行搭配后端&#xff0c;这也是全局的&#xff0c;每个请求中无需自己处理 在main.js中配置 Axios.defaults.baseURLhttp://127.0.0.1:8088; …

前端读取response.headers异常:Cannot read properties of undefined (reading ‘split‘)

[TOC](前端读取response.headers异常:Cannot read properties of undefined (reading ‘split’) ) 前端读取response.headers异常 Cannot read properties of undefined (reading ‘split’) TypeError: Cannot read properties of undefined (reading ‘split’) 报错解释&a…

DHT11温湿度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作时序 3.起始信号与响应信号 4.读数据时序 5.DHT11数据格式 三、程序设计 main.c文件 dht11.h文件 dht11.c文件 四、实验效果展示 五、资料获取 项目分享 一、介绍 DHT11是一款含有已校准数字信号输出的温湿度复合传感器&…