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>();
}