动画蒙太奇,实现攻击动画

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.蓝图中

主角蓝图中蒙太奇设置为自己的蒙太奇

在蒙太奇动画中

在通知轨道中添加攻击停止按钮

 

 

 

 

 

 即蒙太奇播放完后会发送一个通知

该通知由以下接收(动画蓝图中)

 

 从角色来调用函数

 

 

 

posted @   ChioHiro  阅读(224)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示