UE4中动画通知的几种方式

发表于2018-01-10
评论0 8.2k浏览
UE4的动画通知和UE3的通知其实在本质上是一样的,但是在UE4 更多的时候使用BP进行了封装,不想UE3的时候直接在Pawn的代码中直接调用。下面就给大家介绍四种UE4中动画通知方式,一起看看这些方式的具体用法吧。

1、直接在sequence or montage中new个Event

然后在graph中接收。

2、简单的通知(c++)

首先,animation bp必须是继承自定义的AnimInstance
然后新建两个通知AnimNotify_Begin和AnimNotify_End

方法的命名规则必须是AnimNotify_XXX,因为引擎里的代码就是这样匹配的

完整代码
MyAnimInstance.h
#pragma once
#include "Animation/AnimInstance.h"
#include "MyAnimInstance.generated.h"
/**
 * 
 */
UCLASS()
class MYSLATE_API UMyAnimInstance : public UAnimInstance
{
    GENERATED_BODY()
public:
    UMyAnimInstance();
    UFUNCTION(BlueprintCallable, Category = "MyAnim")
        bool IsMoving();
    UFUNCTION(BlueprintCallable, Category = "MyAnim")
        ACharacter* GetOwnerChar();
    UFUNCTION(BlueprintCallable, Category = "MyAnim")
        void AnimNotify_Begin(UAnimNotify* Notify);
    UFUNCTION(BlueprintCallable, Category = "MyAnim")
        void AnimNotify_End(UAnimNotify* Notify);
private:
    ACharacter* mOwnerChar;
};

MyAnimInstance.cpp
#include "MySlate.h"
#include "MyAnimInstance.h"
#include "Engine.h"
#include "MyChar.h"
UMyAnimInstance::UMyAnimInstance()
{
    mOwnerChar = nullptr;
}
bool UMyAnimInstance::IsMoving()
{
    ACharacter* character = GetOwnerChar();
    if (!character)
        return false;
    float wallSpeed = FVector::DotProduct(character->GetVelocity(), character->GetActorRotation().Vector());
    return wallSpeed > 0.f ? true : false;
}
ACharacter* UMyAnimInstance::GetOwnerChar()
{
    if (!mOwnerChar)
    {
        APawn* owner = TryGetPawnOwner();
        mOwnerChar = owner ? Cast<ACharacter>(owner) : nullptr;
    }
    return mOwnerChar;
}
void UMyAnimInstance::AnimNotify_Begin(UAnimNotify * Notify)
{
    AMyChar* mychar = Cast<AMyChar>(GetOwnerChar());
    if (mychar)
    {
        FString str = FString::Printf(TEXT("--- AnimNotify_Begin - %d"), mychar->mHealth);
        GEngine->AddOnScreenDebugMessage(0, 5.0f, FColor::Green, str);
    }
}
void UMyAnimInstance::AnimNotify_End(UAnimNotify * Notify)
{
    FString str = FString::Printf(TEXT("--- AnimNotify_End"));
    GEngine->AddOnScreenDebugMessage(0, 5.0f, FColor::Yellow, str);
}
蓝图中直接new一个notify就ok了,逻辑都在c++中做。

当然,你可以new个bp继承MyAnimInstance,然后动画蓝图再继承这个bp,这样扩展性好了。

3、单独起个AnimNotify类(blueprint,c++自己去转换)

可以重写两个方法,和其一些变量

然后添加到animation sequence or montage中

4、(最灵活)单独起个AnimNotifyState类(blueprint,c++自己去转换)

可以重写4个方法

然后添加到animation sequence or montage中,可以控制通知长度,也就是tick

其实看下源码就可以知道,里面这些东西是怎么调用的

UE4的动画通知和UE3的通知其实在本质上是一样的,但是在UE4 更多的时候使用BP进行了封装,不想UE3的时候直接在Pawn的代码中直接调用。

UE4允许在每个动画的时间帧上添加我们需要执行动画通知。

UE4的动画通知主要分为两类:
Notify和Notify State.

下面简单的比较比较一下两种通知不一样的地方。

Notify,属于单帧的概念。什么是单帧呢?就是角色动画上的一帧,没有时间段的概念。比如说在这个动画执行到1/4的地方播放一个声音,我们就可以Notify。

Notify State,属于时间段的概念。比如我们的游戏中有一个怪物,这个怪物在出生的时候就处于待机状态,不断的摇头晃脑。和古代私塾的老师很像!^_^!我们假定他的待机动画就是一个,出生后一直循环这个待机动画。当这个怪物在待机动画的0-1/4这段时间内,给它重重的一拳,它会打飞!在其余时间内,不管玩家怎么打,它都像不倒翁一样。
这里就可以使用Notify State进行处理了。

Notify State 它有三个通知的函数:
Notify Start: 这个通知序列刚进入时调用
NotifyEnd:  这个通知序列结束时调用
NotifyTick :在这个通知执行过程中每Tick都会调用的函数。这个可以理解为不断回调的函数或者更新函数。

BlendSpace和BlendSpaceID的却别:
BlendSpaceID 只有一个轴的动画混合空间,这而BlendSpace是一个包含两个轴的动画混合空间

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引