implement-fog-of-war について
戦場の霧を、描画層とは分離した共有知覚システムとして実装する開発スキルです。ゲーム内で一貫した可視性ルールを保ち、描画オーバーレイを制御したい開発者向けです。
主な機能
- 01知覚処理と描画の分離
- 02障害物を考慮した決定論的な可視性
- 03可視距離のルックアップテクスチャ化
- 04単一シェーダーオーバーレイによる描画
- 05可視性とターゲティング・敵処理の連携
- 06状態、ライフサイクル、性能の検証
活用シーン
- 01ゲームプレイへの戦場の霧の追加
- 02敵の可視性とターゲティングの整合
- 03移動中やメニュー状態での霧のテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mengto/ skills --skill implement-fog-of-warインストール後、Claude Code で/implement-fog-of-warを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlreferences/mechanics.mdvalidation.md詳細
霧による視界制限を実装する
霧による視界制限は、共有の知覚システムとして構築し、表示レイヤーは控えめにします。
アーキテクチャを維持する
次の責務を分離してください。
- 決定論的な CPU 知覚処理で、範囲、障害物との交差、ゲームプレイ上の視認性を管理します。
- プレイヤーの角度ごとの視認可能距離を、サイズ固定のルックアップテクスチャにエンコードします。
- 1 つのフルスクリーンシェーダーで、そのルックアップを柔らかな放射状の霧と壁に応じた霧に変換します。
- ゲームプレイでは知覚結果を直接使用し、霧のピクセルから戦闘上の真偽を推測してはいけません。
アルゴリズムを実装または変更する前に、mechanics.md を読んでください。実証済みの障害物モデル、シェーダーの合成方法、調整済みの値、状態ルール、敵の挙動、ライティングの制約、テレメトリーが記録されています。
編集前に調査する
- プレイヤーの位置、カメラ、障害物、シーンのライフサイクル、フレームループ、ターゲット設定、敵の知覚、レンダリングレイヤーの正しい情報源を特定します。
- ゲームプレイで使う地面モデルを確認します。実証済みのコーナーの逆投影方法は、局所的に水平な平面を前提とします。視認範囲内で標高が変化する場合は、正確な地表データまたは地形の再構築を使用してください。
- 既存のシーンの霧、ポストプロセス、レンダラーの生成、レビュー用モード、メニュー、キャプチャ、トランジション、破棄処理を確認します。
- 定数や責務の割り当てを変更する前に、現在のテストと最近の霧/知覚関連のコミットを読みます。
- 障害物の状態が実行中に変化するか確認します。ジオメトリーが視線判定に適している場合は、ナビゲーションまたは衝突判定で使用しているものと同じ有効な障害物コレクションを再利用します。
- 早い段階で作業ツリーを確認し、無関係な変更を保持します。
依存関係の順に実装する
1. 知覚上の判定基準を定義する
- 各視線遮蔽物を、安定したフットプリント、高さの範囲、有効状態で表します。
- 3D の視線分または光線を、水平フットプリントと高さの範囲の両方に対して交差判定します。
- 無効な遮蔽物と、目から対象までの視線より低い遮蔽物は無視します。
- 次を公開します。
- 敵、ターゲット設定、攻撃に使う、点から点への知覚判定。
- 霧のルックアップ用の、決定論的な角度別距離の生成処理。
- プレイヤーと敵の視認範囲を明示的に設定します。遭遇の設計上、敵がプレイヤーの視界の端より遠くでプレイヤーを発見する必要がある場合は、それぞれ異なる範囲を設定できるようにします。
2. 視認性のルックアップを構築する
- 距離配列、バイトピクセル、データテクスチャを一度だけ確保します。
- プレイヤーの視点を中心に、間隔を均等にした一定数の水平光線を放ちます。
- ヒット距離をプレイヤーの視認半径で正規化し、1 行の赤チャンネルテクスチャに量子化します。
- リニアフィルタリング、水平方向のリピートラップ、ミップマップなしとし、モバイル/デスクトップ向けに上限を設けた光線数を使用します。
- プレイヤーが十分に移動したとき、または短い最大更新間隔に達したときに更新します。フレームループ内でメモリを確保してはいけません。
3. 柔らかなオーバーレイを 1 つ描画する
- クリップ空間の平面 1 つと、透明なシェーダーマテリアル 1 つを使用します。
- カメラの四隅との交点 4 つから、各フラグメントの地面上の位置を再構築します。
- 次を組み合わせます。
- 内側の透明な範囲と、外側に向かって柔らかく減衰する放射状の境界。
- 角度別ルックアップからサンプリングした、ぼかしのある壁の境界。
- 隣接する角度間で障害物による視認性を滑らかにします。壁による霧の比重は外側の放射状の霧より低くし、障害物が不透明な扇形ではなく、雰囲気として見えるようにします。
- 放射状の霧と障害物による霧は
maxで合成し、最終的な不透明度に上限を設けます。 - 深度テスト、深度書き込み、トーンマッピングを無効にし、ワールドの描画後にレンダリングします。
- 2 つ目のレンダラー、レンダーターゲット、コンポーザー、または光線ごとのメッシュを追加してはいけません。
4. ゲームプレイに統合する
- シミュレーション上の存在と、表示上の可視性を分けて管理します。
- 未発見の敵の描画対象は、レイヤーまたは表示専用の仕組みで非表示にします。ルートの可視性がライフサイクルやシミュレーションも制御している場合は、アクタールートを切り替えないでください。
- 未発見の敵は、ターゲットロック、照準対象の選択、最寄りターゲットの検索、HUD の数、プレイヤーの攻撃対象判定から除外します。
- 未発見の敵の存在が露見する予告表示は非表示にします。
- 敵の発見と攻撃には、それぞれ固有の射程と、同じ視線判定の結果を使用します。
- 認識の無効化と同時に、アクティブなターゲットロックを解除します。
- シミュレーションフェーズ内では認識結果をキャッシュし、後続のシステムが最新の位置を必要とする場合は、移動後に更新します。
5. 状態とライフサイクルに統合する
- フォグは、ゲームプレイがアクティブな間だけ有効にします。
- 製品として明示的に必要な場合を除き、メニュー、インベントリ、レビュー/キャプチャモード、一時停止中または非プレイ状態、ステージ遷移中は無効にします。
- 前のフレームの情報が別の状態に漏れないよう、早期描画の分岐に入る前に無効にします。
- 大気表現用のシーンフォグと、フォグ・オブ・ウォーを分けて管理します。
- 破棄時にオーバーレイのジオメトリ、マテリアル、ルックアップテクスチャを破棄します。
- レイの予算、有効状態、射程、可視の敵、ターゲットの可視性、視線、測定距離に関する簡潔なテレメトリを公開します。
適切な順序で調整する
- 障害物のジオメトリと目の高さを検証します。
- プレイヤーと敵の射程を検証します。
- 完全に明るくする内側の半径を設定します。
- 外側の半径方向の減衰と最大不透明度を設定します。
- 壁のエッジの柔らかさを設定します。
- 放射状の筋が見えなくなるまで角度方向の平滑化を追加します。
- 壁が黒い光線ではなく遮蔽物に感じられるまで、障害物の暗さを抑えます。
- 見た目の正しさと測定済みのパフォーマンスを確認してから、レイの予算を調整します。
ぼかしを追加して、問題のある障害物データを隠さないでください。視認境界の弱さを補うために、シーン全体を暗くしないでください。
検証する
完了を宣言する前に、validation.md を読んでください。次を実行します。
- 認識と不透明度の単体テスト
- レンダリング予算の構造的な契約テスト
- ターゲット、レイヤー、ライティング、状態の統合テスト
- プロジェクトの lint とビルド
- Codex ブラウザーでの実際のデスクトップおよびモバイルブラウザーの確認
レビュー用モードで意図的にフォグが無効になっている場合は、通常のゲームプレイで見た目を検証します。静止画だけでなく、動き、カメラ移動、壁のエッジ、ゲート、継ぎ目、メニュー遷移を評価してください。
実証済みの品質を維持する
- 内側のプレイエリアを見やすく保ちます。
- 最大の暗さを控えめにします。
- 壁を柔らかくし、目に見える放射状の筋が出ないようにします。
- 角度の継ぎ目を見えなくします。
- 動的なゲートと視界を同期させます。
- 敵の視界がプレイヤーの視界より広くても、敵の挙動が公平になるようにします。
- 信頼できる可視性モデルを1つだけ、上限を設けたオーバーレイを1つだけ維持します。
コメント
Markdown 対応