0.1.8
GPGPU機能
GPUで走るカーネルをC#で書けるようになりました。
- [TsukimiKernel]を付けたstaticメソッドがシェーダへ翻訳されます。戻り値はColor4、第1引数はKernelIdです。
- Gpu.Bufferでバッファを確保し、Gpu.Runで実行、Gpu.Swapで入れ替え、Gpu.Showでレンダラへ表示します。
Gpu.TextureでRenderTextureとして取り出せるので、結果をそのままシェーダやスクリプトから読めます。 - カーネルから別のstaticメソッドを呼べます。呼ばれたメソッドはシェーダ側の関数として一緒に書き出されます。
再帰と相互再帰は断ります。 - カーネルの中で書けるのは、ローカル変数、代入と呼び出し、return、if、for、while、ブロックの7種類です。
do-while、switch、break、continueは使えません。 - 組み込みはMathfとVector2を中心に関数35個。ほかに成分の読み取りと定数に対応しています。
- 翻訳できない書き方はコンパイル時に位置つきで断ります。壊れたシェーダは書き出しません。
エディタ
- .csファイルをHierarchyまたはSceneビューのGameObjectにドラッグアンドドロップすると、
UdonBehaviourとプログラムAssetを付けます。何も無いところへ落とすとGameObjectごと作ります。 - コンパイルが失敗したままのプログラムが残っているとき、VRChatのビルド要求を止めて理由を出します。
以前は気づかずビルドでき、前回の古いプログラムがそのまま上がっていました。 - C#9のrecordやinitを書けるようにするためのファイルを、初回に一度だけAssets/TsukimiCode/へ置きます。
- UdonのAPI索引をLibrary/Tsukimi/に作ります。SDKの版が変わった最初の一回だけ作り直します。
- Tools/TsukimiCode/Export Consumer-Safe Prefabを追加しました。プログラムの中身を外した配布用のプレハブを書き出します。
言語機能
- charが使えるようになりました。比較、算術、複合代入、インクリメント、文字列の添字読み、
整数や浮動小数やdecimalとの変換。文字列への書き込み(s[0] = 'x')はC#自身が禁じている形なので書けません。
charの同期は補間なしのみです。 - byteやshortなど小さい整数の複合代入とインクリメントが書けるようになりました。以前は明示キャストを挟む形だけでした。
- decimalの演算が一通り書けるようになりました。四則と剰余、インクリメント、数値との変換、定数。
switchのラベルには使えません。 - 隣のふるまいのフィールドとプロパティを、型を名指しして読み書きできるようになりました。
以前は名前を文字列で渡す形だけでした。publicである必要はありません。複合代入とインクリメントも書けます。
同期フィールドとFieldChangeCallback付きフィールドへの書き込みは断ります(読みは可)。 - 隣のふるまいを型として扱えるようになりました。同じフォルダに置いたふるまいの宣言だけを借ります。相手の中身は入りません。
- 別のふるまいのメソッドを呼べるようになりました。戻り値のある呼び出しも書けます。
- 引数つきのネットワークイベントを送れるようになりました。実引数は8個まで。
受ける側は[NetworkCallable]を付けます。1秒あたりの回数上限も指定できます。 - 結果を後から受け取るVRChatのAPIに、自分自身を(IUdonEventReceiver)thisとして渡せるようになりました。
- recordの等値比較に使えるメンバの型が広がりました。整数の全種類、floatとdouble、Vector3などの値型。
- 自作の暗黙変換と明示変換が、ifの条件や引数の位置でも通るようになりました。
- 値型に対する == null と != null が書けるようになりました。結果は常にfalseとtrueに畳まれます。
int?のような本物のnullableは従来どおり書けません。 - イベントを1つも持たない、設定を置くだけのふるまいを書けるようになりました。
- 名前空間に入れたスクリプトのメソッドとプロパティの呼び出しが通るようになりました。
以前は外部のAPIと誤って判定され、エラーになっていました。 - 書こうとするとコンパイルエラーになっていたUdonのイベントを埋めました。
同梱サンプル
- サンプルとしてShowCaseを追加しました。16本とシーンが1つ。構文、手動同期、自動同期、引数つきネットワークイベント、
別のふるまいの呼び出し、プレイヤーと時間、GPUで解く水面と、その結果を読み戻して物を浮かせる例。
アセンブリ定義の中に置いてあるので、recordやswitch式がそのまま書けます。 - 光る床(FloorGlow)は従来どおり同梱しています。
修正
- 組み込みイベントの引数が届いていませんでした。入室したプレイヤーなど、VRChatが渡してくるはずの値が
すべてnullや既定値になっていました。 - インスペクタで空のままにしたGameObjectやTransformやUdonBehaviourの欄が、実行時に自分自身へ化けていました。
- 公開変数がソースに書いた初期値でなく0で作られていました。
- インスペクタで入れた値が、実行開始直後にソースの初期値へ戻されていました。
- 宣言の多いプログラムが、ヒープの容量不足で動きませんでした。必要量を計算して渡すようにしました。
- コンパイルやアセンブルの失敗を握りつぶしていました。失敗した事実をAssetに残し、ビルドを止めます。
- byteやshortやlongのフィールドを1つ宣言しただけで、プログラムが実機で動かなくなっていました。
- 文字列の中の改行と引用符と円記号が正しく書き出せていませんでした。
- 小さい小数や大きい小数の定数が指数表記になり、値が変わっていました。
導入
VCCまたはALCOMに次のURLを追加してください。
https://zz-roba.github.io/tsukimi-vpm/index.json
追加したらパッケージ一覧からTsukimiCode Udon Toolsを入れられます。