その静的負荷は単なるヘルパーです。UFUNCTION(...) マクロでその関数のヘッダーをマークする場合にのみ、C++ 関数を呼び出すことができます。このリンクを参照してください。
したがって、関数を作成し、その実装でそのヘルパーを呼び出すことができます。例えば:
// Helpers.h
static FORCEINLINE UTexture2D* GetTexture2DByName(const FName& name) {
return LoadObjFromPath<UTexture2D>(name);
}
UFUNCTION(BlueprintCallable, Category = TCF2Helpers)
static UTexture2D* GetTexture2DForBlock(UBuildableBlockInfo* blockInfo);
// Helpers.cpp
UTexture2D* UHelpers::GetTexture2DForBlock(UBuildableBlockInfo* blockInfo)
{
if (!blockInfo)
return nullptr;
const FString baseFolder = TEXT("Texture2D'/Game/Textures/HUD/%s");
if (blockInfo->IsEmptyHand)
return GetTexture2DByName(*FString::Printf(*baseFolder, TEXT("EmptyHand.EmptyHand'")));
// another lines of implementation
}
しかし、本当にハードコーディングする必要があるかどうかを自問する必要があります。のようなものを指定できます。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widgets")
TSubclassOf<class UObjectWidget> wInGameMenu;
UPROPERTY(BlueprintReadOnly, Category = "Widgets")
UObjectWidget* InGameMenu;
関数 BeginPlay のオーバーライドの場所 (これは、その場でウィジェットを作成するためです):
if (wInGameMenu)
{
InGameMenu = CreateWidget<UObjectWidget>(this, wInGameMenu);
}
UObjectWidgetは UUserWidget の後継であり、(エディターで作成された) 私のウィジェットは、そのウィジェットを継承ベースとして持つように再親化されています。それを保持するオブジェクトのアーキタイプでどのウィジェットを作成するかを定義します。
私はそれを次のように実装します:(誰かが私にもっと良い方法を教えてくれれば、これは変更されるかもしれません)
- WeaponManager をActorComponentとして作成する
- 武器を SceneComponent として作成します (スケルトン ソケットに取り付けられるようにします)。
- すべての武器には、同じインターフェースに基づく独自の実装があります (共通の祖先で定義されたいくつかの関数のオーバーライドでしょうか?)
- 複数のサブチャイルド (エネルギー武器、射撃武器など) を持つことができるため、正しい継承が行われ、同じものの複数の実装を避けることができます。
- すべての武器はそのメッシュとプロパティを定義します - 繰り返しますが、メッシュ パスをハードコーディングした場合 (実装なので問題ありません)、そのリストの最後にそのようなコードを使用できます)、または必要に応じてアーキタイプに設定できます青写真で何かをコーディングするのが好きです。
- 次に、WeaponManagerですべての武器を定義します (たとえば、
TArray<TSubclassOf<UWeapon>>
- すべての武器はEWeaponType (ゲーム内のすべての武器の列挙型) を定義する必要があるため、定義済みの武器を TMap のタイプと一致させ、必要に応じて操作 (表示、非表示、武器の変更など) することができます。そのタイプはすべての実装にハードコーディングする必要があります。武器の。
メッシュをコンストラクターにロードします。
//TerminalObject.h
UCLASS()
class TAUCETIF2_API ATerminalObject : public AStaticMeshActor
{
GENERATED_UCLASS_BODY()
};
// TerminalObject.cpp
ATerminalObject::ATerminalObject(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
static ConstructorHelpers::FObjectFinder<UStaticMesh> mesh(TEXT("StaticMesh'/Game/BuildingObjects/Meshes/terminal.terminal'"));
checkf(mesh.Succeeded(), TEXT("Failed to find mesh"));
auto mc = GetStaticMeshComponent();
checkf(mc, TEXT("Failed to find mesh component"));
mc->SetStaticMesh(mesh.Object);
}