ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ue4中动画通知的几种方式

2021-11-15 01:31:07  阅读:245  来源: 互联网

标签:动画 character MyAnimInstance 几种 AnimNotify mOwnerChar ue4 include UMyAnimInstance


原创:蝶泳奈何桥

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

1、简单的通知(blueprint)

直接在sequence or montage中new个Event

 

然后在graph中接收。

 

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

首先,animation bp必须是继承自定义的AnimInstance

 

然后新建两个通知AnimNotify_Begin和AnimNotify_End
方法的命名规则必须是AnimNotify_XXX,因为引擎里的代码就是这样匹配的

 

完整代码
MyAnimInstance.h

完整代码
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

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个bp继承MyAnimInstance,然后动画蓝图再继承这个bp,这样扩展性好了。

 

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

 

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

 

 然后添加到animation sequence or montage中

 

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

 可以重写4个方法

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

 

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

 

标签:动画,character,MyAnimInstance,几种,AnimNotify,mOwnerChar,ue4,include,UMyAnimInstance
来源: https://www.cnblogs.com/kt007/p/15554244.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有