エンジンソース的には
D:\Program Files\Epic Games\UE_5.3\Engine\Source\Runtime\Engine\Classes\Animation\AnimInstance.h
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
//中略
#include "Animation/AnimSubsystemInstance.h"
#include "Animation/AnimSync.h"
#include "Animation/AnimNotifies/AnimNotify.h"
#include "AnimInstance.generated.h"
// Post Compile Validation requires WITH_EDITOR
#define ANIMINST_PostCompileValidation WITH_EDITOR
struct FDisplayDebugManager;
class FDebugDisplayInfo;
class IAnimClassInterface;
class UAnimInstance;
//中略
struct FSmartNameMapping;
struct FAnimNode_LinkedAnimLayer;
struct FNodeDebugData;
enum class ETransitionRequestQueueMode : uint8;
enum class ETransitionRequestOverwriteMode : uint8;
class UAnimMontage;
typedef TArray<FTransform> FTransformArrayA2;
namespace UE::Anim
{
struct FHeapAttributeContainer;
using FSlotInertializationRequest = TPair<float, const UBlendProfile*>;
struct FCurveFilterSettings;
} // namespace UE::Anim
//中略
//デリゲートのパラメータもらうやつ
DECLARE_DELEGATE_OneParam(FOnMontageStarted, UAnimMontage*)
DECLARE_DELEGATE_TwoParams(FOnMontageEnded, UAnimMontage*, bool /*bInterrupted*/)
DECLARE_DELEGATE_TwoParams(FOnMontageBlendingOutStarted, UAnimMontage*, bool /*bInterrupted*/)
/**
* Delegate for when Montage がスタートした時
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMontageStartedMCDelegate, UAnimMontage*, Montage);
/**
* Delegate for when Montage が再生 completedの時, 中断されたかinterrupted or 終了したかfinished
* このモンタージュの重みは 0.f なので、出力ポーズへの寄与は停止します
*
* プロパティが完了していない場合は bInterrupted = true
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnMontageEndedMCDelegate, UAnimMontage*, Montage, bool, bInterrupted);
/**すべてのモンタージュインスタンスが終了したときに委任します。 */
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnAllMontageInstancesEndedMCDelegate);
/**
モンタージュがブレンドアウトを開始したタイミング(中断または終了)のデリゲート
* このモンタージュの DesiredWeight は 0.f になりますが、これは出力ポーズに引き続き影響します
*
* プロパティが終了していない場合は bInterrupted = true
*/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnMontageBlendingOutStartedMCDelegate, UAnimMontage*, Montage, bool, bInterrupted);
/** ネイティブコードがフックして追加の遷移ロジックを提供できるデリゲート */
DECLARE_DELEGATE_RetVal(bool, FCanTakeTransition);
/** ネイティブコードがフックして状態の開始/終了を処理できるデリゲート */
DECLARE_DELEGATE_ThreeParams(FOnGraphStateChanged, const struct FAnimNode_StateMachine& /*Machine*/, int32 /*PrevStateIndex*/, int32 /*NextStateIndex*/);
/** ユーザーがカスタムアニメーションカーブ値を挿入できるようにするデリゲート - 今のところは単一のみです。これを複数のデリゲートにして値を順番に取得する方法はわかりません。 */
DECLARE_DELEGATE_OneParam(FOnAddCustomAnimationCurves, UAnimInstance*)
/** 「PlayMontageNotify」および「PlayMontageNotifyWindow」によって呼び出されるデリゲート **/
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FPlayMontageAnimNotifyDelegate, FName, NotifyName, const FBranchingPointNotifyPayload&, BranchingPointPayload);
//中略
/** Helper struct to store a Queued Montage BlendingOut event. */
struct FQueuedMontageBlendingOutEvent
{
TObjectPtr<class UAnimMontage> Montage;
bool bInterrupted;
FOnMontageBlendingOutStarted Delegate;
FQueuedMontageBlendingOutEvent()
: bInterrupted(false)
{}
FQueuedMontageBlendingOutEvent(class UAnimMontage* InMontage, bool InbInterrupted, FOnMontageBlendingOutStarted InDelegate)
: Montage(InMontage)
, bInterrupted(InbInterrupted)
, Delegate(InDelegate)
{}
};
/** 以下長すぎるので省略 */
UPROPERTY(BlueprintAssignable)
FOnMontageStartedMCDelegate OnMontageStarted;
/** Called when a montage has ended, whether interrupted or finished*/
UPROPERTY(BlueprintAssignable)
FOnMontageEndedMCDelegate OnMontageEnded;
デリゲートするとき統一の呪文のパラメータもらうやつ
DECLARE_DELEGATE_OneParam(FOnMontageStarted, UAnimMontage) DECLARE_DELEGATE_TwoParams(FOnMontageEnded, UAnimMontage, bool /bInterrupted/)
DECLARE_DELEGATE_TwoParams(FOnMontageBlendingOutStarted, UAnimMontage, bool /bInterrupted*/)
Montage が再生 completedの時, 中断されたかinterrupted or 終了したかfinished
- モンタージュが中断または終了したときに委任する
- このモンタージュの重みは 0.f なので、出力ポーズへの寄与は停止します
- プロパティが完了していない場合は bInterrupted = true
/ DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnMontageEndedMCDelegate, UAnimMontage, Montage, bool, bInterrupted);
D:\Program Files\Epic Games\UE_5.3\Engine\Source\Runtime\Engine\Private\Animation\AnimInstance.cpp
//SET
void UAnimInstance::Montage_SetEndDelegate(FOnMontageEnded& InOnMontageEnded, UAnimMontage* Montage)
{
if (Montage)
{
FAnimMontageInstance* MontageInstance = GetActiveInstanceForMontage(Montage);
if (MontageInstance)
{
MontageInstance->OnMontageEnded = InOnMontageEnded;
}
}
else
{
// If no Montage reference, do it on all active ones.
for (int32 InstanceIndex = 0; InstanceIndex < MontageInstances.Num(); InstanceIndex++)
{
FAnimMontageInstance* MontageInstance = MontageInstances[InstanceIndex];
if (MontageInstance && MontageInstance->IsActive())
{
MontageInstance->OnMontageEnded = InOnMontageEnded;
}
}
}
}
//GET
FOnMontageEnded* UAnimInstance::Montage_GetEndedDelegate(UAnimMontage* Montage)
{
if (Montage)
{
FAnimMontageInstance* MontageInstance = GetActiveInstanceForMontage(Montage);
if (MontageInstance)
{
return &MontageInstance->OnMontageEnded;
}
}
else
{
// If no Montage reference, use first active one found.
for (int32 InstanceIndex = 0; InstanceIndex < MontageInstances.Num(); InstanceIndex++)
{
FAnimMontageInstance* MontageInstance = MontageInstances[InstanceIndex];
if (MontageInstance && MontageInstance->IsActive())
{
return &MontageInstance->OnMontageEnded;
}
}
}
return nullptr;
}
Montage_SetEndDelegate関数によってSETできるデリゲート
void UAnimInstance::Montage_SetEndDelegate(FOnMontageEnded& InOnMontageEnded, UAnimMontage* Montage)
Montage_GetEndedDelegate関数によってGETできるデリゲート
FOnMontageEnded* UAnimInstance::Montage_GetEndedDelegate(UAnimMontage* Montage)
エンジンソース終わり
使い方
AnimInstanceのイベントディスパッチャーで使うと Bind Event To On Montage Endとなる。
動いた
C++サンプル
.h
// ヘッダー内の関数宣言
void OnAnimationEnded(UAnimMontage* Montage, bool bInterrupted);
.cpp
// 実装内
// デリゲート FOnMontageEnded型のEndDelegate を宣言
FOnMontageEnded EndDelegate;
// バインド
EndDelegate.BindUObject(this, &UMyClass::OnAnimationEnded);
// 設定
MyAnimInstance->Montage_SetEndDelegate(EndDelegate);
参考URL
AnimInstance->OnMontageEnd に関数をバインドするにはどうすればよい
https://forums.unrealengine.com/t/how-can-i-bind-a-function-to-animinstance-onmontageend/290717/2