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

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

时间:2024-08-25 19:50:39浏览次数:12  
标签:动画 17 Yaw float 视线 A0 文件夹 Pitch UE5

一、创建标准动画帧

        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/注释可以找到)

标签:动画,17,Yaw,float,视线,A0,文件夹,Pitch,UE5
From: https://blog.csdn.net/m0_53219246/article/details/141532835

相关文章

  • 【数据结构-前缀异或和】力扣1177. 构建回文串检测
    给你一个字符串s,请你对s的子串进行检测。每次检测,待检子串都可以表示为queries[i]=[left,right,k]。我们可以重新排列子串s[left],…,s[right],并从中选择最多k项替换成任何小写英文字母。如果在上述检测过程中,子串可以变成回文形式的字符串,那么检测结果为......
  • [COCI2017-2018#5] Planinarenje
    这道题目是二分图博弈的板子介绍一下二分图博弈:设两部的节点分别为\(x_1,x_2,...,x_n\)和\(y_1,y_2,...,y_m\),先手选择了\(x_i\)这个节点,则先手必胜当且仅当\(x_i\)是最大匹配的必须点(也就是说少了\(x_i\)的话最大匹配数会减少)证明:任选一个最大匹配,则\(x_i\)为匹配点,先手的策......
  • 17-神经网络-延迟初始化
    使用torch.nn.LazyLinear(output)实现延迟初始化importtorchimporttorch.nnasnnclassMyModel(nn.Module):def__init__(self):super(MyModel,self).__init__()self.fc1=nn.LazyLinear(128)#输入维度设置为None,表示延迟初始化self......
  • rocketmq 是参考了 kafka架构, 为什么rocketmq吞吐量是10万/秒, kafka吞吐量是17万/秒
    我们都知道,为了防止消息在服务器丢失,一般都是进行持久化(保存在磁盘),在发送消失时那就涉及到从磁盘拷贝到内核空间,从内核空间到用户态,再从用户态到socket缓存区,从socket缓存区到网卡四次拷贝。kafka使用的是零拷贝-sendfile,把内核态数据发送到网卡,减少两次拷......
  • 017、二级Java知识点之Java Applet与图像处理:从基础到应用
    JavaApplet与图像处理:从基础到应用1.题目解析先来详细解析题目中给出的代码示例:importjava.____.*;importjava.awt.*;importjava.net.*;publicclassImageDemoextendsApplet{privateImageimage;publicvoid______(){Stringimage......
  • YSP_refs_cn_2017_其他关节炎及PsO
    rhTNFR-Fc中文文献-2017-其他炎性关节炎及PsO 银屑病关节炎 随机对照试验[1][1] 桂银莉,史丽璞,郇稳,等.益赛普联合甲氨蝶呤治疗银屑病关节炎34例临床效果观察.北方药学,2017,14(9):143-144.浏览文摘 银屑病病例对照[2][2] 张杰,李江涛,邓文郁,等.......
  • YSP_refs_cn_2017_适应症外及基础研究
    rhTNFR-Fc中文文献-2017-适应症外和基础研究 探索适应症外 案例报道[1-10][1] 杨丽颖,马俊兵.重组人Ⅱ型肿瘤坏死因子受体-抗体融合蛋白治疗红皮病性银屑病的疗效观察.中国医疗美容,2017,7:33-35.浏览文摘[2] 李赛燕.益赛普治疗白塞病的临床分析.现代养生(下半月......
  • YSP_refs_cn_2017_RA
    rhTNFR-Fc中文文献-2017-RA 类风湿关节炎 随机对照试验[1-8][1] 黄达奇.甲氨蝶呤联合益赛普对类风湿关节炎的治疗价值探析.中国保健营养,2017,27:320.浏览文摘[2] 黄源.益赛普联合甲氨蝶呤治疗中重度活动性类风湿关节炎的疗效和安全性评价.医学临床研究,2017,......
  • YSP_refs_cn_2017_SpA
    rhTNFR-Fc中文文献-2017-SpA 脊柱关节炎 随机对照试验[1-10][1] 符维广,李浩鹏.重组人Ⅱ型肿瘤坏死因子受体-抗体融合蛋白治疗强直性脊柱炎的临床效果.中国医药导报,2017,14(6):112-115..浏览文摘[2] 贺冬冬,何岚,张薇,等.关节腔注射益赛普治疗膝关节受累的......
  • [ARC177F] Two Airlines
    MyBlogs[ARC177F]TwoAirlines有点魔怔的题。一个基本的观察是如果当前某个人\(A\)拿着盒子走到了位置\(i\),那位置小于\(i\)的人一定永远没用了。如果之后要用到前面的人\(B\),就应当让\(B\)拿着盒子走到\(i\)而不是让\(A\),这样\(A\)待在原来的位置,代价一定不会......