対応状況
いま何がコンパイルできるのか、そして Udon が決して実行できない C# の部分について。
Udonite は日常的な C# のかなり広い範囲をコンパイルします。以下の構文はすべて、出力をアセンブルして実機の Udon 仮想マシンで動かすテストで確認しています。
コンパイルできるもの
型とメンバー
class
struct
interface
enum
入れ子の型
自作クラスをフィールドやローカル変数として使うこと
制約付きジェネリクス
既定実装を持つインターフェースメソッド
プロパティ
自動プロパティ
式形式のメンバー
インデクサ
拡張メソッド
params
省略可能引数
名前付き引数
out / ref
タプルと分解
ローカル関数
静的ヘルパークラス
レコードとレコード構造体:位置指定のコンストラクタ、with、値等価性、ToString、分解。static フィールドは const か readonly である必要があります(後述)。
文と式
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:Select、Where、OrderBy、ThenBy、GroupBy、First、Any、All、Sum、Average、Min、Max、Count、Take、Skip、TakeWhile、SkipWhile、Distinct、Reverse、Concat、Zip、Union、Intersect、Except、SequenceEqual、ToArray、ToList、ToDictionary、Range、Repeat、およびそれらの連結。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>
Invoke、InvokeRepeating、CancelInvoke は public メソッドに使えます。async メソッドは void、Task、UniTask、UniTaskVoid を返せます。await Task.Delay(...) や他の async メソッドの await も可能です。ネットワークにあるものすべて。
Udon が決して実行できないもの
これらは UDN0011 で拒否されます。拒否のメッセージがその旨と、代わりにどうすべきかを示します。
| 構文 | 理由と、代わりに書くこと |
|---|---|
try/catch/throw |
Udon に例外はありません。先に条件を確認してください。 |
書き換え可能な static フィールド |
ビヘイビアごとに独立したヒープを持つため、static は「共有された一つの値」ではなく「ビヘイビアごとに一つの値」になってしまいます。どれか一つのビヘイビアのフィールドを参照する形にしてください。 |
Awake |
Udon はディスパッチしません。Start を使ってください。 |
CompareTag と gameObject.tag |
Udon はタグを公開していません。レイヤーや名前を比べるか、参照を持ってください。 |
IsInvoking、Application.isPlaying、Time.timeScale、AudioListener、new GameObject()、ScriptableObject の派生 |
Udon が公開していません。 |
| インスペクタに出す自作クラス・構造体の配列 | Udon がデシリアライズできません。プリミティブ、Unity の型、ビヘイビアへの参照の配列を使ってください。 |
| 素のオブジェクト(ビヘイビアでないもの)のメソッドを指すデリゲート、および Unity がシリアライズする public フィールドに置いたデリゲート | どちらもワールドまで持ち込めません。 |
| 生成したメソッドの外まで持ち越すキャプチャ付きラムダ(フィールドへの代入、戻り値、引数として渡す、ループ内での生成) | キャプチャした変数はビヘイビアの単一のヒープにあるため、保存したクロージャは次の呼び出しで古い状態を見てしまいます。キャプチャしないラムダは自由に保存できます。キャプチャするものは、同じメソッド内で呼ぶローカルとしてなら動きます。 |
まだ対応していないもの
UDN0002 で拒否されます。これは Udon ではなく Udonite 側の不足で、要望のあったものから解除されていきます。
- リストパターン(
is [1, ..])。 - 単独の式としての
typeof(T)、および非ジェネリックのGetComponent(typeof(T))。 - 再帰(
UDN0012)、ループ内でのキャプチャ付きラムダ、checked演算。
拒否で行き詰まったら、その拒否の行を添えて Issue を立ててください。名前さえ分かれば、たいてい一日ほどで対応できます。