ue4中动画通知的几种方式

来源:互联网 发布:闪电分期go淘宝商铺 编辑:程序博客网 时间:2024/06/07 06:45

animation blueprint中的几种notify,神马通知碰撞开启关闭的东东都可以使用notify


直接在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;};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

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


0 0
原创粉丝点击