#VRChat関連翻訳 今日の #VRChat Developer Updateを一部抜粋して非公式翻訳しました。
間もなく実装されるVRCTweenの話と、SDF生成の話が含まれています。
ソース: https://ask.vrchat.com/t/developer-update-7-may-2026/48395
【VRCTweenが間もなくBeta版のSDKで利用可能になります】
VRCTweenとはなんだったでしょうか。
簡単に言えば、ワールドで物をアニメーションするのを非常に簡単にするものです。
UIをフェードイン/フェードアウトさせたり、オブジェクトをA地点からB地点にスムーズに移動させたり、何かを拡大縮小したり、色を滑らかに切り替えたりといったことが可能です。
通常、Update()でコードをたくさん記述する必要があった処理が、たった1行で実行出来るようになります。
例: `door.TweenPosition(openPosition, 0.5f, VRCTweenEase.OutExpo);`
VRCTweenでは、Transform(位置・回転・大きさ)だけでなく、光の強度や色、AudioSourceの音量、CanvasGroupやGraphicのアルファ値、RectTransformのアンカー、Spriteの色、スライダーの値、レンダラー上のシェーダープロパティなど、殆ど全てのものをTween出来ます。
詳細はドキュメントとサンプルワールドをご覧ください。
https://vrc-tween.netlify.app/worlds/udon/vrctween/
https://vrchat.com/home/world/wrld_fc0f450f-dec4-44aa-9edd-5c9e8b0bf5c8
<Closed Beta以降に追加された新機能>
Closed Betaテスターの皆さんからたくさんの素晴らしいフィードバックをいただきました、ありがとうございます!
採用された内容は以下の通りです。
・`this`の型変換が不要に
UdonSharpBehaviourがIUdonEventReceiverを実装しているので、OnCompleteやその他のCallbackに直接渡すことが出来ます。
・キャンセル可能な遅延呼び出し
`VRCTween.DelayedCall(this, nameof(_DoLater), 3f)`は`SendCustomEventDelayedSeconds`に似ていますが、`kill()`でキャンセル可能なハンドラーを返します。
・Late joinerへの同期
`Goto()`と`Networking.GetServerTimeInSeconds()`を組み合わせることで、後から参加したユーザーに対して同期アニメーションを1行で追いつかせることが出来ます。
詳しい手順はドキュメントに記載しています。
・Custom easingカーブ
`SetEase(AnimationCurve)`を使用すると、プリセットのイージング(訳注: 値の緩急)が適切でない場合に任意のUnityカーブをイージングに使用出来ます。
・経路のTween処理
`TweenPath`と`TweenLocalPath`を使用すると、オブジェクトを特定のウェイポイントに沿って移動させることが出来ます。
`Linear`指定では直線的で鋭角な移動を、`CatmullRom`指定では滑らかな曲線移動を行います。
・Tweenの再利用
Tweenは完了した際に自動終了しなくなったので、`Restart()`や`OnComplete`パターンが正常に動作するようになりました。
`ChangeEndValue`と組み合わせることで、毎回新しいTweenを割り当てる代わりに、単一のハンドルを再設定して再利用出来ます。
いつもと同様に、何か問題が発生した場合はフィードバックをお願いします。
【クライアント側でのテクスチャ圧縮】
動的に読み込まれる画像のために、PC/Android/iOS用のメモリ圧縮アルゴリズムを独自に実装しました。
このアルゴリズムはComputeShaderを使用して、ステッカー、プリント、プロフィールのバナー、ユーザーアイコンなどを、ASTC(Android/iOS)やBC7(PC)まで圧縮します。
圧縮された画像は従来よりも25%少ないRAMしか使用せず、システムのメモリ帯域幅とVRAMをの負担を僅かに軽減します。
今のところ、Udonでの画像については手を加えていません。
対象画像がピクセル単位で完璧にそのままである必要があるものかどうかを判断することは難しく、可能な限り既存のワールドを壊したくないからです。
【SDF(Signed Distance Fields)の生成!】
(サンプルの画像は記事内をご覧ください。)
Graphicsプログラミングに詳しい方であれば、SDFが何であるかご存知でしょう。
私たちはTextMeshProを通して、GPUに過負荷を掛けずに非常に詳細なテキストを表示するために、この技術を使用してきました。
基本的に、SDFを使用することで、画像を切り抜いた時のような極端なエイリアシングが発生することなく、画像の一部がピクセルのどの部分を覆うかを正確に指定出来ます。
また、サイズを大幅に拡大しても、そのディテールはより詳細になります。
では、私たちが行ったことは何でしょうか。
ランタイムで動作するGPU使用のSDFジェネレーターを実装したのです!
これを使えば、葉、草、テキスト、毛皮、ヘアーカードなど、あらゆるものが完璧にアンチエイリアス処理され、美しいまま拡大縮小出来るだけでなく、透明度も維持されます。
調べたところ、部分的に透明なものや、端から遠いピクセルを数えることにより、ランタイムでどの画像がCutoutしたものとして見栄えが良いか判断することは非常に簡単で安価であることが分かりました。
そのため、VRChatに既に存在している多くのものにこれを適用することが出来ました。
まずは一部から展開していきます。
初めにステッカーと絵文字に適用され、その後さらに他のコンテンツにも適用していきます。
絵文字には少し改良も加え、遠くから見た際に以前ほどギザギザに見えなくなるはずです。
(mipmapが機能するクランプ方式を追加しました)
この機能を搭載したSDKが近日中にリリースされますので、ご自身のワールドやアバターでもSDFをご利用いただけるようになります。
Shaderへの対応追加は、僅か2~3行の変更で完了します。
【終わりに】
次回のDeveloper Updateは5月21日です。
