床と壁ができて、光も 入りました。次は「入口のボタンを押すと照明が消える」をやりたくなります。
ところが、Unityにボタンを置いても何も起きません。Animatorを付けても、VRChatの「使う」操作にはつながりません。どこかでプログラムが必要になるのですが、その境界がどこにあるのか分かりません。
この記事では、SDKの部品だけで作れることと、Udonが必要になることを対比で整理します。コードはまだ書きません。
この記事でわかること
- 置くだけで動く部品と、プログラムが要る場面の境界
- Udon・UdonSharp・Udon Graphの関係
- コードが動くのは、サーバーではなく各プレイヤーのPCだということ
- 書き始める前に知っておくと詰まらない3つのこと
境界は「操作に最初から答えてくれるか」
VRChat SDKは、VRChat向けの部品カタログのようなものです。置くだけで動くものが、思ったよりたくさんあります。

置くだけで動くのは、こういうものです。
- 歩ける床、ぶつかる壁(ColliderとRigidbody)
- 鏡に映る(VRC Mirror Reflection)
- 椅子に座る(VRC Station)
- コップを拾って投げる(VRC Pickup。位置を共有するなら VRC Object Sync も部品)
- 空間音響、ライト、マテリアル、Skybox
- 配布されている動画プレイヤーやギミックのPrefabを 置くだけ
一方、こういうものはUdonが要ります。
- 壁のスイッチを押すと、あのライトが消える
- ボタンを押すと、扉が開く
- 入ってきた人に説明パネルを出す
- 点数を数えて、掲示板に表示する
並べてみると、共通点が見えてきます。置いた部品が、来訪者の操作に最初から答えてくれるならUdonは不要。「このボタンを押したら、あのライトを消す」のように、自分で組み合わせを決めるならUdonが要ります。
境目にあるものもあります。配布Prefabの中身はUdonで書かれていますが、使う側は 書きません。逆に、AnimatorやUnityのUIボタンを置いただけでは、VRChatの「使う」操作にはつながりません。
まずはカタログを探す、それでも足りなければ自分で書く。この順番で進めると、覚える量がずっと減ります。
UdonとUdonSharpの関係
名前が似た言葉が3つ出てくるので、役割で分けます。

- Udon は、VRChatがワールド内で動かしてよいプログラムの仕組みです。実体はこれです
- Udon Graph は、ノードを線でつないでUdonを作る方法です。配線図を描くイメージです
- UdonSharp は、同じUdonを、C#に似た文章で書く方法です
大事なのは、GraphとUdonSharpは書き方の違いで、動く実体はどちらもUdon だということです。「Graphで始めた人は別世界」ではありません。
このシリーズではUdonSharpを使います。文章のほうが検索でヒットしやすく、記事のコードをそのまま試せて、後から何を変えたかも見やすいからです。古い記事に「Graphが正式でUdonSharpは非公式」と書かれていても、いまは気にしなくて構いません。UdonSharpはSDKに含まれています。
書いたコードは、そのままVRChatに届くわけではありません。

書いた文章を、VRChatが実際に動かせるデータへ変換する工程を コンパイル と呼びます。保存すると自動で走るので、自分で操作することはありません。変換された結果を、シーンのオブジェクトに取り付けて初めて動きます。
手順書を書いただけでは家電は動かない。変換して、家具の受け口にセットする。そういう関係です。
書き始める前に知っておく3つ
コードの文法より先に、この3つを知っておくと詰まりません。
1. プログラムは「上から最後まで読み切る」ものではない
Udonのコードは、小説のように最初から最後まで走るわけではありません。待ち受け です。
「このオブジェクトが使われたとき」「誰かが入ってきたとき」といったきっかけがあって、初めてそこの処理が動きます。このきっかけを イベント と呼びます。
最初に使うのは、ほぼ1つだけです。Interact() は「このオブジェクトが使われた」という通知を受け取る入口です。
だから、コードを書く前に決めるのは「どのタイミングで動かしたいか」になります。
2. プログラムは「そのオブジェクト」に付く
ワールド全体にプログラムを書くのではありません。家具1つ1つに頭脳を付ける イメージです。
スイッチのプログラムは、スイッチに付けます。消したいライトは、そこから参照でつなぎます。ライト側に付けても、スイッチを押したときには動きません。
「どこに付けるか」を間違えると、コードが正しくても何も起きません。これは初心者がいちばんよく踏む落とし穴です。
3. 最初は、自分の画面でしか起きない
これがVRChatならではの、いちばん大事な話です。

ライトを消すプログラムを書いて押すと、押した人の画面だけ 暗くなります。隣の人の画面は明るいままです。
これは壊れているのではありません。同じインスタンスにいても、各自のPCがそれぞれワールドを動かしているからです。全員の画面で消したいなら、同期 という別の仕組みが必要になります。
この話を知らないと、最初の成功を失敗だと思ってしまいます。まず自分の画面で動かし、共有したい部分を決めてから ネットワーク同期入門 へ進みます。
よくある誤解
先に潰しておくと、あとが楽になります。
| よくある誤解 | 実際は |
|---|---|
| UdonはVRChatのサーバーで動く | 各プレイヤーのPCで動きます。 専用のゲームサーバーはありません |
| 自分が消したライトは、自動で全員に伝わる | 最初は自分の画面だけ。 共有には同期が必要です |
| GraphとUdonSharpは別のエンジン | 書き方の違いだけ。 動く実体はどちらもUdonです |
| ワールドを出すには必ずUdonが要る | 床・鏡・椅子・Pickupだけなら不要 です |
| UnityのC#入門を先に終わらせる必要がある | 不要です。 VRChatのUdonSharpとして小さく始めれば足ります |
| プログラムが多いほど本格的 | 毎フレーム動く処理は重い です。最初は「起きたときだけ」動く形にします |
特に上の2つは、先に知っておいてください。ここを誤解したまま進むと、正常な動作が全部バグに見えてしまいます。
おまけ:先に知っておくと良いこと
- 動かないときに見る順番: (1) そのオブジェクトにUdonが付いているか (2) Consoleに赤いエラーが出ていないか (3) 使おうとしている対象は、本当にそのオブジェクトか (4) Inspectorの参照欄が埋まっているか。この4つ でほとんど解決します
- UnityのC#記事はそのまま貼らない: 変数やifの考え方は共通ですが、使えるAPIの範囲が違います。検索するときは「VRChat UdonSharp」を付けてください。詳しい制限は C#の対応範囲 で扱います
- 配布Prefabを分解しない: 動画プレイヤーなどのPrefabに自分のコードを混ぜると、原因が追えなくなります。使うときはそのまま置きます
- Masterは運営ではない: そのインスタンスで進行役になっているプレイヤーのことです。自分がMasterになることもあります。詳しくは 所有権を理解する で扱います
- 古い記事に注意:
VRC_Triggerを使う手順はSDK2時代のもので、いまは使えません。CyanEmuも公式のClientSimに置き換わっています
まとめ
Udonは、ワールドの部品に「自分で決めた反応」を足す仕組みです。
- 境界は「置いた部品が、操作に最初から答えてくれるか」
- Udon Graphとの違いは書き方だけ。実体はどちらもUdon
- コードは待ち受け。イベントが来たときだけ動く
- プログラムはワールドではなく、そのオブジェクトに付く
- 最初は自分の画面でしか変わらない。共有には同期が必要
判断に迷ったときの問いかけは、「これは、部品を置くだけで答えてくれるか?」 です。答えがイエスなら、コードは書かなくて済みます。
次は実際に手を動かします。最初のUdonSharp で、押すと色が変わるCubeを作ってみましょう。