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是一个包含两个轴的动画混合空间