Releases: zz-roba/tsukimi-vpm
Releases · zz-roba/tsukimi-vpm
Release list
0.4.0
0.3.2
- リアクティブプログラミング機能の追加
- テスト機能の追加
- MCPサーバにテスト実行の追加
- switch文のcaseに書ける形の追加(範囲、論理の組み合わせ、型パターン、when句)
- 省略可能引数を省いた呼び出しと名前付き引数の追加
- コンパイラの不具合の修正(構造体フィールドの成分への書き込み、自分のイベントの呼び出し、
型から推論するdefault、範囲外の数値変換、計算インデクサの読み取り) - HeaderとTooltipがInspectorに出ない不具合の修正
- HideInInspectorとRangeとSpaceがInspectorに効かない不具合の修正
- MCPが最適化前のコストを返す不具合の修正
- T#のソースがある場合にUdonSharpのコンパイルが止まる不具合の修正
- 同梱サンプルの追加
0.2.0
言語
- 多次元配列を書けるようになりました。int[4,4]のように確保して、そのまま添字で読み書きできます。
3次元以上と、new int[,]{{1,2},{3,4}}のような初期化子は書けません。 - 末尾からの添字と範囲切り出しを書けるようになりました。a[^1]で最後の要素、a[1..]で途中から先を取れます。
配列だけで、文字列には書けません。文字列は位置を数えてs[s.Length-1]、切り出しはs.Substring(m,n)で書きます。 - タプルに対応しました。(a,b)=(c,d)の代入、(a,b)==(c,d)の等値比較、タプルの配列、foreachでの分解が
書けます。代入先には配列の要素やフィールドも置けるので、(a[i],a[j])=(a[j],a[i])で入れ替えられます。 - switch式にwhen句と非定数パターンを書けるようになりました。値でも範囲でも書き分けられます。
- is型テストを書けるようになりました。objectに入れた値を、boolやint、float、stringといった型で見分けられます。
派生のありうる参照型は今までどおり明示castで受けます。 - ローカル関数を書けるようになりました。外のローカル変数を読むこともできます。書き戻しはできないので、
戻り値で返して呼び出し側で代入してください。 - ジェネリック基底を書けるようになりました。class Leaf : Baseのように、継承した時点で型が決まる形です。
class Leaf : Baseのように型引数が具体でない形は書けません。 - 位置パラメータを持つrecordを継承できるようになりました。
- structとrecordに、計算するプロパティを置けるようになりました。
- 枠組みが持っている契約を、structやrecordに実装できるようになりました。
- structの中のenum、破棄代入、インデクサの読み、独自structのstatic readonlyも書けるようになりました。
修正
- UdonBehaviourSyncModeを書いても、シーン上のUdonBehaviourのSynchronizationが変わりませんでした。
0.1.9ではインスペクタで手動で選ぶ必要がありました。ソースで方式を決めている間は、
インスペクタ側では選べない表示になります。 - Behaviourの継承が3段目で落ちていました。2段までは動いていました。
- externのenumへのキャストが、向きによって通ったり通らなかったりしていました。
- 単項マイナスが、型によっては正しく解決できませんでした。
- 型引数を集約に具体化したときに、コンパイラが内部エラーで止まっていました。
- 走る機会が無い初期化コードが、黙って通っていました。
同梱サンプル
- サンプルを20本に増やしました。
0.1.9
言語
- メソッドの多重定義に対応しました。同じ名前で引数の違うメソッドを並べられます。
- staticなヘルパークラスのメソッドと、拡張メソッドを呼べるようになりました。
- Behaviourでinterfaceを実装できるようになりました。同じinterfaceを実装したBehaviourは、
種類を混ぜて1つの配列に入れ、同じ呼び出し1行で動かせます。相手の型を知らないまま呼べます。 - Behaviourのクラスを型引数にしたGetComponentを書けるようになりました。子や親から探す形もあります。
- ジャグ配列(int[][])と、Behaviourの配列に対応しました。
- foreachでTransformの子とstringの文字を回せるようになりました。
- 増減(x++)と複合代入(x += 3)を、式の値としても使えるようになりました。
- switch式でfloatを扱えるようになりました。switch文のcase nullも書けます。
- 文字列補間の書式指定({x:F2})と桁揃え({x,8})を書けるようになりました。
- structとrecordのstatic readonlyを書けるようになりました。
- object型の引数に値型を渡せるようになりました。objectから値型へ戻すキャストも書けます。
- 範囲外の整数キャストが、C#と同じ切り詰めになりました。以前は実行時にそこで止まっていました。
- typeof(string).Nameのような継承されたメンバの読み取り、値型の引数なしnew、
objectと文字列の連結も書けるようになりました。
エディタ
- 同期などの属性をusing Tsukimi;だけで書けるようになりました。UdonSynced、UdonBehaviourSyncMode、
RecursiveMethod、FieldChangeCallbackが同じ名前空間にあります。 - Create/T# Scriptで作るスクリプトの雛形も、using Tsukimi;だけになりました。
- 別のフォルダにある型を参照したときのエラーメッセージを変えました。名前が見つからないと言うだけでなく、
そのファイルが今のコンパイル範囲の外にあることも伝えます。 - コンパイルは通るのに実行すると壊れるパターンを、いくつかコンパイル時のエラーにしました。
以前はエラーも警告も出ないままアセンブルまで通り、動かして初めて分かる状態でした。
速度
- 参照型の配列を添字で読むのにかかる時間が、要素数に比例しなくなりました。
オブジェクトを配列に並べてループで回す書き方に効きます。
同梱サンプル
- Showcaseを17本に増やしました。増えた1本は、種類の違うBehaviourを1つの配列に混ぜて、
同じ呼び出し1行で動かすinterfaceの例です。
修正
- 再帰(RecursiveMethod)を含むプログラムが、Unity上で1つもアセンブルできませんでした。
- 引数のあるpublicメソッドを、別のBehaviourから呼べませんでした。
- 参照型のメンバを持つrecordの等値比較が、実行時に止まっていました。
移行の注意
- 0.1.8までusing UdonSharp;とusing Tsukimi;を両方書いていた場合は、using UdonSharp;を消してください。
同じ名前の属性が両方にあるため、そのままだとどちらの属性か決められないというエラーになります。
既知の制限
- UdonBehaviourSyncModeを書いても、シーン上のUdonBehaviourのSynchronizationは変わりません。
手動同期にしたいときは、インスペクタのSynchronizationでManualを選んでください。
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を入れられます。