2017-08-29 3 views
1

Ich möchte hinzufügen, Elemente haben, erstellt mit C++ Makros wie folgt aus:Wie UPROPERTY() Makro innerhalb einer C++ Makro

#define PROPERTIES\ 
UPROPERTY(blabla)\ 
variableType varName;\ 
UPROPERTY(blabla)\ 
variableType2 varName2; 

So kann ich Eigenschaften auf andere Dateien einschließlich dieses Add und auf sie PROPERTIES Makro.

Dieses Design stammt aus einer typischen Organisation, wo diese Parameter aus einer anderen Klasse stammen, weil sie mit dieser Klasse verwandt sind.

So könnte ich verschiedene Dateien einschließen und alle Eigenschaften in den Editor von allen von ihnen enthalten.

Was passiert, ist, dass das Unreal Header Tool UPROPERTY natürlich völlig ignoriert, wahrscheinlich weil es vorher bearbeitet wird und dann das Makro ... überraschend funktioniert, aber nur die Variable, nicht UPROPERTY ... Also der Editor nicht t es zeigen.

Irgendwelche Ideen, wie man das macht?

Antwort

1

Sind Sie sicher, dass Ihre Eigenschaften richtig definiert sind? Sie sollten etwas wie UPROPERTY(EditAnywhere, Category="My category")verwenden Kategorie ist erforderlich, wenn Funktionen oder Eigenschaften zum Editor ausgesetzt werden. Eigenschaften mit diesem Makro würden dem Instanzeigenschafteneditor und dem Klassenstandardeditor ebenfalls zugänglich gemacht.

Auch ich möchte darauf hinweisen, dass dieses Design wirklich schlecht ist und ich denke, dass Sie Probleme damit haben können. Wie Sie richtig hingewiesen haben, hat Epic benutzerdefinierte Reflexionssystem (UHT), die Sie automatische Speicherverwaltung mit GC und so weiter verwenden können. Mehr zum Build System UE Docs.

Ich denke, dass Sie entscheiden sollten, wie diese Eigenschaften verwendet werden. Da man sie über mehrere Schauspieler verteilen möchten, können Sie wählen zwischen:

  1. Inheritance
  2. UObject Referenz
  3. Component System

Die erste wirklich trivial ist, und ich glaube, Sie sind vertraut mit diesem Konzept. Und ich denke, dass Sie Ihre Gründe hatten, warum diese Makro Lösung wählte. Hinweis, dass Sie keine Mehrfachvererbung verwenden dürfen (was in klassischem C++ möglich ist) und dies ist auf UBT zurückzuführen.

Die zweite lautet:

UCLASS(BlueprintType) 
class UMyProps : public UObject 
{ 
    // TODO define properties in a standard way 
} 

// some actor's properties 
UPROPERTY(BlueprintReadWrite, Category = "My Game | My Subcategory") 
UMyProps* myProperties; 

Hauptvorteil des zweiten Systems ist, dass man Sätze von Eigenschaften auf Objekte hinzufügen können, die sie benötigt, während mit typsichere Umgebung und voller Intellisence Unterstützung (und UE Editor natürlich auch).

Oder können Sie Komponenten verwenden, die mehr oder weniger wie der zweite Ansatz ist, aber es könnte völlig dynamisch sein (Sie müssen nicht die tatsächlichen Bezug auf Ihre Komponente, können Sie es durch GetComponent(...) Aufruf).

Diese drei sind gute, solide und transparente Ansätze, um die Eigenschaften Ihres Objekts zu erweitern. Mit Ihrem Makro 's Ansatz, könnten Sie leicht mit einem Berg von Chaos endet, wenn dies sogar mit UE Build-System funktioniert).

+0

Danke für die damit verbundenen Informationen, Pavel. Lassen Sie mich erklären: Variablen mit Makros zu integrieren, scheint ein sehr gebräuchlicher Ansatz zu sein. Ich wurde von einem sehr erfahrenen Programmierer dazu aufgefordert. Es ist vielleicht in Unreal falsch. Wir dachten, dass das UPROPERTY-Makro möglicherweise durch das Unreal-Header-Tool BEFORE EIGENSCHAFTEN geändert wurde, das Makro verwendet wird. Deshalb dachten wir, dass die UHT möglicherweise den Code des Makros PROPERTIES bricht. Ich wusste nicht, ich könnte eine "UCLASS" verwenden, um die Eigenschaften aufzunehmen. Ich begann stattdessen, eine Struktur zu verwenden, weil ich sie als Ergänzung in eine bereits existierende Klasse einfügen würde. Ich werde es testen – darkgaze

+1

@darkgaze Sie müssen angeben, "UCLASS" oder "USTRUCT", so dass "class" oder "struct" von UHT gefunden werden könnte. Dann müssen Sie 'UPROPERTY' richtig benutzen (https://answers.unrealengine.com/questions/89949/uproperty-not-reflecting-in-editor.html) Das gleiche gilt für' UFUNCTION' (Zum Beispiel wenn Sie möchten Um C++ - vorgestellte Delegaten zu verwenden, können Sie nur "UFUNCTION()" hinzufügen (Fortsetzung folgt) –

+0

@darkgaze (continue) (siehe https://forums.unrealengine.com/community/community-content-tools-and-tutorials/13915-tutorial-creating-and-using-delegates-c-and-access-the-in-blueprints? 30345-Lernprogramm-Erstellen-und-Verwenden-Delegaten-C-and-Access-the-in-Blueprints =) Wenn Sie jedoch eine Funktion von * Blueprint * aufrufen möchten, müssen Sie diese wie 'UFUNCTION (BlueprintCallable, Category = "MyCategory") markieren. Sobald Sie mit diesem Konzept vertraut sind, können Sie Ihren Code und exponieren neue Dinge zu Blueprints –