コンテンツにスキップ

エラー

番号意味説明
TUKI0001この言語が対応していない形C# としては正しいが、実行環境に対応する仕組みが無い。最も多く出る番号で、代わりの書き方は各ページの「非対応」の表にある。実行環境の値型(Vector3・Quaternion など)の、自分を変更するメソッド(v.Normalize()・v.Set(x, y, z) など)もこの番号になる。Udon では受け手の値がコピーとして渡され、呼んでも元の値は変わらないため。エラーの文が代わりの書き方(v = v.normalized など)を名指す。async FrameTask のメソッドの中の、for の増分の部分に書いた await もこの番号になる(待ちをループの本体の終わりへ移す・async / await)
TUKI0099コンパイルできない構文構文としては受理できるが、Udon の命令へ変換する手段が無い。TUKI0001 と一緒に出ることが多い。static クラスと struct の中の async FrameTask のメソッドもこの番号になる(Behaviour の中に書く・async / await)
TUKI0101実行環境に無い呼び出し呼ぼうとしたメソッドが、Udon に存在しない
TUKI0102実行環境に無い型変数の型が、Udon に存在しない
TUKI0103同期できない型[UdonSynced] を付けた変数の型が、同期の対象にならない(同期)
TUKI0106補間できない型[UdonSynced(UdonSyncMode.Linear)] などを、間の値を作れない型に付けている(同期)
TUKI0108メソッドを値として持つ形デリゲートとラムダ。Udon に関数の値が無い。型・生成・呼び出しのどこに書いても、同じ理由でエラーになる
TUKI01091 ファイルに 2 つ以上のプログラム1 つのファイルが 1 つのプログラムになる(ファイル構成と名前空間)
TUKI0110同期を付けられないフィールド[UdonSynced] を const・static・readonly のフィールドに付けている(同期)
TUKI0112リアクティブの依存の循環依存が一周しているため、更新の順序が決まらない(リアクティブプログラミング)。効果が呼んだメソッドや setter を通して書き戻す輪も同じ
TUKI0137リアクティブの属性の付け方の誤り[Effect] か [On] を付けたメソッドが、属性が実行できる形でない。1 つのメソッドに付けた両方、Unity か VRChat が呼ぶイベント・virtual・abstract・override のメソッド・値を返すメソッドへの属性、引数を取るメソッドへの [Effect]、[Reactive] のフィールドへ代入する [On] のメソッド(呼んだメソッドや setter の中の代入も)、トリガーと合わない [On] の引数、クラスに付けた [Effect] の Calls が指す同じ形のメソッドが当たる。エラーの文がメソッドと誤りを名指す(リアクティブプログラミング)
TUKI0114テストの外の確認用の呼び出しAssert と Mimic は [TsukimiTest] を付けたメソッドの中でだけ書ける。Mimic.Explore() はさらに、テストの最初の文でなければならない(テスト)
TUKI0133属性の引数の誤り属性に書いた値が、その属性の受け付ける範囲の外にあるか、属性に書いた名前が属性の求めるものを指していないか、属性を読まれない場所に付けている。[MaxTasks] の本数が 1 未満か 64 より大きいもの(async / await)、カーネルの表の [Capacity] が 2 の冪でないか 1024 より大きいもの(GPU カーネルの実行)、[DefaultExecutionOrder] の順が -2146483648 より小さいもの、[NetworkCallable] の 1 秒あたりの上限が 1〜100 の外のもの(同期)、[On] に名前を 1 つも書いていないもの、[On] か [Effect] に書いた名前が [Reactive] のフィールドでも [Computed] のプロパティでもないもの、[On] に同じトリガーを 2 回書いたもの、クラスに付けた [Effect] の Calls がそのクラスのメソッドを指していないもの(Calls を書いていないものも)、Behaviour の外(struct・record・ほかのクラスのメンバー・ローカル関数・アクセサー)に付けたリアクティブの属性(リアクティブプログラミング)、[FieldChangeCallback] に書いたプロパティがないものと、struct か record の型のフィールドに付けたもの(同期)、[TsukimiTest] の maxSteps・seeds が範囲の外のもの、seeds を int の引数を 1 つ取らないメソッドに付けたもの、何も決めていない [CostLimit] と負の数を書いた [CostLimit]、名前が空か回数が負の [CallLimit]、テストでないメソッドに付けた [CostLimit]・[CallLimit](読まれないため)がこの番号になる(テスト)。メッセージが属性と誤りを名指す。直すのは属性だけで、メソッドの中のコードは関係しない。[Capacity] の誤りでは、そのカーネルを使う Gpu.Run などの行に続けて出るエラーも、同じ番号になる。そちらは直さなくてよく、[Capacity] を直せば消える
TUKI0201null 安全の違反#nullable enable を書いた範囲でだけ出る。C# なら警告で済むものを、ここではエラーにしている(null と参照)
番号意味説明
TUKI0136同期の方式が None の Behaviour のネットワークイベント[UdonBehaviourSyncMode(BehaviourSyncMode.None)] の Behaviour はネットワークイベントを受けない。その Behaviour へ送る SendCustomNetworkEvent は送る時点で受け付けられず、[NetworkCallable] のメソッドはネットワーク越しに呼ばれない。ネットワークイベントを使うなら、方式を NoVariableSync にする(同期)。コンパイルは通る(停止しない)
TUKI0104変数の格納先が足りない1 つのプログラムが使える変数の数には上限がある
TUKI0105型引数の展開が多すぎるジェネリックへ渡した組み合わせが多すぎて、展開しきれない
TUKI0107同期の方式と変数の矛盾[UdonBehaviourSyncMode] の指定と [UdonSynced] の付け方が噛み合っていない
TUKI0117テストがワールドに含まれるファイルにある[TsukimiTest] を本体側のファイルに書いている。Assert か Mimic を呼ぶテストは、その呼び出しがワールドに含まれるプログラムに残るので、Unity がビルドを止め、inspect もエラー(compiles: false)にする。どちらも呼ばないテストは、ワールドに含まれるプログラムに入り、エントリポイントとして公開される(こちらは警告で、コンパイルは通る)。テストは 名前.Tests.cs のファイルへ移す
TUKI0202常に同じ結果になる null 比較値型と null を比べている。コンパイルは通る(停止しない)
TUKI0203object から値型を取り出している取り出しに変換が 1 本かかる。コンパイルは通る(停止しない)
TUKI02042 次元配列の費用要素を 1 個ずつボックス化して出し入れする形になる。コンパイルは通る(停止しない)
TUKI0116予約された名前__ で始まる名前と、書いたイベントの引数を受け取るヒープ変数の名前(OnPlayerJoined なら onPlayerJoinedPlayer)はコンパイラが自分のヒープ変数に使う。フィールドの名前を変えれば直る
TUKI0120焼き込めないモデルモデルの属性で名指したモデルを焼き込めない。どの場合かはメッセージが言う: 属性が決まりどおりに書かれていない(C# を直す)・モデルのファイルが読めない・モデルの中に変換できない物がある(メッセージが名指すモデルの部分を変える。C# の誤りではない)(ONNX モデル(試験中))
TUKI0121シェーダに書けない名前GPU で動く部分(カーネルと、そこから呼ぶメソッド、その引数とローカル変数)の名前に、半角の英数字と下線以外が入っている。名前を付け直せば直る(Udon 側に残るメソッドやフィールドの名前は自由)。そのカーネルを使う Gpu.Run などの行に続けて出るエラーも、同じ番号になる。そちらは直さなくてよく、名前を直せば消える
TUKI0122イベントにならないイベント名のメソッド組み込みイベントの名前のメソッドが、イベントの宣言どおりに書かれていない(引数の型・数か戻り値が違う、引数のあるイベントを引数無しで書いた、VRChat のイベントを override 無しで書いた)。普通のメソッドとしてコンパイルされ、イベントとしては呼ばれない。警告の文が書くべき形を名指す(イベント)。イベントのつもりでなければ、名前を変えれば警告は消える。引数の無い Awake にも出る。Awake は VRChat が呼ばないので、本文は Start へ移す(ソースのどこかで Awake の名前を使っていれば出ない)。コンパイルは通る(停止しない)
TUKI012316 ビットで持った低いビットの重み学習済みモデルの 8 ビットか 4 ビットの重みを、読む層がその大きさで使えないので、16 ビットの値で持った。層ごとに 1 件出て、層の名前・使えない理由・重みが何倍のメモリになるかを示す。計算する値は変わらない。メモリを減らすなら、理由に従ってその層の重みの量子化の仕方か層の形を変える(GPU で計算する ONNX モデル(試験中))。コンパイルは通る(停止しない)
TUKI013516 ビットの上限を超えうる層層の間の値を 16 ビットの小数で持つモデル(実数のモデルなど)に、16 ビットの最大値 65504 を超える値を出しうる層がある。超えた値は 65504(負なら -65504)として持たれ、元のモデルと値が違う。超えるかはモデルに渡す値で決まるので、メッセージが層の名前と理由と、入力がどこまで大きくなると超えるかを示す(同じ理由の層は 1 件にまとめる)。名指された層に届く値が示された大きさより小さいままなら、直す物は無い。確認するには、同じ入力で Unity の出力と元のモデルの出力を比べる。超えないようにするには、モデルの中でその層の入力を Clip で縛るか、演算が許すなら定数で割ってから層を通し、後で掛け戻す(GPU で計算する ONNX モデル(試験中))。コンパイルは通る(停止しない)
TUKI0124命令数とヒープ使用量を測れなかった命令数とヒープ使用量は、Unity がコンパイルするプログラムで測る。Unity は 名前.Tests.cs のファイルを外してコンパイルするので、渡したファイルがそのテストのファイルだと、測るプログラムが残らない。外したプログラムが、Unity がプログラムを保存する前に行う検査でエラーになる場合にも出る。どちらの場合かはメッセージが言う。inspect の cost を指定したときだけ出る。Behaviour を宣言したファイル(名前が .Tests.cs で終わらないもの)を渡す(テスト)。コンパイルは通る(停止しない)
TUKI0125ファイルスコープの名前空間namespace X; は C# 10 の構文で、Unity も C# 9 でコンパイルするため、同じファイルは Unity でもエラーになる。namespace X { に変えてファイルの最後に } を足す(中のコードの字下げは変えなくてよい)(ファイル構成と名前空間)
TUKI0126Unity の外では決まらないシンボル#if か #elif が、Unity の外では定義が決まらないシンボルを読んでいる(UNITY_ANDROID のようにビルドターゲットで決まるものと、ファイルで #define していないもの)。そのシンボルは未定義としてコンパイルした。Unity ではビルドターゲットとプロジェクトの Scripting Define Symbols で決まるので、別の分岐がコンパイルされることがある(COMPILER_UDONSHARP と UDONSHARP は常に定義され、UNITY_EDITOR は常に定義されない)。コンパイルされた分岐が意図どおりなら、直す物は無い。もう一方の分岐を確認するには、確認する間だけファイルの先頭に #define を書く(プリプロセッサ)。コンパイルは通る(停止しない)
TUKI0127インスタンスのあいだで共有されない static フィールドBehaviour の static で readonly でないフィールド(と、set を持つ static の自動プロパティ)は、値を Behaviour のインスタンスごとに別に持つ。C# の static のようには共有されない。const と static readonly には出ない。インスタンスごとの値でよければ、static を外せば警告は消える。1 つの値を共有するなら、1 つの Behaviour の普通のフィールドに置き、ほかの Behaviour は、Inspector で設定したその Behaviour への参照を通して読み書きする(static クラスに移しても共有はできず、static クラスの readonly でない static フィールドを読むとエラーになる)(メンバの宣言)。コンパイルは通る(停止しない)
TUKI0128C# 10 以降の構文コレクション式・プライマリコンストラクタ・record struct・global using は C# 10 以降の構文で、Unity も C# 9 でコンパイルするため、同じファイルは Unity でもエラーになる。メッセージが構文の名前と、C# 9 で代わりに書く形を言う([1, 2, 3] なら new int[] { 1, 2, 3 })。プライマリコンストラクタと record struct では、直すまでファイルのほかのエラーは出ないので、直した後にもう一度コンパイルする
TUKI0129戻り値を捨てた跨ぐメソッドの呼び出しasync FrameTask のメソッドの呼び出しを文として書き、戻り値の FrameTask を捨てている。同時に実行できる本数(既定は 1 本)が全部埋まっているときの呼び出しは始まらず、それを知る方法は戻り値の Started だけになる。async FrameTask のメソッドの中なら await で待つ(本数が 2 以上のメソッドと、ほかの Behaviour のメソッドは待てない)。どこでも if (!M().Started) { ... } のように Started を読める。始まらなくてよい呼び出しなら、_ = M(); と書けば警告は出ない(async / await)。コンパイルは通る(停止しない)
TUKI0130同期する値の大きさ同期する変数がある Behaviour に、inspect が 1 件出す情報。同期する変数の数(構造体の変数は、そのフィールドごとに 1 つと数える)と、大きさが値によらない変数の型の大きさの和(int と float は 4、Vector3 は 12)を示す。string・VRCUrl・配列は和に入れず、名前を別に挙げる。和は VRChat がネットワークに送るバイト数ではなく、上限とも比べていない。直す物は無い(同期)。コンパイルは通る(停止しない)
TUKI0131同期するフィールドの、値が決まらない初期化子[UdonSynced] のフィールドか、[FieldChangeCallback] の対象のフィールドに、コンパイル時に値が決まらない初期化子(Random.Range(1f, 2f) など)が付いている。値が決まる初期化子はフィールドの初期値になり、実行時には実行されない。決まらない初期化子は、その Behaviour のイベントか public メソッドが最初に呼ばれたときに 1 回実行されるので、それより先に受信した値や外から設定された値を上書きする。定数や、new Vector3(0f, 2f, 0f)・Vector3.up * 2f のように値が決まる形で書くか、初期化子を外す。外した後で値が必要なら、OnDeserialization と Start のどちらが先に実行されてもよいように書く(同期)
TUKI0132Unity から呼ばれないエディター用のメソッドBehaviour に OnValidate・OnDrawGizmos・OnDrawGizmosSelected を書いている。Unity はこれらをエディターで MonoBehaviour に対して呼ぶが、ここで書いた Behaviour は UdonBehaviour が実行する Udon のプログラムになるので、Unity からは呼ばれず、中のコードは実行されない。メソッドは普通のメソッドとしてコンパイルされる。エディターでだけ必要な処理はエディターのスクリプトへ、ワールドで実行する処理は Start などのイベントへ移す。Unity から呼ばれるためのメソッドでなければ、名前を変えれば警告は出ない。コンパイルは通る(停止しない)
TUKI0111変化の伝播を組み立てられないリアクティブの属性は読めたが、変化を伝える処理を 1 つも置けなかった。そのクラスの効果は自動では実行されない。比べ方の無い型(配列・DataList・DataDictionary など)の [Reactive] と、その型の成分を持つ struct の [Reactive] で出て、メッセージがそのフィールドか成分を名指す(リアクティブプログラミング)
TUKI0113どこからも実行されない効果その効果のトリガーが、どのエントリポイントでも変わらない。コンパイルは通る(停止しない)
TUKI0115同期するフィールドに付いた属性届いた値では効果が実行されない(伝播が入るのは値を書いたエントリポイントだけ)。そのフィールドに [FieldChangeCallback] を付け、setter でフィールドへ代入すると、届いた値は setter を通って効果が実行され、この警告も出ない。コンパイルは通る(停止しない)
TUKI0119読んだ値が変わっても実行し直されない効果[Effect](か [Computed] を読む効果)が、読んだ値が変わっても実行し直されない。メッセージが場合を言う: 依存を書くエントリポイントが 1 つも見つからず、起動時に 1 回だけ実行される・ほかのインスタンスかほかのクラスの [Reactive] か [Computed] の値を読んでいる・名前を書いた [Effect] が、書いていない値を読んでいる(リアクティブプログラミング)。コンパイルは通る(停止しない)
TUKI0134効果が実行されない道でのリアクティブなフィールドへの書き込み[Reactive] のフィールドへ、ほかのクラスから代入している・同じクラスの別のインスタンスへ代入している・SetProgramVariable に名前を書いて書き込んでいる(そのクラスの中で自分へ書く場合も)。効果が実行されるのは、そのフィールドを宣言したクラスのメソッドが自分のフィールドへ代入したときだけなので、値だけが変わり、効果は実行されない。そのクラスに代入するメソッドを書き、外からはそれを呼ぶ。[FieldChangeCallback] も付けたフィールドへの名前での書き込みは、setter を通って効果が実行されるので、この番号にならない(リアクティブプログラミング)
TUKI0235null で始まる同期する配列[UdonSynced] の配列が null で始まる。初期化子が無く Inspector に出ない配列(private か [NonSerialized] のもの)と、初期化子が null か default の配列に出る。VRChat の公式ドキュメントは、同期する配列が 1 つでも null の間はその Behaviour を同期しないと書いているので、その配列だけでなく、ほかの同期する変数もほかのプレイヤーに届かない。= new int[0] のような初期化子を書くか、最初に送る前(Start など)に配列を代入する。後から null を代入すると、配列を代入し直すまで同期されない(同期)。コンパイルは通る(停止しない)
TUKI0255型の違う値の名前での書き込みSetProgramVariable に名前を書いて、フィールドの型と違う型の値を書き込んでいる(float のフィールドへの SetProgramVariable("speed", 2) など)。名前での書き込みは値をフィールドの型へ変換せずに代入するので、float のフィールドに int が入り、そのフィールドを float として使う所で Behaviour が停止する(C# では変換されて入る)。2f のように型の合う値を渡すか、自分のフィールドなら直接代入する。名前がコンパイル時に決まり(文字列のリテラル・const・nameof)、相手が自分か、型が自分で宣言した Behaviour のクラスの変数のときに出る。名前を変数で渡す呼び出し・UdonBehaviour 型の相手・object の変数に代入してから渡した値は確認しない(コンポーネントの取得と呼び出し)。コンパイルは通らない
TUKI0440テストのファイルにあるイベントUdon のイベント(Interact などの override と、Start・Update のように VRChat が名前で呼ぶメソッド)を、テストのファイル(名前.Tests.cs)に書いている。このファイルはワールドに含まれないので、ワールドのプログラムにそのイベントは無く、呼ばれない。テストを実行するとき(Tsukimi Tests のウィンドウと MCP の test)と、inspect にテストのファイルも渡したときに出るエラーで、テストは実行されない(ワールドに含めるコンパイルでは出ない)。イベントを .Tests.cs で終わらない本体のファイルへ移す。両方のファイルは partial で同じクラスなので、テストからはそのまま呼べる。テストメソッドと、テストで使うメソッドとフィールドは、テストのファイルに残してよい(テスト)
TUKI0485別のプログラムアセットが指す partial のファイルpartial で分けた Behaviour のファイルの 1 つを、別のプログラムアセットがソースとして指している。1 つのクラスは 1 つのプログラムにコンパイルされるので、そのファイルはこのプログラムから外れ、中のメンバ(Interact など)がワールドのプログラムに入らない。Unity でのコンパイルで出て、どちらのプログラムアセットのプログラムもコンパイルされない。基底のクラスを書いたファイルのプログラムアセットを残し、もう一方のファイルを指すプログラムアセットを消す。ファイルは消さない(クラスの続きとして、残したプログラムに入る)(クイックスタート)
TUKI0486テストのファイルにだけ宣言した BehaviourBehaviour を、テストのファイル(名前.Tests.cs)の中でだけ宣言している(public class LampSuite : TsukimiBehaviour など)。このファイルはワールドに含まれないので、その Behaviour はワールドに無い。テストを実行するとき(Tsukimi Tests のウィンドウと MCP の test)と、inspect にそのファイルを渡したときに出るエラーで、テストは実行されない(ワールドに含めるコンパイルでは出ない)。Behaviour は .Tests.cs で終わらない自分のファイル(LampSuite.cs)に宣言してプログラムアセットを作り、テストは LampSuite.Tests.cs に、基底のクラスを書かない partial のクラスとして残す(テスト)
TUKI0490GPU で C# と値が違いうる書き方GPU のカーネルが、値によって GPU での結果が C# と違う関数・演算子・分岐の書き方を使っている(float の %・Mathf.Pow・底を指定した Mathf.Log と、float m = 0f; if (f > 0f) m = f; のように、比べた 2 つの値の片方を if の前で、もう片方を else の無い if の中で代入する書き方など)。inspect が出す情報で、カーネルごと・関数や演算子や書き方ごとに 1 件、最初に使った位置に出る。カーネルは書いたとおりに変換される。メッセージが、何をどこで使ったかと、どの値のときに違うかを示す。その値が届かないなら、直す物は無い。届く値で C# と同じ結果が必要なら、メッセージの示す書き方へ変える(剰余を int で取る・f > 0f ? f : 0f のように両方の値を 1 か所に書く、など)(カーネルから呼べる関数)。コンパイルは通る(停止しない)
TUKI0901コンパイラの内部エラー書いたコードの誤りではない。同じコードが正しいこともあるので、書き直しても直るとは限らない
TUKI0902解析の失敗解析が途中で失敗した。結果が空でも、その危険が無いという意味にはならない
TUKI0903出力したプログラムに無い名前の呼び出しコンパイル結果のプログラムが、この環境の Udon API に存在しない名前を呼んでいる。書いたコードの中には出てこない名前

「非対応」の表の「理由」の列は、この 4 語のどれかです。将来対応される見込みがあるかどうかを表します。

  • 環境: 実行環境に仕組みが無い。実行環境が変わらない限り書けない
  • 設計: 仕組みはあるが、この言語では対応しないと決めた。これからも対応しない
  • 未実装: 対応する方向だが、まだ実装していない。変わりうる
  • 未定: どうするか決めていない
型が無いときこの環境が公開しているのは Unity と VRChat の型の一部で、そこに無い型を変数に書くと TUKI0102 のエラーになります
呼び出しが無いとき型があっても、その中の呼び出しが全部あるとは限りません。公開されていない呼び出しは TUKI0101 のエラーになります
一覧の所在この文書には含めません。Unity の型は Unity のスクリプトリファレンスに、VRChat の型は VRChat の制作者向けドキュメントにあります