unreal-engine-cpp-pro について
Unreal Engine 5.x の C++ 開発者向けガイダンススキルです。エンジン規約、UObject の寿命管理、パフォーマンス、実装パターンを扱います。
主な機能
- 01UObject の寿命とガベージコレクション
- 02リフレクションと Blueprint への公開
- 03Tick とパフォーマンスの指針
- 04Epic の命名規則
- 05アセット読み込みとソフト参照
活用シーン
- 01Actor と Component の実装
- 02ガベージコレクション問題の調査
- 03性能が重要なコードの最適化
- 04C++ 機能の Blueprint への公開
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill unreal-engine-cpp-proインストール後、Claude Code で/unreal-engine-cpp-proを入力して読み込まれたか確認します。
同梱ファイルexamples/ExampleActor.cppexamples/ExampleActor.h
詳細
Unreal Engine C++ Pro
このスキルでは、C++ を使用して Unreal Engine 5 で開発するための、専門家レベルのガイドラインを提供します。堅牢で高パフォーマンス、かつ標準に準拠したコードの作成に重点を置いています。
使用するタイミング
次の場合にこのスキルを使用します。
- Unreal Engine 5.x プロジェクト向けの C++ コードを開発する場合
- Actor、Component、または UObject 派生クラスを作成する場合
- Unreal Engine でパフォーマンスが重要なコードを最適化する場合
- メモリーリークやガベージコレクションの問題をデバッグする場合
- Blueprint に公開する機能を実装する場合
- Epic Games のコーディング標準と規約に従う場合
- Unreal のリフレクションシステム(UCLASS、USTRUCT、UFUNCTION)を使用する場合
- アセットの読み込みとソフト参照を管理する場合
次の場合はこのスキルを使用しないでください。
- Blueprint のみのプロジェクト(C++ コードなし)で作業する場合
- Unreal Engine 5.x より前のバージョンを対象に開発する場合
- Unreal 以外のゲームエンジンで作業する場合
- Unreal Engine の開発に関係のないタスクの場合
基本原則
-
UObject とガベージコレクション:
UObject*メンバー変数がガベージコレクター(GC)によって追跡されるよう、常にUPROPERTY()を使用します。- リフレクション対象の UObject グラフ外でスコープ付きの強参照を保持する場合は、
TStrongObjectPtr<>を慎重に使用します。オブジェクトを手動でルート化することは避けてください。手動でAddToRoot()を呼び出す場合は、ライフサイクルを通じて対応するRemoveFromRoot()を確実に管理する必要があります。 IsValid()のチェックとnullptrの違いを理解してください。IsValid()は、破棄待ち状態を安全に処理します。
-
Unreal リフレクションシステム:
- リフレクションシステムと Blueprint に型を公開するには、
UCLASS()、USTRUCT()、UENUM()、UFUNCTION()を使用します。 - 可能な限り
BlueprintReadWriteの使用を最小限に抑えます。UI やレベルの BP のロジックによって変更されるべきでない状態には、BlueprintReadOnlyを優先します。
- リフレクションシステムと Blueprint に型を公開するには、
-
パフォーマンスを最優先:
- Tick:デフォルトでは Tick を無効にします(
bCanEverTick = false)。どうしても必要な場合にのみ有効にしてください。タイマー(GetWorldTimerManager())またはイベント駆動型のロジックを優先します。 - キャスト:処理負荷の高いループ内で
Cast<T>()を使用しないでください。BeginPlayで参照をキャッシュします。 - Struct と Class:オーバーヘッドを削減するため、データ量が多く、UObject ではない型には
FStruct を使用します。
- Tick:デフォルトでは Tick を無効にします(
命名規則(厳守)
Epic Games のコーディング標準に従います。
- テンプレート:
Tを接頭辞にします(例:TArray、TMap)。 - UObject:
Uを接頭辞にします(例:UCharacterMovementComponent)。 - AActor:
Aを接頭辞にします(例:AMyGameMode)。 - SWidget:
Sを接頭辞にします(Slate ウィジェット)。 - Struct:
Fを接頭辞にします(例:FVector)。 - Enum:
Eを接頭辞にします(例:EWeaponState)。 - インターフェース:
Iを接頭辞にします(例:IInteractable)。 - Boolean:
bを接頭辞にします(例:bIsDead)。
一般的なパターン
1. 堅牢なコンポーネントの検索
Tick 内で GetComponentByClass を呼び出すのは避けてください。PostInitializeComponents または BeginPlay で実行します。
void AMyCharacter::PostInitializeComponents() {
Super::PostInitializeComponents();
HealthComp = FindComponentByClass<UHealthComponent>();
check(HealthComp); // Fail hard in dev if missing
}
2. インターフェースの実装
システム間の結合を疎にするには、インターフェースを使用します(例:インタラクションシステム)。
// Interface call check
if (IsValid(TargetActor) && TargetActor->Implements<UInteractable>()) {
IInteractable::Execute_OnInteract(TargetActor, this);
}
3. ソフト参照(同期処理の例)
読み込み順序を強制する、大規模なアセットに対してハード参照(UPROPERTY(EditDefaultsOnly) TSubclassOf<AActor>)を使用するのは避けてください。TSoftClassPtr または TSoftObjectPtr を使用します。
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TSoftClassPtr<AWeapon> WeaponClassToLoad;
void AMyCharacter::Equip() {
if (WeaponClassToLoad.IsPending()) {
WeaponClassToLoad.LoadSynchronous(); // Or use StreamableManager for async
}
}
デバッグ
- ログ出力:カスタムカテゴリを指定して
UE_LOGを使用します。DEFINE_LOG_CATEGORY_STATIC(LogMyGame, Log, All); UE_LOG(LogMyGame, Warning, TEXT("Health is low: %f"), CurrentHealth); - 画面メッセージ:
if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Died!")); - ビジュアルロガー:AI のデバッグに非常に役立ちます。
IVisualLoggerDebugSnapshotInterfaceを実装します。
PR 前のチェックリスト
- この Actor は Tick を必要としますか?タイマーで代用できますか?
- すべての
UObject*メンバーがUPROPERTYでラップされていますか? - ハード参照(TSubclassOf)が読み込みチェーンを引き起こしていませんか?ソフトポインターに置き換えられますか?
-
EndPlayで、検証済みデリゲートをクリーンアップしましたか?
制限事項
- タスクが上記の説明された範囲に明確に一致する場合にのみ、このスキルを使用してください。
- 環境固有の検証、テスト、または専門家によるレビューの代わりとして、出力を扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認を求めてください。
アクターファイルは例示用であり、MYGAME_API の置き換え、プロジェクトヘッダーの生成、ターゲットエンジンでのビルドが必要です。LoadSynchronous() はゲームスレッドを停止させる可能性があります。レイテンシーが重要な処理では、ターゲットバージョンのストリーミング可能な非同期ロード API を使用してください。サポートされている場合は、リフレクション対応の TObjectPtr メンバーを優先してください。Epic のオブジェクトポインターに関するガイダンス。