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

news2024/11/17 1:36:19

众所周知,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.coloradmin.cn/o/2049629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库的系统视图v$datafile

达梦数据库的系统视图v$datafile 达梦数据库的V$DATAFILE 是一个重要的系统视图&#xff0c;提供了有关数据库数据文件的信息。 V$DATAFILE 系统视图 V$DATAFILE 视图用于显示数据库中每一个数据文件的详细信息。通过查询这个视图&#xff0c;数据库管理员可以了解数据文件的…

从零搭建xxl-job(六):xxl-job执行器服务端的简单搭建

经过前面的学习&#xff0c;相信大家对XXL-JOB调度中心的核心知识点和定时任务的调度流程已经了如指掌了&#xff0c;接下来&#xff0c;我们的重心就要从调度中心过渡到定时任务程序了&#xff0c;接下来&#xff0c;我会为大家搭建起一个简易的可运行的定时任务的体系&#x…

spring揭秘06-Autowired自动绑定依赖及组件自动扫描

文章目录 【README】【1】基于xml配置文件版本的自动绑定【1.1】基于xml配置文件版本的自动绑定代码示例 【2】基于注解版本的自动绑定【2.1】根据类型匹配的注解版自动绑定Autowired【2.2】根据名称匹配的注解版自动绑定AutowiredQualifier【2.2.1】 示例代码 【2.3】关于Prim…

面向财商人群的AI垂直产品 —— AI股票助手

在数字化转型的大潮中,AI技术正在重塑各行各业,尤其是金融市场。对于那些渴望在瞬息万变的股市中保持敏锐洞察力的金融分析师、投资者及股票爱好者来说,一款强大而智能的工具显得尤为重要。今天,我们将向大家介绍一款专为财商人群打造的AI垂直产品——AI股票助手。 一、产…

mac如何恢复被同名替换掉的文件夹 mac文件被替换如何恢复

Mac系统一直以高性能遥遥领先其他的Windows系统&#xff0c;因此&#xff0c;Mac虽然价格远远高出其他的笔记本电脑&#xff0c;但是还是受到了一众用户的青睐。使用mac时&#xff0c;我们也经常会将一个文件命名为已经有了相同文件的文件名&#xff0c;且保存到同一个目标地址…

吴恩达机器学习-C2W3-多类分类

目标 在本实验中&#xff0c;您将探索一个使用神经网络进行多类分类的示例。 工具 您将使用一些绘图例程。它们存储在这个目录下的lab_utils_multiclass_TF.py中。 import numpy as np import matplotlib.pyplot as plt %matplotlib widget from sklearn.datasets import …

centos7.9最小化安装之后的配置与下载

一. 配置yum源 1.备份系统自带源文件 cd /etc/yum.repos.d/ mkdir bak mv *.repo bak 2. 配置阿里云yum源 若有wget wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo若没有wget&#xff0c;先直接把 http://mirrors.aliyun.com/re…

11.怎么做好一个动态标签页

效果 步骤 1.在Elementui找一个标签页组件 复制粘贴到代码 2.将他写活 将很多页面需要用的方法和变量写入store editableTabsValue: 2,editableTabs: [{title: 首页,name: index,},],addTab(state, tab) {if (state.editableTabs.findIndex(item > item.title tab.titl…

mysql5.7主从同步失败原因总结-windows

1&#xff0c;主库data文件复制到从库&#xff0c;之后主库要同步的实例data一定不要在修改&#xff1b; 1.1&#xff0c;修改之后就要重新覆盖一遍修改过的data 2&#xff0c;如果状态不对&#xff1a;一定要查看日志&#xff1b;比如slave_io_state是空时&#xff0c;需要查…

KEEPALIVED 全csdn最详细----理论+实验(干货扎实,包教会的)

环境准备 主机名IP虚拟IP&#xff08;VIP&#xff09;功能ka1172.25.254.10172.25.254.100keepalived服务ka2172.25.254.20172.25.254.100keepalived服务realserver1172.25.254.110web服务realserver2172.25.254.120web服务 注意一定要关闭selinux,和防火墙&#xff0c;不然在…

zabbix7.0 设置中文语言( Debian GNU/Linux 12)

本例为安装zabbix7.0 zabbix_server (Zabbix) 6.4.17 Revision c12261f00b4 15 July 2024, compilation time: Jul 15 2024 11:05:06 系统版本信息为 lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 12 (bookworm) Rele…

防疫物资管理信息系统pf

TOC springboot379防疫物资管理信息系统pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…

【Django开发】前后端分离django美多商城项目第2篇:展示用户注册页面,1. 创建用户模块子应用【附代码文档】

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦~ 本教程的知识点为&#xff1a; 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计&#xff1a; 视图原型 2. 具体…

【网络安全】SSO登录过程实现账户接管

未经许可,不得转载。 文章目录 正文正文 登录页面展示了“使用 SSO 登录”功能: 经分析,单点登录(SSO)系统的身份验证过程如下: 1、启动SSO流程:当用户点击按钮时,浏览器会发送一个GET请求到指定的URL: /idp/auth/mid-oidc?req=[UNIQUE_ID]&redirect_uri=[REDI…

在 Mac 上更改 24小时制时间显示

使用“日期与时间”设置设定或更改 Mac 上的日期和时间。如果日期和时间正确&#xff0c;那么电子邮件、信息和文件上的时间戳也是准确的。了解如何设定日期和时间。 若要更改这些设置&#xff0c;请选取苹果菜单 >“系统设置”&#xff0c;点按边栏中的“通用” &#x…

[星瞳科技]OpenMV使用时有哪些常见错误和解决办法?

常见代码错误 ImportError:no module named xxx 这个错误是Import错误&#xff0c;没有stepper这个模块。 原因&#xff1a; 你没有把stepper.py这个文件拖到你的板子里。见&#xff1a;模块的使用 拖过去之后&#xff0c;需要重启&#xff0c;使模块生效 MemoryError:FB …

Class字节码文件结构

class字节码文件结构 类型名称说明长度数量u4magic魔数,识别Class文件格式4个字节1u2minor_version副版本号(小版本)2个字节1u2major_version主版本号(大版本)2个字节1u2constant_pool_count常量池计数器2个字节1cp_infoconstant_pool常量池表n个字节constant_pool_count-1u2a…

马头拧紧驱动器维修 拧紧控制器故障

马头拧紧控制器作为工业自动化领域不可或缺的重要设备&#xff0c;其稳定运行对于生产线的效率与安全性至关重要。然而&#xff0c;在实际应用中&#xff0c;难免会遇到各种Desoutter拧紧工具控制器故障&#xff0c;影响生产进度和设备性能。 拧紧轴控制器维修 拧紧装置 马头…

ubuntu设置共享文件夹,非虚拟机,服务器版

在Ubuntu中共享文件夹通常可以通过几种不同的方式来实现&#xff0c;比如使用Samba服务、NFS&#xff08;Network File System&#xff09;或者通过虚拟机软件如VirtualBox或VMware的内置共享文件夹功能。这里我假设您是在询问如何在Ubuntu主机上设置一个简单的文件共享服务&am…

MongoDB Redis 快速上手:NoSQL数据库操作精要

先言之 ☘️随着大数据时代的到来&#xff0c;非关系型数据库因其灵活性和扩展性逐渐受到开发者的青睐。MongoDB 和 Redis 作为两种非常流行的 NoSQL 数据库&#xff0c;各自拥有独特的特性和应用场景。MongoDB 是一款面向文档的数据库&#xff0c;适用于需要存储复杂数据结构…