C++ Declared Event Dispatcher (Dynamic Multicast Delegate) & Blueprint Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C++ Declared Event Dispatcher (Dynamic Multicast Delegate) & Blueprint Problem

    Hi Leute,

    ich bin derzeit dabei einen Prototypen für ein Active Time Battle Kampfsystem zu erstellen und stoße gerade auf ein Problem...

    Ich habe ein BattleHUD (HUD Class) Blueprint was bei BeginPlay ein GetActorsOfClass macht bei dem ein "BattleManager" Actor (geschrieben in C++) gesucht wird und dann als reference im HUD Blueprint abgelegt wird.
    Die Battle Manager C++ Klasse macht im aller ersten Tick() ein Battle Setup was aus der GameInstance die BattleSettings ausließt und die dort enthaltenen Kämpfer ins Level spawned und dann ein Dynamic Multicast Delegate "OnNewActiveFighter" Broadcasted...
    Dies ist mit "BlueprintAssignable" makiert.
    Das BattleHUD Blueprint hat dieses Event über dem "+" Button unten rechts im Details Panel hinzugefügt von der Variable aus nur das Event wird niemals gecalled obwohl es gebroadcasted wird...
    Macht das Adden via "+" Button kein automagisches Binden oder was muss ich machen damit das funktioniert?

    BattleManager.h

    C-Quellcode

    1. #pragma once
    2. #include "pmc/PmcActor.h"
    3. #include "BattleManager.generated.h"
    4. class AFighter;
    5. DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnNewActiveFighter, AFighter*, fighter);
    6. UCLASS()
    7. class PMC_API ABattleManager : public APmcActor
    8. {
    9. GENERATED_BODY()
    10. public:
    11. UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Battle Manager")
    12. class ABattleHUD* battleHud;
    13. UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Battle Manager")
    14. TArray<AFighter*> fighters;
    15. UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Battle Manager")
    16. bool isInitialized;
    17. UPROPERTY(BlueprintAssignable, Category = "Battle Manager")
    18. FOnNewActiveFighter OnNewActiveFighter;
    19. UDataTable* fighterConfigDataTable;
    20. // Sets default values for this actor's properties
    21. ABattleManager();
    22. // Called when the game starts or when spawned
    23. virtual void BeginPlay() override;
    24. // Called every frame
    25. virtual void Tick( float DeltaSeconds ) override;
    26. UFUNCTION()
    27. void setupBattle();
    28. };
    Alles anzeigen


    BattleManager.cpp

    C-Quellcode

    1. #include "pmc.h"
    2. #include "Public/BattleManager.h"
    3. #include "PmcGameInstance.h"
    4. #include "Fighter.h"
    5. #include "PmcStatics.h"
    6. // Sets default values
    7. ABattleManager::ABattleManager()
    8. {
    9. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
    10. PrimaryActorTick.bCanEverTick = true;
    11. isInitialized = false;
    12. fighterConfigDataTable = UPmcStatics::getFighterConfigDataTable();
    13. }
    14. // Called when the game starts or when spawned
    15. void ABattleManager::BeginPlay()
    16. {
    17. Super::BeginPlay();
    18. }
    19. // Called every frame
    20. void ABattleManager::Tick( float DeltaTime )
    21. {
    22. Super::Tick( DeltaTime );
    23. if (!isInitialized)
    24. {
    25. setupBattle();
    26. isInitialized = true;
    27. }
    28. }
    29. void ABattleManager::setupBattle()
    30. {
    31. UE_LOG(LogTemp, Log, TEXT("BattleManager: Start Battle Setup..."));
    32. for (auto battleGroupDataItr = getGameInstance()->battleData.battleGroups.CreateIterator(); battleGroupDataItr; battleGroupDataItr++)
    33. {
    34. UE_LOG(LogTemp, Log, TEXT("BattleManager: Start Setup Battle Group."));
    35. for (auto fighterDataItr = (*battleGroupDataItr).fightersData.CreateIterator(); fighterDataItr; fighterDataItr++)
    36. {
    37. UE_LOG(LogTemp, Log, TEXT("BattleManager: Spawn Fighter (NPC: %s)..."), (*fighterDataItr).npc ? TEXT("true") : TEXT("false"));
    38. UClass* fighterClass = UPmcStatics::getFighterClassByRaceAndClass(fighterConfigDataTable, (*fighterDataItr).fighterRace, (*fighterDataItr).fighterClass);
    39. // TODO - Spawn at correct positions
    40. AFighter* fighter = GetWorld()->SpawnActorDeferred<AFighter>(fighterClass, FTransform(FVector(0)));
    41. fighter->fighterId = (*fighterDataItr).fighterId;
    42. fighter->fighterName = (*fighterDataItr).fighterName;
    43. fighter->attributes.constitution = 20; // TODO - Read from battle data instead of hardcoded
    44. // TODO - Add missing initialisations
    45. fighters.Add(fighter);
    46. fighter->FinishSpawning(FTransform(FVector(0))); // TODO - Use correct location
    47. // Call On New Active Fighter Event in All Listining Blueprints
    48. UE_LOG(LogTemp, Log, TEXT("%f: BattleManager Event Broadcast"), UGameplayStatics::GetRealTimeSeconds(GetWorld()));
    49. OnNewActiveFighter.Broadcast(fighter);
    50. }
    51. UE_LOG(LogTemp, Log, TEXT("BattleManager: End Battle Group Setup."));
    52. }
    53. UE_LOG(LogTemp, Log, TEXT("BattleManager: End Battle Setup!"));
    54. }
    Alles anzeigen


    Battle HUD Issue:


    Mehr hab ich auf C++ Seite nicht da ich dachte das Binden passiert im Blueprint über das "+"

    Weiß da jemand von euch was drüber?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von tom.coursow ()

Unreal®, Unreal Engine, the circle-U logo and the Powered by Unreal Engine logo are trademarks or registered trademarks of Epic Games, Inc. in the United States and elsewhere.