UE4 C ++ゲーム開発の旅(3)青写真のAery

設計図


我々はすべて知っているように、青写真は、視覚的なスクリプティングUE4で非常に使いやすい提供し、より具体的に言えません。
純粋な青写真建てUE4のゲームがありますが、(ゲームプレイ自体は高い性能要件ではない限り)これらのゲームは、多くの場合、不十分に最適化されています。より適切なプロセスは、多くの場合、可能な要素のいくつかのための青写真を作成するためのC ++のコードを書くためにプログラマーを必要とし、その後すぐに青写真によってゲームデザイナーを構築します。

青写真の命名規則

青写真名: "BP" +カテゴリの略語+ "_" +名

たとえば、次のようにBPA_Player

青写真カテゴリ 接頭辞
青写真俳優 BPA_
青写真構造 BPS_
青写真列挙 BPE_
青写真インタフェース BPI_
青写真ライブラリ BFL_
青写真マクロライブラリ BML_

最適化の青写真

プロジェクトの設定では - 「パッケージ - 」実験オプションの下:Nativize青写真資産を

このオプションをチェックすると、ときにパッケージ青写真スクリプトはC ++コードにコンパイルされます。

C ++青写真にさらさ


C ++は、多くの場合、UE4に青写真クラス、属性、方法等(UE4が実質内部反射であるため)に所望の露光を設定するために、いくつかのマクロが使用されます。

C ++のクラスを公開

一般UCLASS([指定子])青写真に露出クラス、およびヘッダファイルの#include「XXX.generated.h」を追加し、(最初の行GENERATED_BODYクラスで使用される)を使用しました。

UCLASS([specifier, specifier, ...], [meta(key=value, key=value, ...)])
class ClassName : public ParentName
{
    GENERATED_BODY()
}

共通[指定子]パラメータ:

  • Blueprintable:薬学的青写真を作成するための基本クラスとしてこのクラス。デフォルト値は、いつそう承継を除き、(NotBlueprintable)の青写真ではありません。これは、サブクラスによって継承されました。
  • BlueprintType:
    クラス型は、開示された設計図変数として使用することができます。
  • NotBlueprintable:クラスは、薬学の青写真を作成するための基本クラスではないことを指定します。負の効果は、指定された親クラスは、キーワードの青写真ことができます。

メタとして(メタデータ記述子)パラメータが使用される比較的無指定子で(制限)を統一するために使用されます。ここでは、特定の公式文書を参照することができます興味を持って、同じトークン以下、言うことを行いません。

//例子:
#include "AMyActor.generated.h"

UCLASS(Blueprintable)
class AMyActor : public AActor {
    GENERATED_BODY()
};

- クラスのゲームUnrealの4ドキュメント:を参照してもよいです

C ++プロパティの暴露

使用UPROPERTY([指定子])マクロ属性は青写真に露出されています。

UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])
Type VariableName; 

共通[指定]パラメータ:

  • EditAnywhereは:試作例と「プロパティ」ウィンドウで編集することができます。
  • VisibleAnywhere:目に見える「プロパティ」ウィンドウで、この特性が、編集することはできませんが、EditAnywhereと互換性がありません。
  • BlueprintReadOnly:この属性は青写真で読み取りますが、変更されないことができます。
  • BlueprintReadWrite:この属性は読み取りまたは青写真で書き込むことができます。
  • BlueprintAssignable:調剤青写真に開示されるプロパティ。
  • BlueprintCallableは:青写真チャートパブリックプロパティに呼び出されなければなりません。
  • カテゴリー=「XXX」:Unrealのエディタを照会するために、プロパティに分類。

前者は属性値が非現実的なエディタの「プロパティ」ウィンドウで編集することができ表し、ここでの違いEditAnyWhereとBlueprintReadWriteに注意してください。このプロパティは、スクリプトエディタの青写真に設定する必要がある場合しかし、あなたは自動的に属性のgetおよびsetメソッドを追加するために同等のBlueprintReadWriteを、使用する必要があります。

//例子:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Character")
float health;

- [プロパティUnrealの4ドキュメント:を参照してもよいです

C ++の機能を公開

次のような使用UPROPERTY([指定子])マクロ属性は青写真に露出され、

UFUNCTION([specifier, specifier, ...], [meta(key=value, key=value, ...)])
ReturnType FunctionName([Parameter, Parameter, ...]);

共通[指定]パラメータ:

  • BlueprintCallable:この関数は、設計図内で直接行うことができることを示し、機能は、C ++で実現することができます。
  • BlueprintImplementableEvent:機能の具体的な実現は唯一の青写真で行うことができます。関数が処理できるイベントの種類として、値を返さないために、我々は特定の実装を持っていません。関数が値を返すためには、設計図エディタで、左側のフィールドに必要とオーバーライド機能を見つけます。それが唯一のC ++のネイティブコードで呼び出すことができます。
  • BlueprintNativeEventは:青写真は、この関数を呼び出すことができ、デフォルトの機能は、C ++で実装されて完了しているが、青写真は、関数を上書きすることができます。このパラメータは、最も柔軟な関数呼び出しを達成することができます。

注:BlueprintNativeEvent機能のためには、いくつかの特別な処理を必要とします。

  1. 新しい仮想関数を宣言するには、関数がFunctionName_Implementationと呼ばれます。
  2. 関数C ++の仮想関数へのシフトを達成するために、
  3. 関数を呼び出すかどうかC ++青写真は、直接、以前は知られている機能を使用しています。
// 例子:
// 头文件
UFUNCTION(BlueprintNativeEvent)
void CountdownHasFinished();

virtual void CountdownHasFinished_Implementation();

// 源文件
void ACountdown::CountdownHasFinished_Implementation() {
    CountdownText->SetText(TEXT(“Go!”));
}

void ACountdown::BeginPlay() {
    Super::BeginPlay();
    CountdownHasFinished();
}

- 機能Unrealの4ドキュメント:を参照してもよいです

C ++の構造体/列挙型を公開

構造は継承せずUProperty変数、関数および演算子など)構造のマークおよび組み込みGENERATED_USTRUCT_BODY(([指定子])のみUSTRUCTを含む変数を含むことができます。

USTRUCT([Specifier, Specifier, ...])
struct StructName {
    GENERATED_USTRUCT_BODY()
}; 

共通[指定]パラメータ:

  • BlueprintType:構造体は、設計図に使用されてもよいです。

違いは、自身のライフサイクルを管理しなければならないUObjectで、UStructは、ごみ収集されないことです。UStruct伝統的なデータタイプはUnrealEdのは、青写真を編集ネットワーキング、シリアル化を制御することができる、UObject反射支持体を含む、純粋であるべきです。

//例子:结构体
USTRUCT(BlueprintType)
struct FCharcterStatus {
    GENERATED_USTRUCT_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Character")
    float health;
}; 

列挙直接UENUM([指定子])タグです。

//例子:枚举
UENUM(Meta = (Bitflags))
enum class EColorBits
{
    ECB_Red,
    ECB_Green,
    ECB_Blue
};

- 構造非現実的な文献4:を参照してもよいです

C ++インタフェースを公開

インターフェース・クラスは、(おそらく)無関係なクラスが実装共通関数の集合の集合ことを確実にするのに役立ちます。いくつかのゲームの特徴の場合に非常に有用であり、複雑であり、異なるクラスの多数で共有することができます。

例えば、ゲームは、トリガ入力音量がトラップ、敵やプレイヤーのボーナスポイントへの警告を有効にすることができます上のシステムが依存している、このようなシステムを持っているかもしれません。これは、トラップ、敵と報酬ポイントデバイスのための「ReactToTrigger」機能を導入することにより達成できます。
しかし、トラップが「AActor」に由来してもよい、敵は、ボーナスポイントが「UDataAsset」に由来することができる特別な「APawn」または「ACharacter」サブカテゴリに由来してもよいです。これらのクラスはすべて、共有機能を必要とするが、彼らは「UObject」の追加よりも、共通の優れたを持っていません。この場合には、インタフェースを使用することをお勧めします。

UINTERFACE([specifier, specifier, ...], [meta(key=value, key=value, ...)])
class UClassName : public UInterface
{
    GENERATED_BODY()
};

共通[指定]パラメータ:

  • BlueprintTypeは:インターフェイスは青写真で使用することができることを示します。
//例子:
#include "ReactToTriggerInterface.generated.h"

UINTERFACE(Blueprintable)
class UReactToTriggerInterface : public UInterface
{
    GENERATED_BODY()
};

- インターフェイスUnrealの4ドキュメント:を参照してもよいです

青写真とC ++バインディングスキーム


一般的なプログラムとC ++の組み合わせのための青写真は、青写真プロジェクトの広範囲に使用する、その後、最適化の効果を高めるためになるように、C ++の複雑な設計図の書き換えに従うことです。
しかし、今の青写真Nativize青写真資産の機能がある、青写真はC ++コードにコンパイルすることができます。私が思うよう青写真のほとんどはNativizeの青写真資産を指示するために書き換える必要はありません。複雑な論理演算を含むいくつかの青写真のために、C ++は青写真の代わりに使用するのに適しています。

推奨される参照のルックの内部[UE4]を使用してC ++青写真、動的のタイプに基づいて作成されたSpawnObject UObject書き換え理解深めるためのブログを。

相続書き換え青写真を使用して

  1. 親クラスの青写真(同じ青写真の親を継承するC ++クラス)としてC ++クラスを作成し、UE4の親に青写真を変更します。

  2. 問題を特定できないエラーが発生した場合には、あまりにも多くの変更を防止(上記の二つの方法の青写真の両方を交換するために回避しようと、各交換のための方法は、詳細なテストのためにゲームを実行しなければならない、C ++青写真方法で一つずつを交換するための良い方法を達成正常にゲームを実行する。変更を防止することが非常に重要であることは)あまりにも多くのエラーが発生した場合の問題点を見つけることができませんもあります

以下に示すように:保持トラブルシューティングを容易にするために、元の青写真、C ++コードを得ます。

青写真を書き換えるの組み合わせを使用します

  1. UObjectから継承されます。変数の型のための青写真として使用されたに、C ++クラスを作成し、一般的にヘルパーをサフィックスとBlueprintTypeラベルを追加します。

  2. 青写真にMyHelperという名前の変数を追加し、型がC ++タイプを作成するための最初のステップです。 

  3. ヘルパーオブジェクトを使用する前にインスタンス化する必要があります。その後、メンバ変数の値をヘルパーを初期化します。どのオブジェクトヘルパーのメンバーによって保存されたキー、である私に渡される現在の青写真オブジェクト(すなわち、自己)のパラメータを指します。 

  4. 最終的にはC ++メソッドヘルパーオブジェクトで記述された機能のための青写真を元に置き換えます。

比較プログラム

2つのプログラムが注意を払う必要があります:

  • メソッドC ++クラス、メンバ変数と青写真1の対応、およびメソッドとメンバ変数の名前を付けることができません重複青写真。
  • 在替换蓝图的过渡时期,代表相同含义的蓝图变量和C++类变量可能同时存在。那么给变量赋值时,应注意2个变量都要同时赋值,以保证蓝图方法和C++方法都能正常运行。
  • A蓝图不能直接使用B蓝图的变量,A蓝图把要公开的变量封装在函数内返回,并且只返回UE4自带的基础变量类型,不能返回自定义类型,以方便C++重写时返回C++中的成员变量。

参考博客原文的结论是:使用继承和组合都可以实现C++重写蓝图,但是组合比继承要更好,耦合度更低。

参考


虚幻引擎4 官方文档 | 中文文档 | 虚幻架构 创建和实现游戏性类的参考

虚幻引擎4 官方文档 | 英文文档 | 虚幻架构 创建和实现游戏性类的参考

[UE4]使用C++重写蓝图,SpawnObject根据类型动态创建UObject

UE4初学笔记

系列其他文章:Aery的UE4 C++开发之旅系列文章

おすすめ

転載: www.cnblogs.com/KillerAery/p/12026395.html