BETA

【UE4】AnimNotifyをC++で書く

投稿日:2018-10-24
最終更新:2019-01-17

AnimNotifyとは

アニメーションの特定のタイミングで○○する
みたいな事ゲーム開発では多いと思います
(例えば歩きモーションに合わせてコントローラーを振動させる等)
それを自分で作るにはAnimNotifyを継承したクラスを作成する必要があります
今回はアニメーションの特定のタイミングで画面に文字を出してみましょう

前提

  • Windows機
    • 他のOSでも出来るはずですが未検証です
  • Unreal Engine 4.20
    • これ以前でも可能ですが一部異なる可能性があります
    • 筆者は英語版ですが日本語版でもさほど変わらないと思います
  • Thirdperson Template (C++プロジェクト)
    • C++プロジェクトをビルドできる環境が必要です

C++クラスを作成する

まずはAnimNotifyを継承するクラスを作成します。
今回はPrintStringAnimNotifyという名前で作成します

Add New → New C++ Classを押しC++クラス作成画面に入ります

作成画面右上のShow All Classesを押し、AnimNotifyを選択しNextを押します

NameにはPrintStringAnimNotifyと名前を付けPublicに公開し、作成を押します

Notifyメソッドをオーバーライドする

AnimNotifyを継承するBPを作成したことがある人だと勘違いしがちなのですが、
C++ではReceived_NotifyではなくNotifyメソッドをオーバーライドします
Receive_NotifyもあるのですがBP向けに公開されているものなので(BlueprintImplementableEvent)C++では実装できません

// PrintStringAnimNotify.h  
#pragma once  
#include "CoreMinimal.h"  
#include "Animation/AnimNotifies/AnimNotify.h"  
#include "PrintStringAnimNotify.generated.h"  

UCLASS()  
class [モジュール名]_API UPrintStringAnimNotify : public UAnimNotify  
{  
    GENERATED_BODY()  

private:  
    void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) override;  

    UPROPERTY(EditAnywhere)  
    FString DebugMessage;  
};

続いて.cpp側も実装していきます

// PrintStringAnimNotify.cpp  

#include "PrintStringAnimNotify.h"  
#include "Engine/Engine.h"  

void UPrintStringAnimNotify::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation)  
{  
    if (GEngine)  
    {  
        GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, DebugMessage);  
    }  
}

これで実装完了です。
UE4エディタに戻って好きなアニメーションに通知をつけましょう…と言いたいところですがAnimNotifyはなぜかホットリロードで正常に反映されないので一度エディタを落とす必要があります。

作ったAnimNotifyを追加する

エディタを起動しなおしたら今回はThirdperson Templateに入っているThirdPersonJump_Startに通知を仕込んでみます
Notifiesのジャンプのはじめあたりを右クリックし、AddNotify→PrinStringAnimNotifyを押します

追加ができたら追加したAnimNotifyを選択すると詳細タブに項目が出てくるので今回はJumpStart!とでも入力します

追加が終わればプレイを押して実際にジャンプすると画面上に文字が出力すれば完了です

コードの解説

正直あまり解説するところがないのですが一応します

  • void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) override;
    • アニメーション通知のメソッドをオーバーライドします。BPではReceived_NotifyですがC++ではただのNotifyなことに注意です
  • UPROPERTY(EditAnywhere) FString DebugMessage;
    • 詳細タブでユーザーの文字入力を可能にします。
    • 今回はprivateで宣言しましたが用途によってはprotectedだったりpublicだったりするでしょう
  • GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, DebugMessage);
    • 実装部分です。画面上に指定された文字を表示します

最後に

AnimNotify、アクションゲームなどゲームによっては非常に多用する機能で
非常に便利なので是非皆さんもAnimNotify使ってみてください (ぶっちゃけこの程度の内容ならC++じゃなくてBPでよくね?)

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

UE4とかUnityとかC#とか

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう