コンテンツにスキップ

UdonSharp への書き出し

TsukimiSharp で書いた Behaviour を、UdonSharp が読む C# として書き出します。UdonSharp のプロジェクトへ渡すときや、使うコンパイラが決められている場に出すときに使います。

  1. Project ビューで、書き出す Behaviour の .cs を選びます
  2. 右クリックのメニューから Export as UdonSharp を選びます
  3. 保存先を決めます
選ぶものBehaviour の .cs です。対になるプログラムアセットを選んだときは、メニューが灰色のままになります
書き出す範囲選んだ 1 本ぶんです
型の名前の解決そのプログラムをコンパイルするときと同じ範囲を使います。別のファイルに置いた型を参照している Behaviour も、そのまま書き出せます
保存できる場所Unity プロジェクトの外です。保存のウィンドウは、プロジェクトの 1 つ外側のフォルダを最初に開きます
プロジェクトの中を選んだとき書き出しが中止され、理由が表示されます
中に置けない理由書き出した .cs はそのプロジェクトでもコンパイルされ、元のスクリプトと同じ名前のクラスを宣言します。同じ名前のクラスが 2 つある状態になり、どちらもコンパイルが通らなくなります
クラス名の決まり方保存するときのファイル名ではなく、元の .cs のファイル名から決まります。保存するファイル名を変えても、クラス名は元のままです
コンパイラ書き出した .cs は UdonSharp がコンパイルします。TsukimiSharp のコンパイラが行う最適化は、書き出したあとのコードには適用されません
同期する変数の並び書き出したコードから作ったプログラムでは、同期する変数の並びが元と変わることがあります。並びが変わると、元のプログラムで動いているインスタンスとは接続できません
コメント元のコードに書いた宣言のコメントと、名前空間の宣言は、書き出したコードにも残ります
一時変数コンパイラが作った一時変数が、メソッドの先頭にまとめて宣言されます。元のコードより行数が増えます
メソッドの名前契約を実装したメソッドなど、名前だけでは区別できないものは、引数の型を含む名前になります
属性[NetworkCallable](1 秒あたりの上限を含む)を書き出したコードにも書きます。直接の呼び出しで自分へ戻るメソッドと、別の Behaviour を経由して入り直しうるメソッドには [RecursiveMethod] を書きます(実行中のメソッドへの入り直し)
場合表示
元のコードのコンパイルが通っていないコンソールのエラーを直してからやり直すよう表示されます
UdonSharp の形にできない書き方を含むどの書き方が理由かが表示されます
実行中のメソッドへ、その場で始まる自分の Behaviour のイベントを通って入り直しうるこのコンパイラは入り直しの前後でメソッドのローカル変数を保ちますが、UdonSharp は保たないので、書き出すと動きが変わります。その理由が表示されます(実行中のメソッドへの入り直し)
[NetworkCallable] のメソッドが自分の名前でエントリポイントに登録されていないUdonSharp ではその名前でネットワーク越しに呼べないので、その理由が表示されます

どの場合もファイルは作られません。

実行中のメソッドへの入り直し

Section titled “実行中のメソッドへの入り直し”
戻り方書き出し
自分自身を直接呼ぶ[RecursiveMethod] を付けて書き出されます
その場で始まる自分の Behaviour のイベント(下記)から戻る中止されます
別の Behaviour を経由して戻りうる(別のクラスの型のフィールドや変数からのメソッドの呼び出し、この Behaviour に無いイベントの名前の SendCustomEvent、別の GameObject の SetActive、Networking.SetOwner や SetParent が始める別の Behaviour のイベント)そのメソッドと、呼び返されたときにまだ実行中でありうるメソッドに [RecursiveMethod] を付けて書き出されます。UdonSharp でも、入り直しの前後でローカル変数が保たれます
書き出したあとのウィンドウ別の Behaviour を経由して戻りうるので [RecursiveMethod] を付けたメソッドがあると、見出しが Three things to know. になり、3 点目にそのメソッドの名前が並びます。直接の再帰で付けたメソッドは並びません
費用[RecursiveMethod] を付けたメソッドは、UdonSharp がローカル変数を退避して戻すので、書き出したプログラムは付けない場合より大きくなります
このコンパイラでの退避属性のページにあります

その場で自分の Behaviour のイベントを始める呼び出し

Section titled “その場で自分の Behaviour のイベントを始める呼び出し”
呼び出し始まるイベント
自分か、Behaviour を代入した値へ送る SendCustomEvent・SendCustomNetworkEvent(送り先が Others のものを除く)で、名前が自分のイベントの名前か変数に代入した名前その名前のイベントです。名前が変数ならどのイベントも始まりうると見ます。Behaviour を代入した値は、自分でありうるためです
値の変化を受け取る自分のフィールドへの SetProgramVariableそのフィールドの変化の通知
自分のクラス・基底クラス・実装したインターフェースの型のフィールドや変数からのメソッドの呼び出しそのメソッドです。そのフィールドや変数は、自分を指していることがあるためです
自分の GameObject の SetActiveOnEnable・OnDisable
Networking.SetOwnerOnOwnershipTransferred
VRCPickup の Drop、VRCStation の UseStation・ExitStation、Respawnそれぞれが始める自分のイベント
VRCObjectPool の TryToSpawn・ReturnOnEnable・OnDisable
どの Transform でも、親や子の並びを変える呼び出し(SetParent・parent への代入・DetachChildren・SetSiblingIndex など)OnTransformParentChanged・OnTransformChildrenChanged です。その Transform は、自分か親か子のものでありうるためです
スライダーの value などの UI の値の設定どのイベントも