2017-03-06 3 views
1

Ich schreibe ein Multiplayer-Spiel in Unreal Engine 4.15.0 und es funktioniert fast außer für eine verdammte Codezeile, die ich nicht herausfinden kann, ist das Verhalten. Das Problem ist, dass ich einen OnlinePawn Blueprint habe, der von einer C++ Basisklasse AOnlinePawn erbt. Immer wenn ein Spieler dem Match beitritt, spawne ich diesen Blueprint und wirf ihn in ein Array, das ich ständig aktualisiere.Unreal Engine C++ SpawnActor Cast

Das Problem ist, dass der folgende Code, der versucht, AActor * von der Funktion zu AOnlinePawn * umgewandelt wird, fehlschlägt und null zurückgibt, es ist ein Umwandlungsproblem, da es tatsächlich erzeugt wird.

Die Besetzung:

playersInstances[i] = Cast<AOnlinePawn>(GetWorld()->SpawnActor(OnlinePlayer->GeneratedClass, &position, &rotator)); 

Der Bauplan Referenz:

static ConstructorHelpers::FObjectFinder<UBlueprint> OnlinePlayerBP(TEXT("Blueprint'/Game/Blueprints/OnlinePawn.OnlinePawn'")); 
OnlinePlayer = OnlinePlayerBP.Object; 

The Blueprint Beschreibung, Angabe der übergeordneten Klasse:

The Blueprint description, stating the parent class.

Also, was ist das Problem? Ich kann meinen Workflow trotzdem verbessern. Es gibt einen Workaround?

Antwort

2

Ich denke, Ihre Besetzung Linie ist nicht korrekt. SpawnActor ist eine Template-Funktion, die Sie nicht manuell so umwandeln dürfen. Stattdessen sollten Sie ihm einfach den Typ geben, den Sie verwenden möchten. Probieren Sie es wie folgt aus:

AOnlinePawn* NewActor = GetWorld()->SpawnActor<AOnlinePawn>(GetClass(), &position, &rotator); 

EDIT:

Sie sind willkommen. Wenn Sie also einen Blueprint in Ihrem Code referenzieren möchten, können Sie entweder die Konstruktorhelfer oder den Klassenfinder verwenden.

static ConstructorHelpers::FObjectFinder<UBlueprint> onlineSpawnBP(TEXT("Blueprint'/Game/FirstPersonCPP/Blueprints/OnlineSpawn'")); //replace with the right path to your blueprint in your project 
    if (onlineSpawnBP) 
    { 
     AOnlinePawn* NewActor = GetWorld()->SpawnActor<AOnlinePawn>(GetClass(), &position, &rotator); 
    } 
+0

Nach der docs gibt es [Nicht-Template-Versionen der Funktion] (https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UWorld/SpawnActor/6/ index.html) aber auch das Beispiel dort verwendet die Vorlagenversion, also sieht es so aus, als wäre die empfohlene Methode – UnholySheep

+0

Es gibt nur noch eine Sache, diese Zeile befindet sich nicht im Klassenraum von AOnlinePawn, also wird GetClass() nicht funktionieren (selbst wenn es so wäre, möchte ich den Blueprint hervorbringen, der AOnlinePawn und nicht die AOnlinePawn selbst erbt. Wie kann ich einen Verweis auf die OnlinePawn-Blueprint-Klasse erhalten, die dieser Funktionssignatur entspricht? Übrigens danke @Moums! –

+0

@GabrielGarcia Ich habe meinen Beitrag bearbeitet, ich hoffe es hilft – Moums

Verwandte Themen