ARPG----C++学习记录05 Section12 动画蒙太奇,收拿剑,MetaSound,调整动画

代码更新

https://github.com/BAOfanTing/ARPG_Game_Code/commit/c629270e49496ba1bcbaf03780d23c1842ca5e7a

Animation Montages动画蒙太奇

蒙太奇的工作流程

新建一个鼠标左键的按键映射,下载一些攻击动画,重定向给我们的人物,新建一个动画蒙太奇,放入动画

然后在动画蓝图里插入一个Slot节点再在人物的蓝图里这样设置,就能点击产生攻击动画

使用C++来播放蒙太奇

新建函数Attack,绑定,定义一个蒙太奇变量

首先获取动画实例,判断动画实例和蒙太奇动画是不是空指针,用一个随机数来选择播放的蒙太奇动画,最后还需要在蓝图里设置攻击蒙太奇

优化攻击动画

现在一直点击鼠标会打断上一次的攻击重复播放需要更改。把播放蒙太奇的代码封装成一个函数,随后新定义一个角色动作状态的枚举,先判断能否进行攻击,进入后设置攻击状态无法重置攻击。

UENUM(BlueprintType)
enum class EActionState:uint8
{EAS_Unoccupied UMETA(DisplayName = "Unoccupied"),EAS_Attacking UMETA(DisplayName = "Attacking"),EAS_Equipping UMETA(DisplayName = "Equipping")
};void ACharacter01::Attack()
{	if (CanAttack()){PlayAttackMontage();ActionState = EActionState::EAS_Attacking;}
}void ACharacter01::PlayAttackMontage()
{// 获取角色的骨架并检查是否存在动画实例以及攻击蒙太奇(Montage)UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();if (AnimInstance && AttackMontage){	// 在动画实例上播放攻击蒙太奇AnimInstance->Montage_Play(AttackMontage);// 生成一个随机数,选择攻击动作的不同部分const int32 Selection = FMath::RandRange(0, 1);FName SectionName = FName();// 根据随机数选择不同的攻击部分switch (Selection){case 0:SectionName = FName("Attack1");break;case 1:SectionName = FName("Attack2");break;default:break;}// 跳转到所选的攻击部分AnimInstance->Montage_JumpToSection(SectionName, AttackMontage);}
}

但是上边的方法只能攻击一次,使用动画通知来知道动画已经播放完了,在蒙太奇里边新建两个notify

新建一个攻击结束函数,将函数和变量都暴露给蓝图,在动画蓝图中

在动画蓝图中当动画结束时直接调用这个函数,这样我们就能多次攻击不卡顿

武器漂浮,走动不攻击

新建一个枚举类来判断武器是否被拿在手上,定义初始转态

UENUM(BlueprintType)
enum class EItemState : uint8
{EIS_UnOnHand UMETA(DisplayName="UnOnHand"),EIS_OnHand UMETA(DisplayName = "OnHand")
};

在tick函数里添加判断当物体不被拿起时漂浮,在回到武器cpp在equip的函数里将ItemState就设置完成了

// 每帧都会被调用
void Aitem::Tick(float DeltaTime)
{Super::Tick(DeltaTime);// 记录经过的总时间RunningTime += DeltaTime;//当物体不被拿起时漂浮if (ItemState == EItemState::EIS_UnOnHand){AddActorWorldOffset(FVector(0.f,0.f,TransformedSin()));}
}

走动不攻击只需要判断是否在攻击状态,如果在的话就不接收移动的值

挥剑声音、喘息声音

进入攻击的动画蓝图添加一个播放声音的notify,也可以在蒙太奇中放入,

为了更改声音,可以创建一个soundcue

在插件里打开MetaSound,新建一个

新建一个变量,修改type改为whoosh,使用随机函数来让时长和声音变大变小

创建一个人物的喘息声音,传入的声音是一个数组,选中10个声音,最后把两个声音都加入蒙太奇

脚步声和粒子效果

跟喘息声一样,导入18个声音文件进行制作,进入跑步动画,加上脚步和袋子碰撞的声音,并且从包里将粒子效果copy并且绑定左右脚。把跳跃等动作都加上音效

修改一下脚的位置

攻击时脚会挪开是因为ik——foot没有对应上脚的位置,所以要进行修改

将每个脚位置的transform给ik就可以改正

收剑,拿出剑

下载拿收剑和不拿剑待机的动画,导入重定向,新建蒙太奇。回到人物头文件新建进入条件,装备蒙太奇变量,播放函数

//能够卸下武器
bool CanDisarm();
bool Canarm();
void PlayEquipMontage(FName SectionName);UPROPERTY(EditDefaultsOnly, Category = Montages)
UAnimMontage* EquipMontage;

播放函数很简单,只需要判断实例存在,传入sectionname。

void ACharacter01::PlayEquipMontage(FName SectionName)
{// 获取角色的骨架并检查是否存在动画实例以及蒙太奇(Montage)UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();if (AnimInstance && EquipMontage){	// 在动画实例上播放蒙太奇AnimInstance->Montage_Play(EquipMontage);// 跳转到所选的攻击部分AnimInstance->Montage_JumpToSection(SectionName, EquipMontage);}
}

回到按键E的函数,简单修改,这是还应该添加一个武器状态,看他是不是被我们拿起来。这样才能装备和卸下,在重叠拿起时把这个变量设置重叠物,最后在人物蓝图里吧equipmontage设置为我们的装备蒙太奇。

void ACharacter01::EKeyPressed()
{	//当重叠的物体为武器类获取改物体AWeapon* OverlappingWeapon = Cast<AWeapon>(OverlappingItem);if (OverlappingWeapon){OverlappingWeapon->Equip(GetMesh(),FName("RightHandSocket"));CharacterState = ECharacterState::ECS_EquipedOneHandWeapon;}else{	//收起武器,并设置人物转态if(CanDisarm()){PlayEquipMontage(FName("Unequip"));CharacterState = ECharacterState::ECS_Unequiped;}//拿出武器else if (Canarm()){PlayEquipMontage(FName("Equip"));CharacterState = ECharacterState::ECS_EquipedOneHandWeapon;}}
}

完成后发现装备武器后还会卸下武器,排查后发现是蒙太奇里边没有断开动画连续播放了

让剑粘在背部

和放在手上一样,我们需要在背部也上一个socket,在spine05插入一个socket,插入剑的模型调整位置,差不多就行。在蒙太奇里边插入一个武器脱离手的通知notify。

将这段函数的上两句选中右键重构,可以拿出一个附加到socket的函数,会自动为我们创建函数并替换

void AWeapon::Equip(USceneComponent* InParent, FName InSocketName)
{	// 创建一个 FAttachmentTransformRules 对象,规定附着的规则。FAttachmentTransformRules TransformRules(EAttachmentRule::SnapToTarget, true);// 将武器的 ItemMesh 附着到InParent的 Mesh 上,并使用Socket作为附着点ItemMesh->AttachToComponent(InParent, TransformRules, InSocketName);ItemState = EItemState::EIS_OnHand;
}
void AWeapon::AttachMeshToSocket(USceneComponent* InParent, const FName& InSocketName)
{// 创建一个 FAttachmentTransformRules 对象,规定附着的规则。FAttachmentTransformRules TransformRules(EAttachmentRule::SnapToTarget, true);// 将武器的 ItemMesh 附着到InParent的 Mesh 上,并使用Socket作为附着点ItemMesh->AttachToComponent(InParent, TransformRules, InSocketName);
}

现在我们需要一个蓝图可读的函数来让notify执行Disarm函数(在人物cpp里)这样我们就可以把剑放在背部,拿起剑也一样

void ACharacter01::Disarm()
{if (EquippedWeapon){EquippedWeapon->AttachMeshToSocket(GetMesh(),FName("SpineSocket"));}
}

此时我们在移动的时候还能收剑,想要取消。添加一个动作状态正在装备就可以,同时还需要在动画结束时在添加一个notify来重置ActionState状态为未被占用

在移动里修改判断条件

装备武器的音效

使用metasound制作一个音效,然后使用代码来播放,对于不同的武器使用不同的声音。在武器头文件新建一个变量

// 武器装备时播放的音效
UPROPERTY(EditAnywhere, Category = "Weapon Properties")
USoundBase* EquipSound;void AWeapon::Equip(USceneComponent* InParent, FName InSocketName)
{// 调用 AttachMeshToSocket 函数将武器的 Mesh 附加到指定的骨骼插槽上AttachMeshToSocket(InParent, InSocketName);// 设置武器的状态为在手上ItemState = EItemState::EIS_OnHand;// 如果设置了装备音效,就在武器的位置播放音效if (EquipSound){UGameplayStatics::PlaySoundAtLocation(this, EquipSound, GetActorLocation());}
}

然后进入剑的蓝图为它设置单独的音效

此时装备武器后还按e还会发出声音,因为两个胶囊体一直在重叠,因此我们要在拿起武器后关闭它的重叠,在上边的代码里在加上下边这一行

if (Sphere)
{Sphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}

优化动画

在调试的过程中可以an“~”输入slomo 0.1,这样所有的东西都会按0.1秒来播放方便看,在动画蓝图总可以使用key来修改部分动画而不会影响整体。

首先找到要修改的开始和结尾,选定骨骼节点分别创建一个key,然后在中间位置调整骨骼节点的位置在添加一个就完成了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142045.shtml

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

相关文章

若依系统富文本框上传图片报错!

报错如下&#xff1a; 原因&#xff1a;如图&#xff0c;富文本路径中存在 / 字符&#xff0c;导致上传出错。 解决方案&#xff1a;将富文本框内容在前端进行加密&#xff0c;后端再解密。 前端&#xff1a; 安装 crypto-js 插件 npm install crypto-js 创建工具类 :在 sr…

使用MVS-GaN HEMT紧凑模型促进基于GaN的射频和高电压电路设计

标题&#xff1a;Facilitation of GaN-Based RF- and HV-Circuit Designs Using MVS-GaN HEMT Compact Model 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;19年&#xff09; 摘要—本文阐述了基于物理的紧凑器件模型在研究器件行为细微差异对电路和系统…

好心提醒下,幼师姐妹们要知道啊

幼师家人们在不在&#xff1f;在不在&#xff1f; 不会还有姐妹在自己写教案&#xff0c;写总结&#xff0c;写评语啥的吧&#xff0c;这个好东西真的要知道啊&#xff01;&#xff01; 只要输入关键词&#xff0c;马上就能得到你想要的内容&#xff0c;真的很强啊&#xff0…

Pytorch从零开始实战09

Pytorch从零开始实战——YOLOv5-Backbone模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-Backbone模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.…

【java学习—十四】Class类(2)

文章目录 1. Class类2. Class类的常用方法3. 实例化Class类对象&#xff08;四种方法&#xff09; 1. Class类 在 Object 类中定义了以下的方法&#xff0c;此方法将被所有子类继承&#xff1a; public final Class getClass() 以上的方法返回值的类型是一个 Class 类&#xf…

web3 React dapp进行事件订阅

好啊&#xff0c;上文web3 React Dapp书写订单 买入/取消操作 我们已经写好了 填充和取消订单 这就已经是非常大的突破了 但是 留下了一个问题 那就是 我们执行完之后 订单的数据没有直接更新 每次都需要我们手动刷新 才能看到结果 那么 今天我们就来看解决这个问题的事件订阅 …

android手机平板拓展电脑音频

&#xff08;1&#xff09;首先确保电脑上有声卡&#xff0c;就是电脑右下角小喇叭能调音量&#xff0c;不管电脑会不会响&#xff0c;如果小喇叭标记了个错误&#xff0c;说明没有声卡&#xff0c;安装图上的虚拟声卡软件。 &#xff08;2&#xff09;图上第一个PC免安装及局…

vscode launch.json

有时新的服务器进行调试时&#xff0c;需要设置调试的launch.json的结果 然后就可以打开一个launch.json 其内容如下 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid83…

JAVA 版小程序商城免费搭建 多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C产品概述

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

[单片机课程设计报告汇总] 单片机设计报告常用硬件元器件描述

[单片机课程设计必看] 单片机设计报告常用描述 硬件设计 AT89C51最小系统 AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS16位单片机&#xff0c;片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器&#xff0c;期间采用ATMEL公司的高…

数据结构—队列的实现

前言&#xff1a;上次我们已经学习了数据结构中一个重要的线性表—栈&#xff0c;那么我们这一次就来学习另外一个重要的线性表—队列。 目录&#xff1a; 一、 队列的概念 二、 队列的实现&#xff1a; 1.队列的创建 三、 队列的操作 1.初始化队列 2.队尾入队列 3.队头出队列…

CSRF和XSS漏洞结合实战案例

文章目录 CSRF和XSS漏洞结合实战案例实验原理实验步骤信息收集构造CSRF和XSS代码xss注入 CSRF和XSS漏洞结合实战案例 实验环境为csm 实验原理 攻击者利用JavaScript可以构造请求的功能在留言面板构造一个存储型xss注入&#xff0c;里面的内容为js请求。请求新添加用户&…

python matlplotlib/seaborn 绘制曲线的平均值标准差阴影图

1. seaborn 旧版本(0.8.1)中使用tsplot&#xff0c;新版本中使用lineplot 直线代表均值&#xff0c;阴影代表meanstd&#xff08;带有置信区间&#xff0c;参数ci&#xff09; import seaborn as sns import matplotlib.pyplot as plt import numpy as np import pandas as p…

11月14日星期二今日早报简报微语报早读

11月14日星期二&#xff0c;农历十月初二&#xff0c;早报微语早读。 1、江西南城县&#xff1a;限时发放购房补贴政策&#xff0c;三孩家庭每平方米最高补贴500元&#xff1b; 2、2023年中国内地电影市场累计票房突破500亿元&#xff1b; 3、市场监管总局&#xff1a;在全国…

Javaweb开发 利用servlet+jsp+jdbc+tomcat数据库实现登录功能

前言&#xff1a;很久没更新了&#xff0c;今天给大家分享一个Java web的小案例&#xff0c;是一个登录页面&#xff0c;利用Login控制类和JDBC连接数据库&#xff0c;并判断用户名密码是否正确&#xff0c;项目最终部署在Tomcat上。 先看效果 正文 一、前期工作 1.首先我们…

ubuntu上安装edge浏览器

1下载edge浏览器 官网下载 edge浏览器的linux版本可在上面的官网中寻找。 我选择的是Linux(.deb)。 2 安装 可在终端的edge安装包所在的路径下输入下面命令安装。 sudo dpkg -i edge安装包的名称.deb3 安装可能存在的问题 1dpkg:依赖关系问题使得edge-stable的配置工作不…

Docker的安装配置与使用

1、docker安装与启动 首先你要保证虚拟机所在的盘要有至少20G的空间&#xff0c;因为docker开容器很吃空间的&#xff0c;其次是已经安装了yum依赖 yum install -y epel-release yum install docker-io # 安装docker配置文件 /etc/sysconfig/docker chkconfig docker on # 加…

uniapp 小程序 身份证 和人脸视频拍摄

使用前提&#xff1a; 已经在微信公众平台的用户隐私协议&#xff0c;已经选择配置“摄像头&#xff0c;录像”等权限 开发背景&#xff1a;客户需要使用带有拍摄边框的摄像头 &#xff0c;微信小程序的方法无法支持&#xff0c;使用camera修改 身份证正反面&#xff1a; <…

【unity】网格描边方法

【unity】网格描边方法 介绍对模型四边网格的三种描边方法&#xff1a;包括纯Shader方法、创建网格方法和后处理方法。于增强场景中3D模型的轮廓&#xff0c;使其在视觉上更加突出和清晰。这种效果可以用于增强三维场景中的物体、角色或环境&#xff0c;使其在视觉上更加吸引人…

前端---CSS的盒模型

文章目录 什么是盒模型&#xff1f;设置边框设置内边距设置外边距块级元素水平居中 什么是盒模型&#xff1f; 页面上的每个HTML元素都是一个一个的“盒子”&#xff0c;这些盒子由&#xff1a;内容、内边距、边框、外边距组成。 我们可以和住的房子联系起来&#xff0c;更好…