8.5K Views
March 28, 26
スライド概要
GCC26の「圧倒的不評に立ち向かう--40項目修正を支えたチェック機構」のスライドの公開用資料です
株式会社ヘキサドライブの資料共有用アカウントです。 公式ブログ:https://hexadrive.jp/hexablog/ note :https://note.com/hexadrive
圧倒的不評に立ち向かう! 2週間で5回,40項目修正を支えたチェック機構 株式会社ヘキサドライブ/山口裕也 1
これはGAME CREATORS CONFERENCE ’26の公開用スライドです 実際の講演で使用されるスライドとは若干の差異があります 2
自己紹介 山口裕也 株式会社ヘキサドライブ 去年ぶりですね 3
このセッションはこんな方にお勧め • 自動プレイシステムを組み込んでみたいけれど、 どこから手を付けたら良いか分からない人 • AIエージェントを使った開発に興味はあるが、ど こから手を付けたらよいか分からない人 4
アジェンダ 5
アジェンダ • 自動プレイの実装解説 • HDRPからURPへの移行 • AIを使ったR&Dのすすめ 6
自動プレイの実装解説 7
■■ノニラヤの紹介 Steamで販売中の和風マイルドホラーゲーム Unity6でほぼ一人で開発 去年メイキングのお話をさせて頂きました そんなに怖くないよ 8
圧倒的不評の話 • ゲームは週末にリリース • 週明けから増えるおすすめしませんレビュー • 圧倒的不評を頂き、即座に対策を開始 • 謎解き用のヒント追加 • 戦闘のバランス調整 9
修正はすすむ しかし 10
その修正、他のバグを生んでない? • 修正=変更は思わない副作用を生んでいるかも • 副作用が致命的でないかチェックが必要 • でもチェックしてたら修正の時間が取れない 11
自動プレイがあるじゃない 去年の講演で軽く触れた自動プレイ これを活用する事でチェックを減らせるのでは? 12
自動プレイでやってる事 • 規定ルートに沿ってクリアするまで進行する • 敵に対しては無敵 • 謎解きはフラグがあってれば即クリア • ※Jenkins経由のみOBSで録画 たったこれだけだが、修正に伴う予期せぬ進行不能 を除外できる 13
頼るしかない 多分最低限の保証は出来ている…と思う 自動プレイが通ればリリースしよう! 14
自動プレイで見つかった事例 • コリジョン調整でギミックにアクセスできなく なっていた • BoxColliderのIsTriggerのチェックが外れて進行で きなくなっていた しっかり再チェックが大変な要素は見つけている 15
デプロイの流れ • 修正してsubmitすると自動ビルドされる • 自動ビルドが終わると自動プレイが始まる • 全行程が成功すると最後に成功したビルドが steamの開発用ブランチにデプロイ出来る ※基本深夜に1回デプロイされる 更新しました ビルドしたんで 自動プレイして OKでした 深夜にアップす るよ 16
ビルドエンジニアに感謝 Jenkinsから実行される自動プレイは3倍速実行で OBS録画されるので、イテレーションが早い 17
自動プレイの実装のざっくり解説 • 超シンプル • 記録中と再生中で専用のシングルトンが生成 • 再生中はプレイヤーの行動結果を記録 • 記録中はプレイヤーの操作処理をバイパス それだけですが、次ページから簡単解説します 18
自動プレイの中身 • 行動データーはInterface • 各行動に合わせてclass作成 Interfaceに意味は無いですclassでもOK 19
自動プレイ情報を可視化すると こんな感じで経路が記録されて 黄色いところでギミックアクセスしてます 可視化・編集ツールの作成 おすすめします 20
自動プレイの記録コードの一部 記録用classに 行動毎の記録関数を作成 21
自動プレイの記録コードの一部 Playerやギミックで 記録処理を呼び出す。 こちらはPlayerの 更新コード 22
自動プレイの記録 記録無効 プレイヤー更新 入力情報 行動 行動結果を記録 記録有効 移動 ギミックアクセス etc 23
自動プレイの再生コードの一部 再生用classでは行動完了 したら 次のデーターを取り出す。 一定時間完了しないとき はエラーにする。 24
自動プレイの再生コードの一部 再生用class続き 25
自動プレイの再生コードの一部 再生用class続き 26
自動プレイの再生コードの一部 プレイヤー側 各ステートで 必要な行動を処理 27
自動プレイの再生 再生無効 プレイヤー更新 入力情報 行動 行動情報 再生有効 行動結果を確認 次の行動を取り出し 目的地か? 正しいギミックに アクセスしたか? etc 28
圧倒的安心感 • 結構強気にバージョンアップを繰り返せた • この記事を書いているタイミングでは 賛否両論の評価を頂けた 29
但し自動プレイは万能じゃない 以下の不具合は自動プレイで見つからなかった • ポーズしなくなっていた • 敵登場演出中に足踏みが止まらなくなっていた • ゲームオーバーからタイトルに戻ると画面が変 • 足跡が出ない、足音の種類が一致していない 30
そして バージョンアップは不具合修正・調整だけじゃない 31
HDRPからURPへの移行 32
HDRPを捨てる決意 社内でのチェックではD3D11ならば安定していた が海外からのレビューでとにかく不安定との事 URPならモバイル含め幅広く使われていて 安定しているハズ! それにきっと負荷も軽いハズ! 見切り発車良くない 33
環境とか進め方とか • 環境はURP17 deferred+ HDR • 移行期間はおよそ2ヶ月(1日の稼働率は70%未満) • 異なる種類の問題全てをほぼ同時に進行する事で 大きな問題が残らないように進行 34
移行の為に必要だった主な作業 • シェーディングモデル5種類のシェーダー作成 • 全マテリアルのURP移行(ShaderGraphで約70) • 一部VFX Graphの再構築 • テッセレーションの為にshaderlabコードを作成 • 必須プロセスを含む特殊描画4種対応 • ライティングをベイク方式に移行 • 水面システムの作成 35
シェーディングモデルの移行 対象は以下 • Subsurface Scattering • Hair • Fabric • Translucence • Eye 36
シェーディングモデルの解決方法 URP+ShaderGraphのカスタムライティング機能 シェーディングモデルをhlslで記述出来る ShaderGraphからはUnlitで出力 37
でもシェーディングモデルの専門家じゃない カスタムライティング使うのも初めて シェーディングモデル調査もしないといけない こういうページ見て 「数式はいいコードを出せ」って思わないといけない https://simonstechblog.blogspot.com/2015/02/pre-integrated-skin-shading.html 38
救世主到来 39
Antigravityとは? AI総合開発環境 エディター内のチャットでAIに指示を出すことで 必要なソースコードの生成・編集もしてくれる 40
どうしてAntigravity? 類似製品を幾つか使った結果、 個人的にはお金と成果のバランスが良い気がした • Cursor … 賢いがクレジット消費が爆速 • Antigravity … 使用制限をあまり気にしなくて良い • GitHub Copilot … バグの調査もままならない 41
AIにお願い チャット欄に お願いを書くだけで、それっぽいものが作られる URP17のカスタムライティングを使ったPre-Integrated Skinシェーダーの実装依頼 依頼内容: Assets/Shaders/Skin/skin.hlslを作成 URP17のShaderGraphから呼び出されるカスタムライティングによるPre-Integrated Skinに基づいたシェーディングモデル のコードを作成 Main Lightの対応は不要Additional LightsとAdaptive Probe Volumesに対応して 併せてLUTを生成するツールも作成して下さい LUTはScriptableObjectに出力パスを含んだパラメーターを記録して、出力ボタンで再生成できるようにして 参照: ライト情報へのアクセス方法については以下を参考にして https://docs.unity3d.com/ja/current/Manual/urp/lighting/custom-lighting-introduction.html https://docs.unity3d.com/ja/current/Manual/urp/use-built-in-shader-methods-lighting.html https://docs.unity3d.com/ja/current/Manual/urp/use-built-in-shader-methods-additional-lights-fplus.html https://docs.unity3d.com/ja/current/Manual/urp/use-built-in-shader-methods-indirect-lighting.html 42
AIが数分でやってくれました 簡単なツール類はほぼ完ぺきに作ってくれる。 ライティングのサンプルがずれたりするので、 HLSLの細かい部分を修正するかして貰って終わり。 43
無事移行完了 予定より早く移行を完了出来た AIすごい 44
ライティングの移行 • Deferred+での1カメラのライト上限256個 (一つのステージに30~500個くらいの点光源) • Point lightがサイズを持たない,Specular切れない (一番致命的全てのライトに鋭いハイライトが発生する) • Area Lightがベイク専用, Tube Lightがない ベイクするしかない 45
ライトベイクの問題 一括でベイク出来ない 至る所で他のステージのメッシュが重なっている 46
ライトベイクの問題解決の兆し 公式ページで対策を発見 https://docs.unity3d.com/ja/current/Manual/urp/probevolumesbakedifferentlightingsetups.html 47
ベイクの解決方法を検証する 凄く裏技感を感じる…が検証したら確かに動く! 1. 2. 3. 4. ライトプローブだけの運用にする 最初に全部入れてプローブの位置を決定する プローブポジションを固定してから、重ならないメッシュの 組み合わせでシナリオをベイク 適切なタイミングでライティングシナリオをブレンドする 48
ベイクもAIに補助してもらう 補助するツールを10分位でAIに作ってもらった • ライトマップ設定を探すツール(ライトプローブだけにするため) • ベイクシーンの表示制御ツール 49
ベイク問題も解決したが ベイク時間だけはAIにも短縮できず 結構な時間を調整とベイクに費やした 50
ポスプロ&特殊描画移行の問題 かなりの数があるので全てを作ることは出来ない 51
ポスプロ&特殊描画はOSS主体 先人に感謝! • Auto Exposure https://github.com/Lepsima/Auto-Exposure-Unity-6-URP • Screen Space Reflection https://github.com/mseonKim/URP-ScreenSpaceReflection • Physically Based Sky + Cloud https://github.com/jiaozi158/UnityPhysicallyBasedSkyURP https://github.com/jiaozi158/UnityVolumetricCloudsURP • Volumetric Fog https://github.com/CristianQiu/Unity-URP-Volumetric-Light • Water しっくりこなかった 52
でもOSSはHDRPの機能と同じではない それにちょっとバグっぽい挙動する そうだAIに手伝ってもらって改造しよう! 53
改造事例 Auto Exposure OK Google! 見た目と処理をHDRPに近づけて できました 54
修正事例 Volumetric Cloud OK Google! Volumetric Cloudの雲のアニメーションがループしていないから修正して 制御用の変数のリセット周期とシェーダーが計算で使っている周期が一致していないみたい できました 55
作成事例 Local Volumetric Fogが別途必要だったので作成 Local Volumetric Fogの実装依頼 以下の条件を満たしたLocal Volumetric Fogを作って Volumetric Fogの直前に動作する URP17のRenderGraphに対応する Additional LightとLPVに対応する Raymarchingのステップ数をVolumeで変更する できました 56
テッセレーションの移行 残念ながら.shaderを自力で書いた Deferred+のパス構成等詳しくないままAIにお願い した結果上手く行かなかった。 もう二度と書きたくない。 57
これで一通り完了 後述のWater以外の移行は無事完了 URP版のリリースも間近 58
順調に見せかけて問題発生 描画負荷が爆裂問題 ライトをベイクしたのに数FPSしか出ない Frame Debuggerを確認すると信じられない数の Shadowが描画されている 追加ロードしたシーンに配置されている影付き点光 源がBake設定なのにRealtimeとして動作していた Awakeで無効化するスクリプトで解消 59
でも、なんやかんやあって およそ1.5倍速程度で動作するようになりました ※ただしこれはURPの力というよりは影描画の削減が大きい 60
URP移行を終えて • AIエージェントが強すぎる • シェーダーの様な専門作業の調査時間が大幅短縮 • 簡単なツールなら爆速で作ってくれる 本編開発の時に使っていれば… • 移行出来なくはない • 最初からベイク運用だったら難度は更に下がる • URPはライトが拡張されないと将来不安 • URPにしたから高速化するわけではない 61
AIを使ったR&Dのすすめ 62
きっかけはWater HDRPのWaterシステムの代替OSSを調査したが しっくりくるものが無かった UVスクロールか波形重ね合わせで自作を検討 63
欲が出た そもそも、HDRPのWaterシステムも 滝つぼのRippleの動きが好きじゃなかった 画像はHDRPのもの うねりを 被せただけに見える 64
こんな川が作りたかった Rippleで生まれた波紋が水流に合成されて欲しい 水流は障害物を避けて欲しい 65
AIなら作れるのでは? 結論 出来た 画像は今回作ったもの 波紋が水流に 溶け込んでいる Foam(泡)は失われた 66
AIが河川システムを作るまで ということで 具体的なステップを紹介しつつ 困ったことやAIを操るコツを紹介します 67
AIが河川システムを作るまで 前提: • ゲームプロジェクトとは別の検証専用プロジェクト • URP-ScreenSpaceReflectionと協調させる • バージョン管理はgit 68
AIが河川システムを作るまで 最初に全貌を伝えておいてコーディングさせない 作られたレポートを基にチャットで情報を足す 河川専用の水面システムの作成相談 依頼内容: 以下の要件を満たす水面描画システムを作成したい - URP17で動作する - RenderGraphに対応してURP-ScreenSpaceReflectionの描画タイミングより前に動作する - Deferred+で動作する - 水面メッシュを矩形とカーブに沿って作成できるようにする - 水面に発生する波紋はシミュレーションで作成する - 波紋生成コンポーネントや障害物コンポーネントでシミュレーションに介入できる - 別のコンポーネントから指定した位置での水面の高さを取得できる コーディングせずに構造の設計を行って日本語でレポートを作成して下さい 69
AIが河川システムを作るまで ある程度固まったら順番に実装を進める 細かい粒度で新規チャットで依頼する AIを信用できないときは実装プランを先に出させる 河川システム用のメインコンポーネントの実装依頼 依頼内容: 基底クラスコンポーネントから以下2つのコンポーネントを派生させる - 指定したサイズで矩形メッシュを作成するコンポーネント - カーブに沿ってメッシュを作成するコンポーネント 共通化できる情報は全て基底クラスに実装して 70
コード生成量は出来るだけ少なくする 一気にコードが生成されるとレビューがつらい 実際欲をかいてレビューを疎かにして苦しんだ 71
レビュー前にエラーと動作確認 そもそもエラーがあったり、 正常に動作しないコードが作られる事が多々ある 動くことを確認してからレビュー 72
細かくコミットする レビューがOKなら忘れずコミット 次の指示でAIがやらかすかもしれない 73
一つ出来たら次に進む コンポーネント等の具体的な名前が確定していたら AIが困らないように必ず名称で指示する RiverSurfaceBaseのRenderGraph対応 依頼内容: - RiverSurfaceBaseで作成されたメッシュをURP17のRenderGraphで描画されるようにして - G-Bufferのライティング後、URP-ScreenSpaceReflectionより前に描画を完了して -ライティングはAdditional Lightsのみに対応してMain Lightは今回は不要です -ライティングレイヤーにも対応して コーディングせずに実装プランを日本語でレポートして 74
出来るだけ細かく機能追加とチェック テッセレーションやシェーディングの基本指示 このテッセレーションは無事実装出来た…悔しい RiverSurfaceBaseのテッセレーション対応依頼 依頼内容: - RiverWater.shaderの描画をテッセレーション対応してください - 影描画は不要です - 調整パラメーターはRiverSurfaceBaseに実装して、マテリアルへのパラメーター受け渡しを行って下さい RiverWater.shaderのシェーディング修正依頼 依頼内容: - 直前のライティング済みバッファを使用して屈折表現を実装して - 同じく深度バッファを参照して深さに合わせて透明度を変更して - 透明度を調整するパラメーターはRiverSurfaceBaseに実装して 75
AIと一緒に悩むことも シミュレーションはコレジャナイを繰り返す RiverSurfaceBaseのシミュレーション対応依頼 依頼内容: RiverSurfaceBaseに水流のシミュレーション処理を追加してください 極力compute shaderだけで完結するような構造にして下さい 毎フレームランダムに波紋を発生させて下さい 河川をイメージして水流を計算してください ↑の依頼の前にパーティクルによるシミュレーションを試しましたが100x100mでは非現実的で全部巻き戻し ↓の実装結果は路面に雨が降ったようになっただけで、納得いく結果が得られず相談してみたりするが改善せず RiverWater.shaderのシミュレーション修正相談 雨が降ったような波紋が発生するだけで川の波の様には見えません 河川にらしい波を作る方法ないですかね? 76
閃きが成果につながると嬉しい 流れの激しい川の波の発生要因を妄想して試行する 偶然、以下が良い結果を出した GridRipple.computeのシミュレーション改善依頼 依頼内容: 現在波の発生にランダムな外力を適応していますが、川底の地形起因にしてみてはどうでしょうか 川底に砂利があったり、川の地形の隆起の変化や岩等があって通過するときの水流の速度変化や地形への衝突で波を発生 させてみてはどうでしょうか? 77
基本が出来たのであと少し 様子を見ながら機能を盛る GridRipple.computeのシミュレーション改善依頼 依頼内容: - 岩などの高低差が激しいところを中心にcurl noiseで渦感を出してほしい - 地形による凹凸による小波が大きな波が被さった時にも発生するのは不自然なのでどうにかなりませんか? RiverWater.shaderのシェーディング改善依頼 依頼内容: 波による凹凸がシミュレーショングリッドよりも密度が低く感じる シミュレーショングリッド間の勾配に合わせて凹凸を作成できないでしょうか? RiverWater.shaderのシェーディング改善依頼 依頼内容: 水流の速度に応じた空気抵抗で周期的な波を発生させたい 78
そして3週間が経過 ベイク待ち等の隙間時間で開発を進めた結果 それっぽいものが出来た 79
立ちはだかる最適化の壁 しかし奇跡的に面白い結果が出たものの 100x100mのサイズで動作して欲しい 80
壁は高い 約70MBと1600x1600を毎フレーム3回書き込み テクスチャ種別 100x100m解像度 フォーマット 100x100mサイズ 地形情報 800x800 A16R16G16B16 5MB 障害物水流情報 800x800 A16R16G16B16 5MB シミュレーションバッファx2 1600x1600 A16R16G16B16 40MB 描画用勾配情報 1600x1600 A16R16G16B16 20MB 主 な 更 新 処 理 水流更新 前フレームで発生した波を水流情報に沿って流す、軽量処理 波紋生成 流れた波に地形を考慮した波の発生を行う、超重量処理 勾配 シミュレーション結果を描画用の勾配情報にする、軽量処理 81
まずは簡単な最適化指示 無駄な計算や未使用変数の削除依頼 消してはいけないコードも消すので要注意 GridRipple.computeの最適化依頼 対象: 該当シェーダー全体 依頼内容: 未使用な関数を削除 各関数内で無意味な計算の削除 各関数内で不要な計算の削除 結果発生した未使用な変数を削除 削除されるシェーダーに紐づいたC#側の変数とバインディング処理の削除 82
ここでレビューをさぼったツケが 想定していたフローと実際のフローが違う 現実 想定 水面下の地形 初期化時のみ 初期化時のみ 水面下の地形 障害物 水流ベイク 障害物 水流ベイク 水流更新 水流更新 毎フレーム 毎フレーム 波紋生成 波紋生成 勾配計算 勾配計算 83
レビューと修正指示は細かく確実に 焦って雑な修正指示を出してレビューを怠ると AIは平気で嘘をつくので要注意 FlowMapと障害物情報の入ったテクスチャは初期化時に一度だけ作れば良いです 毎フレーム更新しないようにして下さい わかりました (直したとは言っ ていない) 84
レビューと修正指示は細かく確実に このように具体的な名称と対処方法で指示して 成果物を必ずレビューする CombinedInteractionが毎フレーム更新されています パラメーター更新時にdirty判定で必要な時のみ更新するようにして下さい この変更でシミュレーションに支障がないことを確認して問題があれば日本語でレポートして下さい 85
AIは時々凄い シミュレーション用のテクスチャフォーマット変更 64bit(A16R16G16B16)20MB=>32bit A2R10G10B10_UNORMやR11G11B10_FLOAT を試すも小さい値の蓄積誤差で上手く行かず ごねたらまさかの提案で解決 最後の手段です。 R32フォーマットでテクスチャを作成して高さ情報に14bitを割り当てて、独自にパッ キングを行いましょう。 これによって0.12mmの精度を確保する事が出来ます。 パッキング処理でALUが消費されますが、それ以上の効果が期待できます。 86
AIを最適化に使って便利だなと思った事 地形と水流の勢いから波を作るのがとんでもない計算量 計算量を半分にしたいが係数の辻褄合わせが面倒 辻褄合わせもお願いしたらなんかやってくれた GridRipple.computeのUpdatePhysicsカーネルのチェッカーボード化依頼 依頼内容: UpdatePhysicsの計算負荷が高いので1フレームの計算量を半分にしたい 対象ピクセルをチェッカーボード形式で1つ飛ばしになるようにしてほしい ダイバージェントを防ぐ為にif分岐ではなく、スレッド数を半分にして位置をオフセットしてチェッカーボード化して 1/2フレーム実行になるので必要な係数をスケールして下さい 懸念や問題があれば事前に日本語でレポートして下さい できました 87
そして最適化完了 約37.5MBと1600x1600を毎フレーム2.5回書き込み テクスチャ種別 100x100m解像度 フォーマット 100x100mサイズ 障害物&波紋作成情報 800x800 A16R16G16B16=>A8R8G8B8 5MB=>2.5MB 水流情報 800x800 A16R16G16B16 5MB シミュレーションバッファx2 1600x1600 A16R16G16B16=>R32 40MB=>20MB 描画用勾配情報 1600x1600 A16R16G16B16=>A2R10G10B10 20MB=>10MB 主 な 更 新 処 理 ½! 波紋生成 水流更新 勾配 流れた波に地形を考慮した波の発生を行う、超重量処理 チェッカーボードの波を水流情報に沿って流して馴染ませる、軽量処理 シミュレーション結果を描画用の勾配情報にする、軽量処理 88
AIでR&Dは相性が良い • 専門分野を学ばずにアイディアを形に出来るかも • でもAIはまだ万能ではなくコントロールが必要 • 問題が起きにくく • 起きても小規模に • そして発見しやすく • その為のコードレビュー力&デバッグ能力は必須 将来AI性能が向上したらもっと便利になりそう 89
AIが作った河川システム公開中 ということでMITライセンスで公開中です ご自由に改造してください https://github.com/hexagit/RiverWater 90
Screen Space Fluid Renderingもやってみた HDRPでメッシュを飛ばしていたのが気になっていた 既存技術は(なりふり構わなければ) 短時間で実装できる パーティクルの動きはシェーダー直書きです 91
■■ノニラヤもよろしくお願いします 今回の講演の内容が反映された ■■ノニラヤはSteamで販売中です 興味が湧いたら是非ご購入下さい https://store.steampowered.com/app/3034350/_/ 92
質疑応答 93
ご清聴ありがとうございました 94