UE5学习笔记17-让人物的视线和鼠标移动时的方向一致,并且不让人物模型旋转,只改变视线方向

本文主要是介绍UE5学习笔记17-让人物的视线和鼠标移动时的方向一致,并且不让人物模型旋转,只改变视线方向,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、创建标准动画帧

        1.我想让人物在装备武器后根据鼠标的移动方向改变人物的视线方向,并且人物模型不会改变朝向

        2.我的动画中存在一个四个方向瞄准的动画,将左下,坐上,左转,右上,右下,右转,中上,中下,中,的动画的某一帧保留,具体流程如下(记得复制一份动画资源,可以直接ctrl+w拷贝一份),在创建一份标准动画,就是刚进入游戏的人物的朝向,我是面向前方的动画

        3.打开动画,将动画的资产详情中选择选择的网格体,选择选择的动画帧后在进行后续操作,我当前的动画在第10帧时中上的画面,在第十帧右键将0到10帧的画面移除

移除前

移除后 

在去掉第一帧到最后一帧的动画 

 如图

        4.重复3的步骤将9个方向的某一帧动画都保存出来

二、 迁移项目

        1.完成结果(AimA0文件夹放的时瞄准时的动画,HipA0文件夹放的是不拿武器时的动画,Zero命名的动画和A0_CC命名的动画是一样的,之后会知道怎么使用)

 

         2.当前的动画我实在UE4版本中保存的,UE4的骨骼资产不在UE5中,将UE4的骨骼资产移动到Assert文件夹中(可能需要和UE5的骨骼资产保持一定的相对的路径)

        3.点击移动后界面还会有一个相同的文件夹,可以不用管它,迁移AimOffset文件夹,当前文件夹中都是第一步中3制作的动画资产,迁移时只迁移AimOffset文件夹如下图2。

 图二

         4.将资产放到当前项目的content文件夹中

三、 创建瞄准偏移

        1.在动画文件夹(自己找个自己能记住放在那里的地方就行)中单机右键->动画->瞄准偏移

        2.在瞄准偏移中将刚才的动画添加到如图的位置上,将水平轴和垂直轴改成如图所示的样子

 图中左侧时A0_LC的动画

        3.将资产详情向下拉 将附加设置中的预览基础姿势设置为Zero的资产

        4.将水平和垂直轴设置成-90—+90是因为人物在摄像头不动时左右有90°的旋转可以按住ctrl在中间界面的下方界面移动鼠标查看效果(可以将视角移动到角色后方如上图)

四、添加代码

        1.在动画蓝图的C++代码中添加Yaw和Pitch两个变量,之后镜头旋转和角色旋转会用到

        2.在动画蓝图的C++的CPP中 NativeUpdateAnimation函数中添加(Blasetr时角色的类的指针)

	A0_Yaw = BlasterCharacter->GetA0_YAW();A0_Pitch = BlasterCharacter->GetA0_Pitch();

        3.在角色类台添加两个获得对应变量的函数

        xxx.h

	FORCEINLINE float GetA0_YAW() const { return A0_Yaw; };FORCEINLINE float GetA0_Pitch() const { return A0_Pitch; };/** begin 瞄准偏移量 */float A0_Yaw;float A0_Pitch;/** end 瞄准偏移量 *//** 当前角色旋转的角度  */ FRotator StartingAimRotation;/** 当前角色旋转的角度  */void AimOffset(float DeltaTime); // 计算瞄准时的偏移量

        xxx.cpp 该函数在Tick函数中调用头文件需要#include "Kismet/KismetMathLibrary.h"是个数学库的头文件,if语句中只是当前的判断条件,不同状况下记得更改条件

void ABlasterCharacter::AimOffset(float DeltaTime)
{if (Combat && Combat->EquippedWeapon == nullptr) return;/* 只想获得平面上xy的速度的向量,将z方向的速度置为0 */FVector Velocity = GetVelocity();Velocity.Z = 0.f;/* 获得速度的向量 */float Speed = Velocity.Size();bool bIsInAir = GetMovementComponent()->IsFalling();// 当前状态是站立的状态if (Speed == 0.f && !bIsInAir){FRotator CurrentAimRotation = FRotator(0.f, GetBaseAimRotation().Yaw, 0.f);FRotator DeltaAimRotation = UKismetMathLibrary::NormalizedDeltaRotator(CurrentAimRotation, StartingAimRotation);A0_Yaw = DeltaAimRotation.Yaw;bUseControllerRotationYaw = false; // 控制器旋转(false) 效果是当鼠标进行移动时,角色的朝向不会和鼠标的移动方向一致}//当前状态是奔跑或跳跃if (Speed > 0.f || bIsInAir){StartingAimRotation = FRotator(0.f,GetBaseAimRotation().Yaw,0.f);A0_Yaw = 0.f;bUseControllerRotationYaw = true; // 控制器旋转(true)}A0_Pitch = GetBaseAimRotation().Pitch;if (A0_Pitch > 90.f && !IsLocallyControlled()){// 将pitch从[270 , 360) 映射到[ -90 , 0 ) 由于在多人游戏中UE5会将数据压缩封包,将值变成一个正数发送到服务器上,所以需要一个映射FVector2D InRange(270.f, 360.f);FVector2D OutRange(-90.f, 0.f);A0_Pitch = FMath::GetMappedRangeValueClamped(InRange, OutRange, A0_Pitch);}
}

        4.代码的一些补充,当存在两个以上的客户端时(或一个客户端一个服务器),UE5会将客户端的角度进行数据压缩发送到服务器上,只需要知道服务器上收到的都是正数需要做映射即可关于为什么是270.f到360.f做的映射可以通过UE_LOG函数调试时看一下pitch输出的值(时客户端移动在服务器上接受到的值)找到对应的边界。

五、动画蓝图中的改变

        1.打开动画蓝图,将动画缓存到缓存中

        2.创建新的状态机,添加新的状态节点

        3.节点中如图,A0_Yaw和A0_Pitch是三中添加的C++的代码通过右键可以获得红色的同理

 

         4.骨骼的分层混合,当鼠标移动时只是上半身移动,所以需要分层混合

        5. 节点配置

        6.对应骨骼节点(spine_01)

        7.最后的动画蓝图样子(白色的通过右键输入Comment/注释可以找到)

这篇关于UE5学习笔记17-让人物的视线和鼠标移动时的方向一致,并且不让人物模型旋转,只改变视线方向的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106752

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在