Now I’m trying to refactoring about Character and AnimInstance.
Main Purpose is Set Mesh and Montage in BP like this.
After Refactoring the code, I got a runtime error on bind function to delegate and editor is crashed.
LimbusCharacterBase.cpp
#include "LimbusCharacterBase.h"
#include "LimbusAnimInstanceBase.h"
#include "Delegate.h"
#include "Engine.h"
#include "LimbusCharacterState.h"
// Sets default values
ALimbusCharacterBase::ALimbusCharacterBase()
{
....
void ALimbusCharacterBase::PostInitializeComponents(){
Super::PostInitializeComponents();
LimbusAnim = Cast<ULimbusAnimInstanceBase>(GetMesh()->GetAnimInstance());
LimbusAnim->OnMontageEnded.AddDynamic(this, &ALimbusCharacterBase::OnAttackMontageEnded);
//Error occur on below line
LimbusAnim->OnNextAttackCheck.AddUObject(this, &ALimbusCharacterBase::OnComboAttackCheck);
LimbusAnim->OnAttackHitCheck.AddUObject(this, &ALimbusCharacterBase::AttackCheck);
}
....
void ALimbusCharacterBase::OnAttackMontageEnded(UAnimMontage * Montage, bool bInterrupted){
GEngine->AddOnScreenDebugMessage(-1, 0.5f, FColor::Red, TEXT("OnAttackMontageEnded"));
UE_LOG(LogTemp, Warning, TEXT("OnAttackMontageEnded"));
isAttacking = false;
AttackEndComboState();
}
void ALimbusCharacterBase::OnComboAttackCheck(){
GEngine->AddOnScreenDebugMessage(-1, 0.5f, FColor::Red, TEXT("OnComboAttackCheck"));
UE_LOG(LogTemp, Warning, TEXT("OnComboAttackCheck"));
canNextCombo = false;
if (isComboInputOn) {
AttackStartComboState();
LimbusAnim->JumpToMontageSection(AttackMontage, currentCombo);
}
}
void ALimbusCharacterBase::AttackCheck(){
GEngine->AddOnScreenDebugMessage(-1, 0.5f, FColor::Red, TEXT("AttackCheck"));
UE_LOG(LogTemp, Warning, TEXT("AttackCheck"));
FHitResult HitResult;
FVector StartLocation = GetActorLocation();
FVector EndLocation = StartLocation + (Camera->GetForwardVector() * 75.0f);
FCollisionQueryParams Params(NAME_None, false, this);
bool bResult = GetWorld()->SweepSingleByChannel(HitResult, StartLocation, EndLocation, FQuat::Identity, ECollisionChannel::ECC_GameTraceChannel2, FCollisionShape::MakeSphere(75.0f), Params);
if (bResult) {
if (HitResult.Actor.IsValid()) {
UE_LOG(LogTemp, Warning, TEXT("Hit!!"));
FDamageEvent DamageEvent;
HitResult.Actor->TakeDamage(getDamage(), DamageEvent, GetController(), this);
}
}
}
}
LimbusAnimInstanceBase.h
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "ConstructorHelpers.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Engine/Classes/GameFramework/Actor.h"
#include "Engine/Classes/Animation/AnimMontage.h"
#include "Delegates/Delegate.h"
#include "LimbusAnimInstanceBase.generated.h"
DECLARE_MULTICAST_DELEGATE(FOnNextAttackCheckDelegate);
DECLARE_MULTICAST_DELEGATE(FOnAttackHitCheckDelegate);
UCLASS()
class LIMBUS_API ULimbusAnimInstanceBase : public UAnimInstance{
GENERATED_BODY()
public:
.....
FOnNextAttackCheckDelegate OnNextAttackCheck;
FOnAttackHitCheckDelegate OnAttackHitCheck;
.....
}
Full crash report ishere
Unhandled exception
UE4Editor_Limbus_1826!TMulticastScriptDelegate<FWeakObjectPtr>::Add() [e:\epic games\ue_4.22\engine\source\runtime\core\public\uobject\scriptdelegates.h:324]
UE4Editor_Limbus_1826!ALimbusCharacterBase::PostInitializeComponents() [g:\project\limbus\source\limbus\private\character\limbuscharacterbase.cpp:97]
UE4Editor_Engine!AActor::PostActorConstruction() [d:\build\++ue4\sync\engine\source\runtime\engine\private\actor.cpp:3173]
UE4Editor_Engine!AActor::FinishSpawning() [d:\build\++ue4\sync\engine\source\runtime\engine\private\actor.cpp:3099]
UE4Editor_Engine!AActor::PostSpawnInitialize() [d:\build\++ue4\sync\engine\source\runtime\engine\private\actor.cpp:3041]
UE4Editor_Engine!UWorld::SpawnActor() [d:\build\++ue4\sync\engine\source\runtime\engine\private\levelactor.cpp:478]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnAtTransform_Implementation() [d:\build\++ue4\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1180]
UE4Editor_Engine!AGameModeBase::execSpawnDefaultPawnAtTransform() [d:\build\++ue4\sync\engine\source\runtime\engine\classes\gameframework\gamemodebase.h:48]
UE4Editor_CoreUObject!UFunction::Invoke() [d:\build\++ue4\sync\engine\source\runtime\coreuobject\private\uobject\class.cpp:4643]
UE4Editor_CoreUObject!UObject::ProcessEvent() [d:\build\++ue4\sync\engine\source\runtime\coreuobject\private\uobject\scriptcore.cpp:1464]
UE4Editor_Engine!AActor::ProcessEvent() [d:\build\++ue4\sync\engine\source\runtime\engine\private\actor.cpp:769]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnAtTransform() [d:\build\++ue4\sync\engine\intermediate\build\win64\ue4editor\inc\engine\gamemodebase.gen.cpp:187]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnFor_Implementation() [d:\build\++ue4\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1172]
UE4Editor_Engine!AGameModeBase::execSpawnDefaultPawnFor() [d:\build\++ue4\sync\engine\source\runtime\engine\classes\gameframework\gamemodebase.h:48]
UE4Editor_CoreUObject!UFunction::Invoke() [d:\build\++ue4\sync\engine\source\runtime\coreuobject\private\uobject\class.cpp:4643]
UE4Editor_CoreUObject!UObject::ProcessEvent() [d:\build\++ue4\sync\engine\source\runtime\coreuobject\private\uobject\scriptcore.cpp:1464]
UE4Editor_Engine!AActor::ProcessEvent() [d:\build\++ue4\sync\engine\source\runtime\engine\private\actor.cpp:769]
UE4Editor_Engine!AGameModeBase::SpawnDefaultPawnFor() [d:\build\++ue4\sync\engine\intermediate\build\win64\ue4editor\inc\engine\gamemodebase.gen.cpp:196]
UE4Editor_Engine!AGameModeBase::RestartPlayerAtPlayerStart() [d:\build\++ue4\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1244]
UE4Editor_Engine!AGameModeBase::RestartPlayer() [d:\build\++ue4\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1211]
UE4Editor_Engine!AGameModeBase::HandleStartingNewPlayer_Implementation() [d:\build\++ue4\sync\engine\source\runtime\engine\private\gamemodebase.cpp:1025]
UE4Editor_Engine!AGameModeBase::execHandleStartingNewPlayer() [d:\build\++ue4\sync\engine\source\runtime\engine\classes\gameframework\gamemodebase.h:48]
UE4Editor_CoreUObject!UFunction::Invoke() [d:\build\++ue4\sync\engine\source\runtime\coreuobject\private\uobject\class.cpp:4643]
UE4Editor_CoreUObject!UObject::ProcessEvent() [d:\build\++ue4\sync\engine\source\runtime\coreuobject\private\uobject\scriptcore.cpp:1464]
UE4Editor_Engine!AActor::ProcessEvent() [d:\build\++ue4\sync\engine\source\runtime\engine\private\actor.cpp:769]
UE4Editor_Engine!AGameModeBase::HandleStartingNewPlayer() [d:\build\++ue4\sync\engine\intermediate\build\win64\ue4editor\inc\engine\gamemodebase.gen.cpp:102]
UE4Editor_Engine!UWorld::SpawnPlayActor() [d:\build\++ue4\sync\engine\source\runtime\engine\private\levelactor.cpp:774]
UE4Editor_Engine!ULocalPlayer::SpawnPlayActor() [d:\build\++ue4\sync\engine\source\runtime\engine\private\localplayer.cpp:285]
UE4Editor_Engine!UGameInstance::StartPlayInEditorGameInstance() [d:\build\++ue4\sync\engine\source\runtime\engine\private\gameinstance.cpp:387]
UE4Editor_UnrealEd!UEditorEngine::CreatePIEGameInstance() [d:\build\++ue4\sync\engine\source\editor\unrealed\private\playlevel.cpp:3341]
UE4Editor_UnrealEd!UEditorEngine::PlayInEditor() [d:\build\++ue4\sync\engine\source\editor\unrealed\private\playlevel.cpp:2466]
UE4Editor_UnrealEd!UEditorEngine::StartQueuedPlayMapRequest() [d:\build\++ue4\sync\engine\source\editor\unrealed\private\playlevel.cpp:1280]
UE4Editor_UnrealEd!UEditorEngine::Tick() [d:\build\++ue4\sync\engine\source\editor\unrealed\private\editorengine.cpp:1532]
UE4Editor_UnrealEd!UUnrealEdEngine::Tick() [d:\build\++ue4\sync\engine\source\editor\unrealed\private\unrealedengine.cpp:403]
UE4Editor!FEngineLoop::Tick() [d:\build\++ue4\sync\engine\source\runtime\launch\private\launchengineloop.cpp:3967]
UE4Editor!GuardedMain() [d:\build\++ue4\sync\engine\source\runtime\launch\private\launch.cpp:168]
UE4Editor!GuardedMainWrapper() [d:\build\++ue4\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:145]
UE4Editor!WinMain() [d:\build\++ue4\sync\engine\source\runtime\launch\private\windows\launchwindows.cpp:275]
UE4Editor!__scrt_common_main_seh() [d:\agent\_work\3\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
kernel32
ntdll
I cannot find the reason of this error.
Is there something wrong or do I miss something?