🎮

AIでUdonSharpをそれなりに上手く書けるSkillsを公開しました

に公開

はじめに

AIにUdonSharpを書かせようとしたことがある人なら、たぶんわかると思います。

あいつら、平気で List<T> を使ってくる。async/await も書いてくる。同期変数を山盛りにして、挙句の果てに、こっちが丁寧に書いたコードまで壊してくれる。

最初は単純な好奇心でした。AIにUdonSharpを書かせたらどうなるんだろう、と。結果、「使い物にならない」が第一印象。でも、工夫を重ねていったら意外と形になってきて、最終的にはUdon未経験の友達がAIでギミックを自作して公開するところまでいけました。

この記事は、そこに至るまでの試行錯誤と、作ったSkillsの話です。

TL;DR

AIコーディングエージェント向けに、UdonSharp専用のスキル・ルール・バリデーションフックを作って公開しました。

  • 3つのスキル: UdonSharpコーディング / VRC World SDK / 自己更新(リノベーター)
  • 3つのルール: コンパイル制約 / ネットワークパターン / 同期選定
  • バリデーションフック: PostToolUseで禁止構文を自動検出
  • 対応ツール: Claude Code / Codex CLI / Gemini CLI
  • 対応SDK: VRChat SDK 3.7.1〜3.10.1

リポジトリ: niaka3dayo/agent-skills-vrc-udon

ちなみに現時点(2026年2月)で一番安定して意図を汲んでくれるのは Claude Code(Sonnet 4.6 / Opus 4.6)でした。これはテスターの間でも満場一致です。

背景: AIはUdonSharpを知らない

VRChatのワールド開発で使われるUdonSharpは、C#からUdon Assemblyにコンパイルするトランスパイラです。見た目はC#なんですが、制約がかなり厳しい。

普通のC#で使えるもの UdonSharpでは
List<T>, Dictionary<K,V> コンパイルエラー(配列で代替)
async/await 使えない
try/catch 使えない
LINQ 使えない
ラムダ式 使えない

AIのモデルはC#の知識が豊富なので、見た目はきれいだけどコンパイルすら通らないコードを自信満々に出してきます。

そして本当に厄介なのがネットワーク同期です。VRChatはマルチプレイヤー環境なので、プレイヤー間でデータを同期する必要がある。同期変数の選定、オーナーシップの管理、後から入ってきたプレイヤー(Late Joiner)への状態伝達。こういったことをAIが正しく設計できるかというと、まあ、ほんの数回書かせて「きつい」と思いました。

Skillsが来た

スキルを作る前は、READMEにUdonSharpの制約をまとめて毎回AIに読ませていました。でも、毎セッション最初からコピペしなきゃいけないし、読ませても結局間違えるし、そのたびに書き直す。

そんな中、Claude CodeにSkillsという機能が公開されました。すぐに飛びつきました。

これなら制約やパターンを構造化して、AIが自動で参照できる。毎回手動で教え直さなくていい。「これだ」と思って作り始めたのが、このリポジトリです。

作ったもの

リポジトリ構成

agent-skills-vrc-udon/
├── agent-docs/              # 正本(Single Source of Truth)
│   └── skills/
│       ├── unity-vrc-udon-sharp/        # UdonSharpコーディング
│       ├── unity-vrc-world-sdk-3/       # VRC World SDK
│       └── unity-vrc-skills-renovator/  # 自己更新
├── .agents/    # Agent Skills 共通規格(シンボリックリンク)
├── .claude/    # Claude Code ルール・フック
├── .codex/     # Codex CLI 用(シンボリックリンク)
└── .gemini/    # Gemini CLI 用(シンボリックリンク)

agent-docs/ にすべてのドキュメントの正本を置いて、各AIツールの設定ディレクトリにはシンボリックリンクで配っています。一箇所直せば全ツールに反映される設計です。

3つのスキル

unity-vrc-udon-sharp

UdonSharpでコードを書くときの中核スキルです。

このスキルの意図は「AIが最初から正しいUdonSharpコードを生成できるようにする」こと。具体的には以下を含んでいます。

  • コンパイル制約: 使えない構文と、その代替パターンの対応表。List<T> の代わりに配列を使う、try/catch の代わりにガード節でチェックする、など
  • 同期パターン: Continuous / Manual / None の選び方をデシジョンツリーで示し、データバジェット(同期データ量の上限)の考え方も含む。サンプルコードは複数パターン用意しました
  • APIリファレンス: VRCのイベント一覧、ネットワーク API、プレイヤー API など、使用頻度の高いAPIをまとめたもの
  • トラブルシューティング: よくあるエラーと原因・対処法
  • チートシート: 一枚で全体像を把握できる早見表

unity-vrc-world-sdk-3

ワールドをアップロードするまでの設定全般をカバーするスキルです。

  • コンポーネント設定: VRC Scene Descriptor、Spawn Point、Mirror など各コンポーネントの正しい設定方法
  • レイヤー構成: VRChatが予約しているレイヤーの仕様と、正しいレイヤー設定
  • ライティング・パフォーマンス: ベイクの設定、描画コスト、最適化のポイント
  • アップロード手順: VRChat SDKを通じたアップロードフロー

unity-vrc-skills-renovator

UdonSharpもVRC SDKも頻繁にアップデートがあります。手動で追いかけるのは現実的じゃない。

だからスキル自体が自分を更新できるようにしました。Web検索で最新の変更履歴を取得し、既存のスキル内容を書き換えるリノベータースキルです。変更履歴のソースや検索クエリもリファレンスとして持っているので、「何をどこで調べてどう更新するか」までスキルの中に含まれています。

バリデーションフック

ルールをどれだけ書いても、AIはコンテキストが長くなると忘れます。そこで、AIがコードを生成した直後にPostToolUseフックでチェックを走らせています。

やっていることはシンプルで、List<T>asynctry/catch など、UdonSharpで使えない構文がコード内にないかを正規表現で検出するだけです。機能は最小限。でも、これがあるだけでコンテキストの消費を抑えつつ、簡易的なテストとして機能します。使っているAIモデルもプランもバラバラなテスターがいたので、モデル差を少しでも埋めるための保険でもありました。

プロジェクト規約ファイルの併用

テストを重ねて実感したのが、Skillsだけでは不十分ということです。

各AIツールにはプロジェクトルートに置く規約ファイルの仕組みがあります。

ファイル 対応ツール 公式ドキュメント
CLAUDE.md Claude Code Memory - Claude Code
AGENTS.md Codex CLI Custom instructions with AGENTS.md
GEMINI.md Gemini CLI Provide context with GEMINI.md files

プロジェクトの要点や、スキルを明示的に使わせる指示をここに書いておく。スキルが「知識」だとすれば、規約ファイルは「このプロジェクトではこう使え」という文脈です。この組み合わせが現状のベストプラクティスだと思っています。

3人に使ってもらった

自分だけで使っていても「自分にしか使えないもの」になりかねません。意図的に、UdonSharpのスキルレベルが異なる3人に使ってもらいました。

KAEDEさん ── Udon未経験

KAEDEさんは3Dモデリングやワールド販売をしているフレンドです。IDEもCLIも触ったことがない。でも、私がUdonでギミックを作るのをずっと見ていて、興味は持ってくれていました。

「AIで書かせることができるかも」と伝えたら、かなり乗り気になってくれた。

結果、KAEDEさんは自分でギミックを開発して、公開するところまでいきました。

正直、驚きました。スキルが「Udonを書けない人の最初の一歩」として機能した瞬間でした。

匿名の友人 ── 少しだけUdonを書いたことがある

名前の掲載許可が取れなかったので匿名ですが、かなり有益なフィードバックをもらいました。

最初の反応は「動いているけど、これが正しく書けているのかわからない」でした。そりゃそうです。AIが書いたコードが正しいかどうかの判断基準がまだない段階では、動いていても不安になる。

でも、この人はかなり真面目な人で、ちゃんと動いているものの仕組みを理解しようとする姿勢がありました。使っていくうちにコツをつかんで、UdonSharpの読み書きが前よりできるようになっていった。今ではAIと相談しながら必要なものを一通りそろえるくらいはできるようになったみたいです。

「AIを使ううちにコードが読めるようになる」というのは、作った時点では想定していなかった副産物でした。

ヨドコロちゃん ── UdonSharp熟練者

ヨドコロちゃんは、UdonSharpに精通した経験者です。書いてきた人だからこそ、難しいことを難しいと理解した上で試してくれるし、AIが出したコードの良し悪しも的確に判断できる。

そしてフィードバックの質が、すごかった。

意見をMarkdownファイルにまとめて送ってくれるんです。同期まわりの問題点、改善案、具体的なコード例付き。さらに、スキルをアップデートした後に「どのAIモデルが一番意図を汲んでくれたか」まで、モデルごとに記録して共有してくれました。

※ 神かよ。

このフィードバックのおかげで、同期関連のドキュメントはほぼ別物と言っていいくらい書き直しました。ヨドコロちゃんがいなかったら、今のスキルの品質には絶対にたどり着けていません。

そしてもうひとつ、印象的だったこと。ヨドコロちゃんは一行もコードを手書きせずに、複雑な同期ギミックをAIに出力させていました。UdonSharpの仕様を熟知しているから、AIに対して「何を、どう同期させたいか」を的確に伝えられる。要件定義がしっかりしていれば、AIはちゃんと応えてくれる。これは後述する「一番大事なこと」に直結する話です。

一番ハマったところ: 同期

同期なしのギミックなら、スキルを入れるだけでそこそこ動くコードが出てきます。

問題は同期でした。Skills導入前のAIは同期まわりで何をやらかすかというと:

  • 同期変数の乱立 ── 変数を片っ端から [UdonSynced] にする。通信帯域が死にます
  • 同期方式の選定ミス ── Continuous / Manual / None の使い分けを間違える
  • オーナーシップ無視 ── 誰がその変数を書き換える権限を持つか考慮しない
  • Late Joiner問題 ── 後から入ったプレイヤーに状態が正しく伝わらない

これらはUdonSharp特有の、かつ実際にワールドを動かさないとわからない問題です。

テスターからのフィードバックを受けて、同期方式の選定フレームワーク(デシジョンツリー)、データバジェットの考え方、具体的な同期パターンのサンプルコードを大幅に追加しました。その結果、Skillsを入れた状態ではこれらの問題はかなり改善されます。ポン出し一発で完璧とは言えませんが、同期まわりも含めて、Skillsがあるのとないのとでは品質がまるで違います。

ただし、ここで一番大事なことがあります。

AIの出力品質を決めるのは、Skillsよりも「人間がAIに意図を正しく伝えられるか」です。

ヨドコロちゃんの例がわかりやすい。UdonSharpの仕様を熟知しているヨドコロちゃんは、AIに「何を、どう同期させたいか」を的確に言語化できます。結果、一行もコードを手書きせずに、複雑な同期ギミックを正しく出力させていました。Skillsはあくまで土台で、その上に乗る要件定義の精度が最終的な品質を決める。

逆に言えば、Udonの知識がなくても、「こういう動きをさせたい」「このタイミングで全員に反映させたい」のように挙動を具体的に伝えられれば、Skillsがその要求をUdonSharpの正しいパターンに橋渡ししてくれます。KAEDEさんがギミックを作れたのも、自分の作りたいものを明確に持っていたからだと思っています。

組み合わせでもっと変わる

このSkillsだけを単体で導入するのもいいですが、他のSkillsやツールと組み合わせるともっと効果が出ます。

  • Context7: ドキュメント検索系のSkill。VRChat SDKやUnityの公式ドキュメントをリアルタイムで参照できるので、スキルに書いていない最新情報を補完できます
  • Unity / C# / オブジェクト指向のスキル: UdonSharpの土台はC#です。汎用的なC#のスキルと組み合わせると、UdonSharp固有の制約以外の部分(ロジック設計やクラス設計)の品質が上がります
  • エディタ拡張: ここは声を大にして言いたいんですが、**Unityのエディタ拡張は普通のC#**です。UdonSharpの制約を受けません。つまりAIが最も得意なフィールド。インスペクターのカスタムUIやメニュー拡張、ビルドパイプラインなどはスキルなしでもかなり上手く書いてくれます。ここは感動的でした

学んだこと

  • 一番大事なのは、AIに意図を明確に伝えること。Skillsは土台を作ってくれるが、最終的な品質を決めるのは人間側の要件定義。「何を作りたいか」が明確なほど、AIの出力は正確になる
  • テスターのスキルレベルは意図的にばらけさせる。初心者のフィードバックと熟練者のフィードバックは見える景色がまったく違う
  • ドキュメントの正本は一箇所に。複数のAIツールに対応するとき、シンボリックリンクで配る構成は更新の手間を大幅に減らしてくれる
  • フックは保険になる。シンプルでも、書いた直後にチェックが走るだけで品質が安定する
  • AIとの対話を繰り返すうちに、何を指示すればいいかがわかってくる。最初は漠然とした指示しか出せなくても、試行錯誤するうちに要件の伝え方が研ぎ澄まされていく

おわりに

AIにUdonSharpを書かせるのは、ポン出し一発で完璧とはいきません。でも、Skillsを入れればかなり改善するし、同期ギミックだって作れます。

大事なのは「自分が何を作りたいか」を明確にすること。熟練者が一行もコードを書かずに複雑な同期ギミックを出力できたのは、AIが優秀だったからじゃなくて、要件を的確に伝えられたからです。Skillsはその橋渡しを助けるツールでしかない。

Udon未経験の人がギミックを作れるようになった。熟練者の作業が楽になった。使っているうちに、AIへの指示の出し方がうまくなっていった人もいる。狭い分野でも、AIの使い方を工夫すれば可能性は広がる。

正直、公開するかは迷いました。でも、VRChatでは色んなことをやる人たちがお互いに化学反応を起こしていて、このスキルもその反応のひとつになれたらいいなと思っています。まだ試行錯誤の途中ですが、次に作る人の手間が少しでも減れば。

興味がある方はフォークして、壊して、直して、もっといいものにしてください。

リポジトリ: niaka3dayo/agent-skills-vrc-udon

謝辞

このSkillsは一人では作れませんでした。

テストに付き合ってくれて、丁寧なフィードバックをくれた KAEDEさん、匿名の友人、そして同期まわりのドキュメントを別物にしてくれた ヨドコロちゃん に感謝します。

参考

Discussion