ue-project-context について
UE Project Context は、Unreal Engine プロジェクトの `.agents/ue-project-context.md` を作成・維持するスキルです。プロジェクト設定とソースヘッダーを調べ、推測せずに不明点をユーザーと確認し、他の UE スキルが参照する情報をまとめます。
主な機能
- 01Unreal プロジェクトと設定ファイルのスキャン
- 02エンジン版、モジュール、プラグイン、ターゲットの記録
- 03コーディング規約とゲームプレイ構成の整理
- 04確認できない情報を unknown として記載
- 05ユーザーとの確認による情報の更新
- 06ソースのないプロジェクト向け質問票
活用シーン
- 01新しい UE プロジェクトの情報ファイル作成
- 02設定変更後のプロジェクト情報更新
- 03Blueprint のみのプロジェクト構成の記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ quodsoler/ unreal-engine-skills --skill ue-project-contextインストール後、Claude Code で/ue-project-contextを入力して読み込まれたか確認します。
詳細
UE プロジェクトコンテキスト
対象エンジン:UE 5.8。以下の API は 5.8 のヘッダーに照らして検証済みです。古い形式は「非推奨 — 使用しないでください」に記載しています。
このスキルは .agents/ue-project-context.md を作成・維持します。これは、他の UE スキルがプロジェクトのエンジンバージョン、モジュール構成、有効なプラグイン、コーディング規約、ゲームプレイフレームワークのクラス、ネットワークモデル、ビルドターゲットを把握するために参照する単一のファイルです。プロジェクトファイル(.uproject、*.Build.cs、*.Target.cs、Config/Default*.ini、Plugins/*/*.uplugin)のみを読み取り、エンジン API は呼び出しません。このスキルセットの中で、意図的に対話形式を取る唯一のスキルです。書き込む内容はすべて、推測ではなくコードベースまたはユーザーから得た情報でなければなりません。
コンテキスト
.agents/ue-project-context.md が存在する場合は読み込みます(モジュール名、規約、有効なプラグイン、GAS/ネットワークの設定)。ファイルがなくても中断しないでください。このスキルがファイルを作成します。
既定の手順は 最初にスキャンし、その後に質問する です。何かを尋ねる前にコードベースからドラフトを作成し、その後ユーザーに修正してもらいます。最初に選択肢のメニューを提示しないでください。
| リクエストの内容… | 移動先 |
|---|---|
| 初回セットアップ、またはファイルがない場合 | ステップ 1:スキャンしてドラフトを作成 |
| 各ファイルから読み取る内容と抽出する情報 | スキャン対象 |
| プロジェクトで有効になっているプラグインの名前を指定する | プラグインの確認項目 |
| ユーザーとドラフトを確認する | ステップ 2:ドラフトを修正 |
| 既存のコンテキストファイルを保存または更新する | ステップ 3:保存して確認 |
| スキャンできる C++ ソースがない場合(Blueprint のみ、または新規の空プロジェクト) | 代替質問票 |
| 出力ファイルの形式 | ドキュメントテンプレート |
ステップ 1:スキャンしてドラフトを作成
.agents/ue-project-context.mdが存在するか確認します。存在する場合は読み込み、最初から作り直すのではなく、以前のドラフトとして扱います。- スキャン対象に記載されたファイルをスキャンします。ファイルから確認できる項目はすべて埋めます。
- ファイルから判断できない項目は、ドラフトで
[unknown]と記載します。チームの規模、コーディングルール、ネットワークモデルを決してでっち上げないでください。 - ドラフト全体を 1 つのメッセージで提示し、その後ステップ 2に進みます。
スキャンが不完全でも、提示する価値はあります。エンジンバージョン、モジュール一覧、プラグイン一覧はほぼすべてファイルから把握できるため、質問の大半を省けます。
スキャン対象
| ファイル | 抽出する情報 |
|---|---|
*.uproject | EngineAssociation(例:"EngineAssociation": "5.8"。GUID は登録済みのソースビルドを意味し、空の場合はエンジンツリー内のネイティブプロジェクトを意味します)、Modules[](Name、Type、LoadingPhase)、Plugins[](Name、Enabled)、TargetPlatforms[] |
Source/*/*.Build.cs | モジュールクラス名、PublicDependencyModuleNames、PrivateDependencyModuleNames、PublicIncludePathModuleNames、サードパーティのインクルードパス/ライブラリパス、PublicDefinitions |
Source/*.Target.cs | Type(TargetType.Game、Editor、Client、Server、Program)、ExtraModuleNames、DefaultBuildSettings、IncludeOrderVersion、プラットフォーム条件 |
Config/DefaultEngine.ini | [/Script/EngineSettings.GameMapsSettings] — GameDefaultMap、ServerDefaultMap、GlobalDefaultGameMode、GameInstanceClass(モジュールは Engine ではなく EngineSettings です)。レンダリング機能セットについては [/Script/Engine.RendererSettings] |
Config/DefaultGame.ini | プロジェクトの表示名とバージョン。[/Script/Engine.AssetManagerSettings] — PrimaryAssetTypesToScan。データ駆動型アセットの構成を把握できます |
Config/DefaultInput.ini | [/Script/Engine.InputSettings] — DefaultPlayerInputClass/DefaultInputComponentClass(/Script/EnhancedInput.EnhancedPlayerInput/EnhancedInputComponent なら Enhanced Input が有効です。InputSettings.h:219,223)。残存するレガシーの ActionMappings/AxisMappings。Enhanced Input のプロジェクト設定については [/Script/EnhancedInput.EnhancedInputDeveloperSettings] |
Config/DefaultGameplayTags.ini | [/Script/GameplayTags.GameplayTagsSettings] — GameplayTagList、GameplayTagTableList、ImportTagsFromConfig |
Plugins/*/*.uplugin | 自社製プラグイン名、その Modules[] および Plugins[] の依存関係 |
Source/*/Public/**(ヘッダーを3〜5個抜き取り確認) | 実際に使用されている命名プレフィックス、TObjectPtr と生ポインターの使い分け、API マクロのスタイル(各宣言に MYGAME_API を付けるか、ヘッダーごとに #define UE_API MYGAME_API を定義するか)、DEFINE_LOG_CATEGORY 名、check/ensure の使用状況 |
また、Config/Default*.ini を検索し、プロジェクトでカスタマイズされているその他すべての [/Script/...] セクションを確認してください。これらのセクション名から、チームが実際に設定しているシステムが分かります。
プラグインのチェックリスト
.uproject の Plugins[] を次の一覧と照合し、ほかのスキルからのアドバイスに影響する成熟度の違いがあれば記録してください。これらは 5.8 の .uplugin 名です。
| 分野 | 確認するプラグイン |
|---|---|
| アビリティとモジュール化 | GameplayAbilities、GameFeatures(Beta)、ModularGameplay(Beta)、SmartObjects、InstancedActors(Experimental) |
| 入力 | EnhancedInput |
| UI | CommonUI、ModelViewViewModel(Beta) |
| AI とシミュレーション | StateTree、GameplayStateTree、MassGameplay(Experimental)、MassAI(Experimental) |
| アニメーションと移動 | Mover(Experimental)、MotionWarping(Beta)、PoseSearch、Chooser、AnimationBudgetAllocator |
| カメラ | GameplayCameras(Experimental)、EngineCameras |
| ネットワーク | Iris(Beta)、ReplicationGraph(Beta) |
| オーディオ | Metasound、AudioModulation |
| エフェクトとプロシージャル | Niagara、PCG、ProceduralMeshComponent、GeometryScripting |
| データとサービス | DataRegistry(Beta)、OnlineSubsystem、OnlineServices、SignificanceManager |
| ストリーミングとメッセージング | LevelStreamingPersistence(Experimental)、AsyncMessageSystem(Experimental) |
ほかのスキルで照合できるように、表示名ではなく .uplugin 名を記録してください。Plugins/ 内のプロジェクトプラグインが .uproject の Plugins[] に含まれていなくても、その .uplugin に "EnabledByDefault": false と記載されていない限り有効です(FPlugin::IsEnabledByDefault、Projects/Private/PluginManager.cpp:421-435)。Plugins[] に含まれていないエンジンプラグインは、その .uplugin に "EnabledByDefault": true と記載されている場合に限り有効です。どちらのルールが適用されたかを記録してください。
ステップ 2:ドラフトを修正する
ドラフトを提示し、ユーザーに次の 2 つの質問をします。
このドラフトのどこが間違っていますか? また、何が不足していますか?
回答に沿って修正し、変更があったセクションだけを再提示します。ユーザーが正確だと言うまで繰り返します。
[unknown] の項目も同じ方法で、価値の高いものから一度にいくつかずつ埋めます。
- コードから読み取れない規約 — アサーション方針、ヘッダーの構成、レビューで適用されるルール。
- ゲームプレイフレームワークのクラス名 — GameMode、GameState、PlayerController、PlayerState、Pawn/Character、GameInstance。存在するかどうかではなく、クラス名を尋ねます。
- ネットワークモデル — リッスンサーバーか専用サーバーか、従来のレプリケーションか
Irisか、プッシュモデルの有効・無効、ReplicationGraphの使用有無。 - セーブシステム、ストリーミングモデル、AI スタック — ファイルからすでに確認できない項目のみ。
- チームとソース管理 — ソロ開発者の場合は完全に省略します。
[unknown] と「未確定」は、有効な最終回答です。チームがまだ決めていない項目は、もっともらしい内容をでっち上げて埋めるよりも、未決定と記録するほうが役に立ちます。
ステップ 3:保存して確認する
- ファイルを
.agents/ue-project-context.mdに書き込みます。必要に応じて.agents/を作成します。 - ファイルの先頭にエンジンのバージョンと日付を記録します。
- 他の UE スキルがこのファイルを自動的に読み込むこと、またこのスキルを再実行すると、プロジェクトの変更に合わせてファイルが更新されることをユーザーに伝えます。
- 更新時は、ユーザーが再確認していないセクションを保持し、日付を更新します。
このリポジトリのスキルは UE 5.8 を対象としています。プロジェクトの実際のエンジンバージョンを EngineAssociation からそのまま記録し、プロジェクトが異なるバージョンを使用している場合にアドバイスを調整できるようにします。また、ランチャービルドかソースビルドかも記録します。
フォールバック用の質問項目
スキャンできる Source/ ツリーがない場合(Blueprint のみのプロジェクト、または計画中の空のプロジェクト)に限り使用します。グループを1つずつ確認し、次に進む前に各グループの内容を確定してください。
エンジンとプロジェクト。 プロジェクト名と1文での説明。エンジンのバージョン、ランチャー版かソースビルドか。プロジェクトの種類(ゲーム、シミュレーション、ビジュアライゼーション、ツール、プラグイン)とジャンル。対象プラットフォーム。
モジュール。 モジュール名、主要なゲームモジュール、各モジュールのホストタイプ(Runtime、Editor、Developer、CookedOnly、UncookedOnly、Program)。モジュールごとの主な依存関係。
プラグイン。 名前を列挙するのではなく、分野ごとにプラグインのチェックリストを確認してください。続いて、Plugins/ 配下の社内プラグイン、ゲームプレイに不可欠な Fab/マーケットプレイスのプラグイン、記録すべきライセンス上の制限を確認します。
規約。 Epic の F/U/A/E/I プレフィックスか、社内規約か。UPROPERTY のオブジェクト参照に TObjectPtr を使うか、生ポインターを使うか。モジュール API マクロのスタイル — 各宣言に MYGAME_API を付けるか、ヘッダーごとに #define UE_API MYGAME_API を定義するか。ログカテゴリ名。アサーションの方針(check、checkf、ensure、ensureMsgf、verify)と、それぞれを使用できる箇所。Public/Private ヘッダーの配置。レビューで適用するルール。
ゲームプレイフレームワーク。 GameMode、GameState、PlayerController、PlayerState、Pawn/Character、GameInstance のクラス名。使用中のサブシステムクラスと、それぞれの管理対象。
GAS。 GameplayAbilities が有効かどうか。有効な場合は、AbilitySystemComponent のサブクラス、AttributeSet のクラス名、アビリティの基底クラス、タグ階層の定義場所。
ネットワーク。 リッスンサーバー、専用サーバー、またはシングルプレイヤー。Iris と従来のレプリケーションのどちらを使うか。プッシュモデルの有効/無効。ReplicationGraph を使用するか。想定プレイヤー数とティック予算。
入力。 EnhancedInput と従来のマッピングのどちらを使うか。UInputMappingContext と UInputAction のアセットの配置場所、およびコンテキストを追加するクラス。
UI。 UMG のみ、CommonUI、または CommonUI と ModelViewViewModel のいずれか。基底ウィジェットクラスと、HUD/メニューのスタック管理方法。
AI。 Behavior Tree、StateTree/GameplayStateTree、Mass、カスタムスタックのいずれを使うか。ナビゲーションの設定と、SmartObjects を使用するかどうか。
ストリーミング。 Data Layers を使う World Partition か、従来のサブレベルか。レベルインスタンス化の方式。
セーブ。 USaveGame のサブクラス名、スロット名の付け方、バージョン管理の方針。
ビルド。 リリース対象のターゲットタイプ。カスタムのプリプロセッサ定義。サードパーティライブラリとその統合方法。プラットフォーム固有のコードパス。エンジンのフォークまたは変更の有無。
チーム。 規模と役割。ソース管理(Perforce、Git、Plastic)。ブランチ運用とアセットロックの方針。レビュー基準。ドキュメントの保管場所。
ドキュメントのテンプレート
.agents/ue-project-context.md を次の形式で作成します。プロジェクトについて記載すべき内容がないセクションは削除してください。
# UE Project Context
*Engine: UE 5.8 · Last updated: [date]*
## Engine & Project
**Engine version:** [5.8 — launcher build / source build at [path]]
**Project name:** [name] · **Type:** [game / sim / tool] · **Genre:** [genre]
**Description:** [one sentence]
**Target platforms:** [list]
## Modules
**Primary game module:** [ModuleName]
| Module | Host type | Public deps | Private deps | Notes |
|---|---|---|---|---|
| [MyGame] | Runtime | Core, CoreUObject, Engine, InputCore | [list] | [purpose] |
| [MyGameEditor] | Editor | [list] | [list] | [purpose] |
## Plugins
| Plugin | Maturity | Used for |
|---|---|---|
| [EnhancedInput] | [stable] | [input] |
| [Mover] | [Experimental] | [locomotion prototype] |
**In-house plugins:** [Name — purpose]
**Fab / marketplace:** [Name — purpose, licence notes]
## Coding conventions
**Prefixes:** [standard F/U/A/E/I, exceptions]
**Object references:** [TObjectPtr in UPROPERTY / raw pointers]
**API macro style:** [MYGAME_API per declaration / per-header #define UE_API MYGAME_API]
**Log categories:** `[LogMyGame]` — [scope]
**Assertions:** [check where / ensure where / verify where]
**Header layout:** [Public/Private per module / flat]
**Enforced rules:** [list]
## Gameplay framework
| Role | Class |
|---|---|
| GameMode | `[AMyGameMode]` |
| GameState | `[AMyGameState]` |
| PlayerController | `[AMyPlayerController]` |
| PlayerState | `[AMyPlayerState]` |
| Pawn / Character | `[AMyCharacter]` |
| GameInstance | `[UMyGameInstance]` |
**Subsystems:** `[UMyClass]` ([UGameInstanceSubsystem / UWorldSubsystem / ULocalPlayerSubsystem]) — [owns]
## GAS
**Enabled:** [yes / no]
**AbilitySystemComponent:** `[UMyAbilitySystemComponent]` — lives on [PlayerState / Pawn]
**AttributeSets:** `[UMyAttributeSet]` — [attributes]
**Ability base:** `[UMyGameplayAbility]`
**Tag source:** [Config/DefaultGameplayTags.ini / native tags in [file]]
## Networking
**Model:** [single-player / listen server / dedicated server]
**Replication stack:** [classic / Iris (Beta)]
**Push model:** [on / off] · **ReplicationGraph:** [yes / no]
**Budget:** [N players, tick rate]
## Input
**Stack:** [EnhancedInput / legacy]
**Mapping contexts:** [asset paths] · **Added by:** `[class]`
## UI
**Stack:** [UMG / CommonUI / CommonUI + ModelViewViewModel]
**Base widgets:** `[UMyUserWidget]` · **Layer / stack management:** [description]
## AI
**Stack:** [Behavior Trees / StateTree / GameplayStateTree / Mass / custom]
**Navigation:** [NavMesh setup] · **SmartObjects:** [yes / no]
## Streaming
**Model:** [World Partition + Data Layers / sub-levels]
**Notes:** [cell size, streaming sources, level instances]
## Saves
**SaveGame classes:** `[UMySaveGame]` · **Slots:** [naming] · **Versioning:** [approach]
## Build
**Targets:** [Game, Editor, Client, Server]
**Defines:** `[MYGAME_WITH_CHEATS]` — [purpose]
**Third-party:** [Library — binary / source]
**Platform notes:** [platform: constraint]
**Engine modifications:** [none / fork at [repo] — [what changed]]
## Team
**Size & roles:** [N engineers, N designers, N artists]
**Source control:** [Perforce / Git / Plastic] · **Branching:** [strategy]
**Review bar:** [description] · **Docs:** [where]
非推奨 — 使用しないでください
エージェントがコンテキストドキュメントや、そこから生成するコードに書き込みがちな古い形式です。
| 出力しないでください | 5.8 で使用 | ソース |
|---|---|---|
GENERATED_UCLASS_BODY() | GENERATED_BODY() | CoreUObject/Public/UObject/ObjectMacros.h:803 の #define GENERATED_UCLASS_BODY(...) GENERATED_BODY_LEGACY() |
UPROPERTY() UObject* Ptr; | UPROPERTY() TObjectPtr<UObject> Ptr; | CoreUObject/Public/UObject/ObjectPtr.h:519 の struct TObjectPtr |
NetUpdateFrequency = 10.f; | SetNetUpdateFrequency(10.f) / GetNetUpdateFrequency() | Engine/Classes/GameFramework/Actor.h:903 の UE_DEPRECATED(5.5) |
MinNetUpdateFrequency = 2.f; | SetMinNetUpdateFrequency(2.f) / GetMinNetUpdateFrequency() | Engine/Classes/GameFramework/Actor.h:908 の UE_DEPRECATED(5.5) |
UDataLayerSubsystem アクセサー | UDataLayerManager の同等のアクセサー | Engine/Public/WorldPartition/DataLayer/DataLayerSubsystem.h:37 の UE_DEPRECATED(5.3) |
DefaultInput.ini の bEnableDynamicComponentInputBinding | キーを削除 | Engine/Classes/GameFramework/InputSettings.h:96 の UE_DEPRECATED(5.7) |
DefaultInput.ini の SpeechMappings | キーを削除 | Engine/Classes/GameFramework/InputSettings.h:211 の UE_DEPRECATED(5.7) |
[/Script/Engine.GameMapsSettings] | [/Script/EngineSettings.GameMapsSettings] | Runtime/EngineSettings/Classes/GameMapsSettings.h:101 の class UGameMapsSettings |
プラグイン名としての MetaSounds | Metasound | Engine/Plugins/Runtime/Metasound/Metasound.uplugin |
よくある間違い
下書きではなく質問票から始める: .uproject、*.Build.cs ファイル、Config/Default*.ini を確認すれば、ドキュメントの大部分は把握できます。内容を調べて下書きを作成し、それから何が間違っているかを確認してください。すでにディスク上にある情報をユーザーに説明させないでください。
不足を推測で埋める: チームの規模やアサーションポリシーを捏造するより、空欄のままにするほうが適切です。そうした情報を基に、ほかのスキルがすべて動作するためです。[unknown] と記入して先に進んでください。
プラグインのわかりやすい名前を記録する: 表示名ではなく、.uplugin の名前(ModelViewViewModel、Metasound、GameplayAbilities)を記録してください。そうすれば、ほかのスキルが .uproject の Plugins[] と照合できます。
プラグインの状態を誤って判断する: プラグインが有効なのは、.uproject の Plugins[] エントリに "Enabled": true がある場合、またはデフォルトで有効で、そこで無効化されていない場合です。また、Plugins/ にあるプロジェクトプラグインは、EnabledByDefault キーがなければデフォルトで有効とみなされます。
GameMapsSettings を Engine モジュールに配置する: このクラスは EngineSettings モジュールにあるため、セクションは [/Script/EngineSettings.GameMapsSettings] です。誤ったセクションを指定しても、何も起こらないままになります。
成熟度を記載しない: Experimental または Beta のプラグインは、ほかのスキルが推奨すべき内容に影響します。Mover(Experimental)、Iris(Beta)、GameplayCameras(Experimental)は、それぞれ名前の横にラベルを付ける必要があります。
モジュール依存関係を省略する: UE のリンクエラーの大半は、PublicDependencyModuleNames/PrivateDependencyModuleNames のエントリ不足が原因です。各モジュールの両方のリストを、そのまま記録してください。
更新時に上書きする: 再実行時は、既存のファイルに内容を統合してください。ユーザーが再確認していないセクションの内容は保持します。
関連スキル
.agents/ue-project-context.md を読み込むスキルと、それぞれがそこから取得する情報:
ue-module-build-system— モジュール一覧、ホストタイプ、Build.cs の依存関係リスト、ターゲットタイプue-cpp-foundations— 命名プレフィックス、TObjectPtrの方針、API マクロのスタイル、アサーションの方針ue-gameplay-framework— GameMode、GameState、PlayerController、PlayerState、Pawn の各クラスue-gameplay-abilities— GAS のセットアップ、AbilitySystemComponent の所有者、AttributeSet の名前ue-gameplay-tags-messaging— タグのソース(DefaultGameplayTags.iniまたはネイティブタグ)とメッセージングスタックue-networking-replication— ネットワークモデル、Iris と従来方式のどちらを使用するか、プッシュモデル、ReplicationGraphue-input-system— Enhanced Input の状態、マッピングコンテキストの場所、PlayerController クラスue-ui-umg-slate— CommonUI / ModelViewViewModel の状態と基底ウィジェットクラスue-blueprint-cpp-interop— API マクロのスタイルと、Blueprint に公開するシステムue-actor-component-architecture— サブシステム一覧とコンポーネントの規約ue-character-movement— キャラクタークラスと移動スタックue-mover—Moverプラグイン(Experimental)が有効かどうかue-gameplay-cameras—GameplayCameras(Experimental)が有効かどうかue-ai-navigation— AI スタック、ナビゲーションのセットアップ、SmartObjects の状態ue-state-trees— StateTree / GameplayStateTree プラグインの状態ue-world-level-streaming— World Partition とサブレベルのどちらを使用するか、Data Layer の使用状況ue-serialization-savegames— SaveGame クラス、スロット名、バージョニングue-testing-debugging— ログカテゴリ、アサーションの方針、モジュール一覧ue-editor-tools— Editor モジュール名とエディタープラグイン一覧ue-game-features— GameFeatures / ModularGameplay プラグインの状態