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
#pragma once
#include "pmc/PmcActor.h"
#include "BattleManager.generated.h"
class AFighter;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnNewActiveFighter, AFighter*, fighter);
UCLASS()
class PMC_API ABattleManager : public APmcActor
{
GENERATED_BODY()
public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Battle Manager")
class ABattleHUD* battleHud;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Battle Manager")
TArray<AFighter*> fighters;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Battle Manager")
bool isInitialized;
UPROPERTY(BlueprintAssignable, Category = "Battle Manager")
FOnNewActiveFighter OnNewActiveFighter;
UDataTable* fighterConfigDataTable;
// Sets default values for this actor's properties
ABattleManager();
// Called when the game starts or when spawned
virtual void BeginPlay() override;
// Called every frame
virtual void Tick( float DeltaSeconds ) override;
UFUNCTION()
void setupBattle();
};
Alles anzeigen
BattleManager.cpp
#include "pmc.h"#include "Public/BattleManager.h"#include "PmcGameInstance.h"#include "Fighter.h"#include "PmcStatics.h"// Sets default valuesABattleManager::ABattleManager(){ // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; isInitialized = false; fighterConfigDataTable = UPmcStatics::getFighterConfigDataTable();}// Called when the game starts or when spawnedvoid ABattleManager::BeginPlay(){ Super::BeginPlay();}// Called every framevoid ABattleManager::Tick( float DeltaTime ){ Super::Tick( DeltaTime ); if (!isInitialized) { setupBattle(); isInitialized = true; }}void ABattleManager::setupBattle(){ UE_LOG(LogTemp, Log, TEXT("BattleManager: Start Battle Setup...")); for (auto battleGroupDataItr = getGameInstance()->battleData.battleGroups.CreateIterator(); battleGroupDataItr; battleGroupDataItr++) { UE_LOG(LogTemp, Log, TEXT("BattleManager: Start Setup Battle Group.")); for (auto fighterDataItr = (*battleGroupDataItr).fightersData.CreateIterator(); fighterDataItr; fighterDataItr++) { UE_LOG(LogTemp, Log, TEXT("BattleManager: Spawn Fighter (NPC: %s)..."), (*fighterDataItr).npc ? TEXT("true") : TEXT("false")); UClass* fighterClass = UPmcStatics::getFighterClassByRaceAndClass(fighterConfigDataTable, (*fighterDataItr).fighterRace, (*fighterDataItr).fighterClass); // TODO - Spawn at correct positions AFighter* fighter = GetWorld()->SpawnActorDeferred<AFighter>(fighterClass, FTransform(FVector(0))); fighter->fighterId = (*fighterDataItr).fighterId; fighter->fighterName = (*fighterDataItr).fighterName; fighter->attributes.constitution = 20; // TODO - Read from battle data instead of hardcoded // TODO - Add missing initialisations fighters.Add(fighter); fighter->FinishSpawning(FTransform(FVector(0))); // TODO - Use correct location // Call On New Active Fighter Event in All Listining Blueprints UE_LOG(LogTemp, Log, TEXT("%f: BattleManager Event Broadcast"), UGameplayStatics::GetRealTimeSeconds(GetWorld())); OnNewActiveFighter.Broadcast(fighter); } UE_LOG(LogTemp, Log, TEXT("BattleManager: End Battle Group Setup.")); } UE_LOG(LogTemp, Log, TEXT("BattleManager: End Battle Setup!"));}
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?