TsukimiSharp で書いた Behaviour を、UdonSharp が読む C# として書き出します。UdonSharp のプロジェクトへ渡すときや、使うコンパイラが決められている場に出すときに使います。
- Project ビューで、書き出す Behaviour の
.cs を選びます
- 右クリックのメニューから Export as UdonSharp を選びます
- 保存先を決めます
| |
|---|
| 選ぶもの | Behaviour の .cs です。対になるプログラムアセットを選んだときは、メニューが灰色のままになります |
| 書き出す範囲 | 選んだ 1 本ぶんです |
| 型の名前の解決 | そのプログラムをコンパイルするときと同じ範囲を使います。別のファイルに置いた型を参照している Behaviour も、そのまま書き出せます |
| |
|---|
| 保存できる場所 | Unity プロジェクトの外です。保存のウィンドウは、プロジェクトの 1 つ外側のフォルダを最初に開きます |
| プロジェクトの中を選んだとき | 書き出しが中止され、理由が表示されます |
| 中に置けない理由 | 書き出した .cs はそのプロジェクトでもコンパイルされ、元のスクリプトと同じ名前のクラスを宣言します。同じ名前のクラスが 2 つある状態になり、どちらもコンパイルが通らなくなります |
| クラス名の決まり方 | 保存するときのファイル名ではなく、元の .cs のファイル名から決まります。保存するファイル名を変えても、クラス名は元のままです |
| |
|---|
| コンパイラ | 書き出した .cs は UdonSharp がコンパイルします。TsukimiSharp のコンパイラが行う最適化は、書き出したあとのコードには適用されません |
| 同期する変数の並び | 書き出したコードから作ったプログラムでは、同期する変数の並びが元と変わることがあります。並びが変わると、元のプログラムで動いているインスタンスとは接続できません |
| コメント | 元のコードに書いた宣言のコメントと、名前空間の宣言は、書き出したコードにも残ります |
| 一時変数 | コンパイラが作った一時変数が、メソッドの先頭にまとめて宣言されます。元のコードより行数が増えます |
| メソッドの名前 | 契約を実装したメソッドなど、名前だけでは区別できないものは、引数の型を含む名前になります |
| 属性 | [NetworkCallable](1 秒あたりの上限を含む)を書き出したコードにも書きます。直接の呼び出しで自分へ戻るメソッドと、別の Behaviour を経由して入り直しうるメソッドには [RecursiveMethod] を書きます(実行中のメソッドへの入り直し) |
| 場合 | 表示 |
|---|
| 元のコードのコンパイルが通っていない | コンソールのエラーを直してからやり直すよう表示されます |
| UdonSharp の形にできない書き方を含む | どの書き方が理由かが表示されます |
| 実行中のメソッドへ、その場で始まる自分の Behaviour のイベントを通って入り直しうる | このコンパイラは入り直しの前後でメソッドのローカル変数を保ちますが、UdonSharp は保たないので、書き出すと動きが変わります。その理由が表示されます(実行中のメソッドへの入り直し) |
[NetworkCallable] のメソッドが自分の名前でエントリポイントに登録されていない | UdonSharp ではその名前でネットワーク越しに呼べないので、その理由が表示されます |
どの場合もファイルは作られません。
| 戻り方 | 書き出し |
|---|
| 自分自身を直接呼ぶ | [RecursiveMethod] を付けて書き出されます |
| その場で始まる自分の Behaviour のイベント(下記)から戻る | 中止されます |
別の Behaviour を経由して戻りうる(別のクラスの型のフィールドや変数からのメソッドの呼び出し、この Behaviour に無いイベントの名前の SendCustomEvent、別の GameObject の SetActive、Networking.SetOwner や SetParent が始める別の Behaviour のイベント) | そのメソッドと、呼び返されたときにまだ実行中でありうるメソッドに [RecursiveMethod] を付けて書き出されます。UdonSharp でも、入り直しの前後でローカル変数が保たれます |
| |
|---|
| 書き出したあとのウィンドウ | 別の Behaviour を経由して戻りうるので [RecursiveMethod] を付けたメソッドがあると、見出しが Three things to know. になり、3 点目にそのメソッドの名前が並びます。直接の再帰で付けたメソッドは並びません |
| 費用 | [RecursiveMethod] を付けたメソッドは、UdonSharp がローカル変数を退避して戻すので、書き出したプログラムは付けない場合より大きくなります |
| このコンパイラでの退避 | 属性のページにあります |
| 呼び出し | 始まるイベント |
|---|
自分か、Behaviour を代入した値へ送る SendCustomEvent・SendCustomNetworkEvent(送り先が Others のものを除く)で、名前が自分のイベントの名前か変数に代入した名前 | その名前のイベントです。名前が変数ならどのイベントも始まりうると見ます。Behaviour を代入した値は、自分でありうるためです |
値の変化を受け取る自分のフィールドへの SetProgramVariable | そのフィールドの変化の通知 |
| 自分のクラス・基底クラス・実装したインターフェースの型のフィールドや変数からのメソッドの呼び出し | そのメソッドです。そのフィールドや変数は、自分を指していることがあるためです |
自分の GameObject の SetActive | OnEnable・OnDisable |
Networking.SetOwner | OnOwnershipTransferred |
VRCPickup の Drop、VRCStation の UseStation・ExitStation、Respawn | それぞれが始める自分のイベント |
VRCObjectPool の TryToSpawn・Return | OnEnable・OnDisable |
どの Transform でも、親や子の並びを変える呼び出し(SetParent・parent への代入・DetachChildren・SetSiblingIndex など) | OnTransformParentChanged・OnTransformChildrenChanged です。その Transform は、自分か親か子のものでありうるためです |
スライダーの value などの UI の値の設定 | どのイベントも |