UE4中动画通知的几种方式
发表于2018-01-10
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是一个包含两个轴的动画混合空间
