対応状況

いま何がコンパイルできるのか、そして Udon が決して実行できない C# の部分について。

更新日 2026-09-03

Udonite は日常的な C# のかなり広い範囲をコンパイルします。以下の構文はすべて、出力をアセンブルして実機の Udon 仮想マシンで動かすテストで確認しています。

コンパイルできるもの

型とメンバー

class struct interface enum 入れ子の型 自作クラスをフィールドやローカル変数として使うこと 制約付きジェネリクス 既定実装を持つインターフェースメソッド プロパティ 自動プロパティ 式形式のメンバー インデクサ 拡張メソッド params 省略可能引数 名前付き引数 out / ref タプルと分解 ローカル関数 静的ヘルパークラス

レコードとレコード構造体:位置指定のコンストラクタ、with、値等価性、ToString、分解。static フィールドは constreadonly である必要があります(後述)。

文と式

if switch switch 式 for foreach while do break continue パターンマッチング 型パターン is not null 関係パターン プロパティパターン when ガード ?. ?? ??= 書式指定子付きの文字列補間 nameof 算術演算子 ビット演算子 シフト演算子 [Flags] enum HasFlag char の演算 配列 多次元配列 範囲とインデックス Array.Sort Find FindAll Exists IndexOf Resize Copy Fill ConvertAll List<T> Dictionary<K,V> HashSet<T> Queue<T> Stack<T> LINQ Action / Func フィールド メソッドグループ マルチキャストの += / -= C# event 他のビヘイビアの public メソッドへのデリゲート 値としてのラムダ StringBuilder string.Format Split Join Substring Replace Trim PadLeft null 許容値型 HasValue GetValueOrDefault

関係パターンは is > 5 and < 10 のように書きます。範囲とインデックスは arr[^1]arr[1..3] です。配列・リスト・ディクショナリに対する LINQ:SelectWhereOrderByThenByGroupByFirstAnyAllSumAverageMinMaxCountTakeSkipTakeWhileSkipWhileDistinctReverseConcatZipUnionIntersectExceptSequenceEqualToArrayToListToDictionaryRangeRepeat、およびそれらの連結。LINQ や List<T>Array のヘルパーに渡したラムダは、呼び出し箇所に展開されます。メソッドグループは Action done = Cleanup; のように書きます。他のビヘイビアの public メソッドへのデリゲートと、値としてのラムダはどちらもコンパイルできます。キャプチャするラムダには一つだけ制約があり、後述します。

Unity と VRChat

GetComponent<T>() TryGetComponent<T>(out T) Instantiate Destroy SetActive Transform 物理クエリ Mathf Vector3 Quaternion Color Random Time コルーチン yield return null WaitForSeconds WaitUntil 入れ子のコルーチン StartCoroutine(Run()) StartCoroutine(nameof(Run)) StopAllCoroutines Invoke InvokeRepeating CancelInvoke async メソッド Task UniTask UniTaskVoid await VRCPlayerApi Networking ピックアップ ステーション UdonBehaviour 参照 SendCustomEvent SetProgramVariable GetProgramVariable<T>

InvokeInvokeRepeatingCancelInvoke は public メソッドに使えます。async メソッドは voidTaskUniTaskUniTaskVoid を返せます。await Task.Delay(...) や他の async メソッドの await も可能です。ネットワークにあるものすべて。

Udon が決して実行できないもの

これらは UDN0011 で拒否されます。拒否のメッセージがその旨と、代わりにどうすべきかを示します。

構文 理由と、代わりに書くこと
trycatchthrow Udon に例外はありません。先に条件を確認してください。
書き換え可能な static フィールド ビヘイビアごとに独立したヒープを持つため、static は「共有された一つの値」ではなく「ビヘイビアごとに一つの値」になってしまいます。どれか一つのビヘイビアのフィールドを参照する形にしてください。
Awake Udon はディスパッチしません。Start を使ってください。
CompareTaggameObject.tag Udon はタグを公開していません。レイヤーや名前を比べるか、参照を持ってください。
IsInvokingApplication.isPlayingTime.timeScaleAudioListenernew GameObject()ScriptableObject の派生 Udon が公開していません。
インスペクタに出す自作クラス・構造体の配列 Udon がデシリアライズできません。プリミティブ、Unity の型、ビヘイビアへの参照の配列を使ってください。
素のオブジェクト(ビヘイビアでないもの)のメソッドを指すデリゲート、および Unity がシリアライズする public フィールドに置いたデリゲート どちらもワールドまで持ち込めません。
生成したメソッドの外まで持ち越すキャプチャ付きラムダ(フィールドへの代入、戻り値、引数として渡す、ループ内での生成) キャプチャした変数はビヘイビアの単一のヒープにあるため、保存したクロージャは次の呼び出しで古い状態を見てしまいます。キャプチャしないラムダは自由に保存できます。キャプチャするものは、同じメソッド内で呼ぶローカルとしてなら動きます。

まだ対応していないもの

UDN0002 で拒否されます。これは Udon ではなく Udonite 側の不足で、要望のあったものから解除されていきます。

  • リストパターン(is [1, ..])。
  • 単独の式としての typeof(T)、および非ジェネリックの GetComponent(typeof(T))
  • 再帰(UDN0012)、ループ内でのキャプチャ付きラムダ、checked 演算。

拒否で行き詰まったら、その拒否の行を添えて Issue を立ててください。名前さえ分かれば、たいてい一日ほどで対応できます。

Something went wrong. Reload