unreal-cpp-gameplay について
Unreal Engine 5.8のゲームプレイC++を記述する開発者向けのスキルです。リフレクションマクロやGameplay Frameworkのクラスの役割、モジュール依存関係を、クラス宣言からコンパイル確認まで解説します。
主な機能
- 01Unrealクラスの命名プレフィックスを適用
- 02リフレクションマクロでクラスとメンバーを宣言
- 03エディターとBlueprintにプロパティや関数を公開
- 04コンポーネントを作成しルートを設定
- 05Gameplay Frameworkのデフォルトクラスを設定
- 06Build.csのモジュール依存関係を設定
活用シーン
- 01Actor、Pawn、コンポーネントクラスの作成
- 02C++のプロパティや関数をBlueprintに公開
- 03GameModeのデフォルトPawnとコントローラーを設定
- 04モジュール依存関係に起因するリンクエラーを解消
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gamedev-skills/ awesome-gamedev-agent-skills --skill unreal-cpp-gameplayインストール後、Claude Code で/unreal-cpp-gameplayを入力して読み込まれたか確認します。
同梱ファイルreferences/components-and-gc.md
詳細
Unreal C++ ゲームプレイ
正しい UE5 ゲームプレイ C++ を記述します。C++ とエディターや Blueprints を連携させるリフレクションマクロ、Gameplay Framework のクラスの役割、 モジュール依存関係を扱います。対象は UE 5.8 です。
使用する場面
- C++ ゲームプレイクラス(
AActor、APawn、ACharacter、AGameModeBase、UActorComponent)を作成するとき、UPROPERTY/UFUNCTIONでプロパティや関数を公開するとき、 GameMode のデフォルトクラスを設定するとき、または*.Build.csでモジュール依存関係を追加するときに使用します。 - プロジェクトに
UCLASSを使用する*.h/*.cppと*.Build.csを含むSource/ツリーがある場合に使用します。
使用しない場面: デザイナー向けのビジュアルロジック → unreal-blueprints。プレイヤー入力の
バインドの詳細 → unreal-enhanced-input。AI ロジック → unreal-behavior-trees。このスキルは、
それらの基盤となる C++ クラス/リフレクションを扱います。
基本的なワークフロー
- 適切なプレフィックスを付けます。
A= Actor 派生、U=UObject/コンポーネント派生、F= 通常の構造体、E= enum、I= インターフェースです。プレフィックスは基底クラスに合わせます。 - リフレクションマクロを使ってクラスを宣言します。 クラスの上に
UCLASS()を置き、クラス本体の 最初の行にGENERATED_BODY()を置き、ヘッダーでは#include "ClassName.generated.h"を 最後の include にします。 UPROPERTYでデータを公開し(エディター/Blueprints からの可視性とガベージコレクションによる 追跡の両方)、UFUNCTION(BlueprintCallableなど)で振る舞いを公開します。- コンストラクターで
CreateDefaultSubobject<T>(TEXT("Name"))を使ってコンポーネントを作成し、RootComponentを設定します。 - フレームワークでの役割を把握します。
AGameModeBaseはルールとデフォルトクラスを設定し、APawn/ACharacterは操作可能な本体、APlayerControllerはプレイヤーの意思、UActorComponentは再利用可能な振る舞いを担います。 *.Build.csにモジュール依存関係を追加します(例:EnhancedInput)。追加しないと 未解決シンボルのリンクエラーが発生します。- コンパイルして確認します。(関数本体には Live Coding の
Ctrl+Alt+F11を使用し、 ヘッダー/UPROPERTYの変更にはフルリビルドを行います。)クラスやプロパティがエディターに 表示されることも確認します。
パターン
1. 最小限の Actor クラス(ヘッダー+ソース)
// Pickup.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Pickup.generated.h" // MUST be the last include
UCLASS()
class MYGAME_API APickup : public AActor // MYGAME_API = your module's export macro
{
GENERATED_BODY()
public:
APickup();
// EditAnywhere = tweak per-instance & on the CDO; BlueprintReadWrite = BP get/set.
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Pickup")
int32 ScoreValue = 10;
// UPROPERTY on a UObject* pointer is what keeps it from being garbage-collected.
UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> Mesh; // UE5: TObjectPtr instead of raw UStaticMeshComponent*
UFUNCTION(BlueprintCallable, Category = "Pickup")
void Collect();
protected:
virtual void BeginPlay() override;
};
// Pickup.cpp
#include "Pickup.h"
#include "Components/StaticMeshComponent.h"
APickup::APickup()
{
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
RootComponent = Mesh; // the mesh is this actor's root
}
void APickup::BeginPlay() { Super::BeginPlay(); } // always call Super
void APickup::Collect() { Destroy(); }
2. GameMode でデフォルトクラスを設定する
// MyGameMode.cpp — set in the constructor so the engine spawns your classes.
AMyGameMode::AMyGameMode()
{
DefaultPawnClass = AMyCharacter::StaticClass();
PlayerControllerClass = AMyPlayerController::StaticClass();
}
3. Build.cs でのモジュール依存関係
// MyGame.Build.cs
PublicDependencyModuleNames.AddRange(new string[]
{
"Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput"
});
注意点
generated.hが最後にない/存在しない — 「Cannot find generated header」や 「Expected an include」などのコンパイルエラーが発生します。ヘッダー内の最後の include にする必要があります。GENERATED_BODY()を忘れる — UHT(Unreal Header Tool)のエラーが発生します。クラス本体の最初に置く必要があります。UPROPERTYを付けずにUObject*を使う — ガベージコレクターが認識できず、オブジェクトが予期せず破棄されることがあります。すべての UObject ポインターをUPROPERTYで追跡します(UE5 ではTObjectPtrを使用します)。- Live Coding 中にヘッダー/
UPROPERTYを編集する — Live Coding が対応するのは関数本体です。UCLASS/UPROPERTY/ヘッダーの変更には、エディターの完全な再起動とリビルドが必要です。 - クラスのプレフィックスが間違っている — Actor に
UFoo(またはコンポーネントにAFoo)と名前を付けると UHT で問題が発生します。基底型に合ったプレフィックスを付けます。 - リンク時に未解決の外部シンボルが発生する — API を提供するモジュールが
Build.csのPublicDependencyModuleNamesに含まれていません。 - オーバーライドした
BeginPlay/TickなどでSuper::を呼び出さない — エンジンの初期化処理が省略されます。
参考資料
UActorComponentの作成/アタッチ、UPROPERTYによるガベージコレクションの所有権ルール (TObjectPtr、TArray<TObjectPtr<>>、AddToRoot)、およびレプリケーションの入門については、references/components-and-gc.mdを参照してください。- 公式ドキュメント:「Unreal Engine CPP Quick Start」と「Gameplay Framework」
(
https://dev.epicgames.com/documentation/en-us/unreal-engine/gameplay-framework-in-unreal-engine)。
関連スキル
unreal-blueprints— デザイナー向けに C++ を公開する方法、BP/C++ の連携。unreal-enhanced-input— C++ の Pawn/Character で入力をバインドする方法。unreal-behavior-trees— ビヘイビアツリーから実行する C++ AI タスク。
コメント
Markdown 対応