Error Encountered When Using Delegates Between Subsystems

Hi guys,

I want to use delegates by calling one Subsystem from another Subsystem. However, I am getting the following error. If i wait for a while during debugging, the error disappears, but the event still doesn’t get called. I am able to assign this delegate on the Blueprint side, but I am getting an error when trying to do this in code. What do you think I am doing wrong?

Exception: Exception 0x80000003 encountered at address 0x7ffc2e90843c

Exception line :

	networkSubSystem->networkEventHandler->OnLoginSuccess.AddDynamic(this, &UMyGameStateSubsystem::handleNetworkLoginSuccess);

and the code :



MyGameStateSubsystem.cpp

void UMyGameStateSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
	Super::Initialize(Collection);
	Collection.InitializeDependency(UMyNetworkWorldSubsystem::StaticClass());
	this->networkSubSystem = GetWorld()->GetGameInstance()->GetSubsystem<UMyNetworkWorldSubsystem>();

	if(networkSubSystem)
	{
		if(networkSubSystem->networkEventHandler)
		{
	EXCEPTION->		networkSubSystem->networkEventHandler->OnLoginSuccess.AddDynamic(this, &UMyGameStateSubsystem::handleNetworkLoginSuccess);
			networkSubSystem->networkEventHandler->OnMetaDataChanced.AddDynamic(this, &UMyGameStateSubsystem::handleMetaDataChanced);
			networkSubSystem->networkEventHandler->OnCharacterDataChanced.AddDynamic(this, &UMyGameStateSubsystem::handleCharacterDataChanced);
		}
	}
}

MyGameStateSubsystem.h


UCLASS()
class MYGAME_API UMyGameStateSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
public:
	
	void handleMetaDataChanced(const FGrpcMyMetaDataChancedEvent& metaDataChanged);
	void handleNetworkLoginSuccess(const FGrpcMyLoginEvent& loginSuccess);
	void handleCharacterDataChanced(const FGrpcMyCharacterDataChancedEvent& characterDataChanced);
	
protected:
	UMyNetworkWorldSubsystem* networkSubSystem;

	virtual void Initialize(FSubsystemCollectionBase& Collection) override;
	virtual void Deinitialize() override;
};





UMyNetworkEventHandler.h

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCharacterDataChanced, const FGrpcMyCharacterDataChancedEvent&, characterDataChanced); 
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnMetaDataChanced, const FGrpcMyMetaDataChancedEvent&, metaDataChanced); 
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnLoginSuccess, const FGrpcMyLoginEvent&, loginSuccess);


UCLASS(Blueprintable, BlueprintType,  meta=(BlueprintSpawnableComponent))
class MYGAME_API UMyNetworkEventHandler : public UObject
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintAssignable, Category = "My|Network|Events", meta = (DisplayName = "OnCharacterDataChanced"))
	FOnCharacterDataChanced OnCharacterDataChanced ;
	UPROPERTY(BlueprintAssignable, Category = "My|Network|Events", meta = (DisplayName = "OnMetaDataChanced"))
	FOnMetaDataChanced OnMetaDataChanced ;
	UPROPERTY(BlueprintAssignable, Category = "My|Network|Events", meta = (DisplayName = "OnLoginSuccess"))
	FOnLoginSuccess OnLoginSuccess ;
};



UMyNetworkWorldSubsystem.h


UCLASS()
class WEBSOCKETSPROTO_API UMyNetworkWorldSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()

public:
	UPROPERTY(BlueprintReadOnly, Category = "My|Network|Events", meta = (DisplayName = "MyNetworkEventHandler"))
	TObjectPtr<UMyNetworkEventHandler> networkEventHandler;

protected:
	virtual void Initialize(FSubsystemCollectionBase& Collection) override;
	
	virtual void Deinitialize() override;
};

UMyNetworkWorldSubsystem.cpp

void UMyNetworkWorldSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
	Super::Initialize(Collection);
	this->networkEventHandler = NewObject<UMyNetworkEventHandler>();
}

Finally I found the problem.

Adding the UFUNCTION macro to the delegated function resolved the situation.

Unfortunately, the nature of CPP and UE does not help when detecting a problem. It takes much less time to solve similar problems in high-level APIs.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.