动画蒙太奇,实现攻击动画
1.创建动画蒙太奇(学习笔记)
将攻击动画移动到里面
创建新的片段实现分开播放
动画蓝图中将最高级的状态机连接插槽
2.MyCharacter.h中
添加以下代码
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) class UAnimaMontage* AnimMontage; //增加一个蒙太奇对象 bool bAttacking; bool bClicking; //判断是否按下鼠标 UFUNCTION() void OnClickBegin(); //按下键 UFUNCTION() void OnClickEnd(); //抬起键 void AttackBegine(); //攻击开始 UFUNCTION(BlueprintCallable) //蓝图调用攻击结束(代码中不易实现) void AttackEnd();
3.Mycharacter.cpp中
添加头文件
#include "Components/SkeletalMeshComponent.h" //骨架网格图文件 #include "Animation/AnimInstance.h" //获取动画实例
在函数void AMyCharacter::MoveForward(float Value)
void AMyCharacter::MoveRight(float Value)
中添加
&&!bAttacking; //避免攻击时移动形成滑步
void AMyCharacter::OnInteract()函数中添加
if (!bAttacking); //攻击时静止捡武器
如
void AMyCharacter::MoveForward(float Value) { if (Controller && Value&& !bAttacking) { //bAttacking避免攻击时移动形成滑步 const FRotator Rotation = Controller->GetControlRotation();//获取控制器旋转 const FRotator YawRotation(0, Rotation.Yaw, 0);//以获取的旋转作为左右旋转的值 //旋转矩阵,获得x轴向的单位向量 旋转矩阵是描述一个旋转过后的空间并获取旋转过后的空间的X方向将其返回 const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);//前方向 AddMovementInput(Direction, Value);//将前方向加入到运动组件(量为value) } }
攻击开始函数
void AMyCharacter::AttackBegin() { bAttacking = true; UAnimInstance* Instance = GetMesh()->GetAnimInstance(); //拿到动画实例 //!Instance->Montage_IsPlaying(AnimMontage)动画没有在播放 if (AnimMontage && Instance && !Instance->Montage_IsPlaying(AnimMontage)) { Instance->Montage_Play(AnimMontage);//播放攻击动作 switch (FMath::RandRange((int32)1, 2)) { case 1: Instance->Montage_JumpToSection(FName("Attack1"), AnimMontage); break; case 2: Instance->Montage_JumpToSection(FName("Attack2"), AnimMontage); break; break; //Instance->Montage_JumpToSection(FName("Attack1"), AnimMontage); //播放第一个攻击动作 } } }
攻击结束
void AMyCharacter::AttackEnd() { bAttacking = false; // 鼠标还是按着的状态,那么就继续攻击 if (bClicking && EquiqedWeapon) { AttackBegin(); } }
鼠标按下,开始调用攻击函数
void AMyCharacter::OnClickBegin() //按下鼠标 { bClicking = true; if (!bAttacking && EquiqedWeapon) { AttackBegin(); } }
松开
void AMyCharacter::OnClickEnd() { bClicking = false; }
SetupPlayerInputComponent 绑定按键函数中
// 攻击动作 按下鼠标键 PlayerInputComponent->BindAction("Click", IE_Pressed, this, &AMyCharacter::OnClickBegin); PlayerInputComponent->BindAction("Click", IE_Released, this, &AMyCharacter::OnClickEnd);
4.蓝图中
主角蓝图中蒙太奇设置为自己的蒙太奇
在蒙太奇动画中
在通知轨道中添加攻击停止按钮
即蒙太奇播放完后会发送一个通知
该通知由以下接收(动画蓝图中)
从角色来调用函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?