动画添加消息通知
创建一个基于AnimNotify的类
在父类中有个Notify函数用于执行,创建一个委托用于触发
DECLARE_MULTICAST_DELEGATE_OneParam(FOnNotifiedSignature,USkeletalMeshComponent*); virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) override; FOnNotifiedSignature OnNotified;
Broadcast:执行委托
void USTUEquipFinishiedAnimNotify::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation) { OnNotified.Broadcast(MeshComp); Super::Notify(MeshComp, Animation); }
在需要播放动画的类中,这里创建了一个动画蒙太奇,用于在蓝图中修改
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = "Animation") UAnimMontage* EquipAnimMontage;
获取到动画的所有通知Notifies,这是一个AnimNotifyEvent数组类型,NotifyEvent.Notufy获取通知,强制转换为需要的类,然后绑定委托
void USTUWeaponComponent::InitAnimation() { if (!EquipAnimMontage) { return; } //获取蒙太奇的所有通知Notify TArray<FAnimNotifyEvent> NotifyEvents = EquipAnimMontage->Notifies; for (FAnimNotifyEvent NotifyEvent : NotifyEvents) { USTUEquipFinishiedAnimNotify* EquipFinishiedNotify = Cast<USTUEquipFinishiedAnimNotify>(NotifyEvent.Notify); if (EquipFinishiedNotify) { EquipFinishiedNotify->OnNotified.AddUObject(this, &USTUWeaponComponent::OnEquipFinishied); break; } } } void USTUWeaponComponent::OnEquipFinishied(USkeletalMeshComponent* MeshComponent) { ACharacter* Character = Cast<ACharacter>(GetOwner()); if (Character && Character->GetMesh() == MeshComponent) { UE_LOG(LogTemp, Display, TEXT("Equip Finishied")); } }
在蓝图中添加这个通知就行