VRChatアバター3.0を雑セットアップするオレオレワークフロー2022/8月版

あくまで自己流で。メモ書き程度に。

SDK2相当程度かつ、SDK3 Avatar3.0であれこれ遊ぶ*1にの十分なベースシャーシを作る感じで。

  • Avatar3.0アバターとして着用できる
  • SDK2相当以上の表情が使える(FXレイヤーのセットアップ)
  • PhysBone対応 [2022/08/09追記]
  • SPS-i対応[2022/08/09追記]
  • VRChat CreatorConpanion(VCC)を使う[2022/12/17追記]

 

今回例に使うアバター

booth.pm

です。正確にはUnity2018 & SDK2時代にカスタムしたこうめちゃん。

既存のAvatarを新プロジェクトへ持ち出す

SDK2からの移行したい場合、VRMからセットアップする場合

既存のプロジェクトがあるなら、そのシーンごとExport packageして新しいプロジェクトに持っていくと楽。古いプロジェクトはバックアップも兼ねるし、Unityエディタバージョンを上げるときでも安心、不要なデータを(あまり)持ち出さなくて済む。

アバターが1体だけなら、そのアバターをprefab化してそれをexportしてもよい

VRMの場合は新しいプロジェクトにそのままUniVRMとVRMを突っ込めば良いはず。その後、VRM関連のコンポーネントを削除しておく

f:id:o_mega:20220210040155p:plain

Export packageするときに注意するのは、VRCSDKを外すこと。チェックを外してexportに含めない。他に不要なモノがわかれば外して、余計なものの持ち出しが減る

f:id:o_mega:20220210040622p:plain

Packageが出力されるので、旧プロジェクトは閉じてよし。新プロジェクトでImportできて、シーンが見れればOK

アバターの基本セットアップ

VRChat CreatorConpanion経由で新規プロジェクトを作る

[2022/08/09追記]

vcc.docs.vrchat.com

5月にVRChat開発者向けのCreatorConpanionがbeta始まった。これはUnityにおけるUnityHubのようなものを、VRChat専用にした感じのものだ。VRChatのワールド/アバタープロジェクトをまとめて管理したり、SDKのバージョンアップやUdonSharp、ClientSimulatorなどの一括インポートやアップデート更新を自動化してくれる。新規プロジェクトを作ったり、既存プロジェクトをVCC管理へ移行する(migrate)機能もある

今回はこれで新規プロジェクトを作ってみる。

と言っても複雑なとはなく、左メニューのProjects - newを選び、TemplatesからAvatarを選択、プロジェクト名とフォルダ決めるだけだ

あとは、OpenProjectを選べばUnityEditorが開いていつものように始められる

従来の方法で、新規プロジェクトを作る(非推奨)

VCCを使わないでプロジェクトを作るならいつもの通りだ

VRChat公式の示すCurrentVersionのUnityで新規プロジェクトを作る。VRCSDK3を公式からインポート。DynamicBoneやシェーダーなどの必要なものもインポートしておく*2

[2022/12/27追記]

VRChat 2022.3.1p2 の警告(warning)にあるように、VRChatはunitypackageでのSDK配布を辞め、VCCでの更新に一本化する予定にある。そのため、従来方法での新規プロジェクトは早々に使えなくなるハズだ。

VCCから新規プロジェクトを作るようにしよう。

 

[2022/08/09追記]

自分は試してないが、DynamicBoneを持ってない場合は、後述するPhysBone設定をDynamicBone使ってるprefabから生成してくれるツールもあるようす。

SDK2用アバターを買っていて、新たにAvatar3.0仕様で仕立て直したい時、とかには有用そう

booth.pm

何はともあれDescriptor

AvatarDescriptorを付ける。

SDK2からImportした場合は、Missingになってるコンポーネントがあるので削除。VRMから来た場合はVRM関連のコンポーネントを削除したり、素のFBXモデルを持ってきた場合はリグ設定がHumanoidになってるか確認しよう

f:id:o_mega:20220210041350p:plain

 

ViewPoint、LipSync、EyeLook、Eyelidsの設定

ViewPointはEditを押してScene上でぐりぐりするだけ。SDK2なりのセットアップがあればそれをコピペする、SDK2より操作しやすくなった…。基本的には目と目の間、鼻筋に埋め込むように設定する。が、頭が極端に大きいデフォルメキャラだとそれより奥に押し込む方が姿勢が自然になるかもしれない。

 

LipSyncは、おそらく日本語圏の販売アバターはVisemeBlendShapeを選べば良さそう。アバターの顔のMeshを設定すればだいたい勝手に設定される…?されなかったらソレらしいシェイプで埋める。それでもなければ代用して埋める。「最低限、sil、aa、thを作るだけでもそれなりにしゃべって見えるようになります」らしい

EyeLookのMovementは性格付け程度の話なので一旦デフォで良い。落ち着きCalm←→活動的Excited / 内気Shy←→自信家Confident。ボーン設定があればEyeBoneを入れ、移動制限が欲しい場合はRorationStatesを決める。目のボーンがないアバターもそれなりにあるのでない場合はそのまま無視して良い*3

f:id:o_mega:20220210041611p:plain

EyeLidsはまぶたと目パチ。Mesh指定して、目を閉じてる時のBlendshapeを指定すると目パチが動くようになる

 

これでとりあえず動いてアバターとして着用できるようになる。VRC SDKウインドウ→Builder→Build&Publish。モデル検証ならこれで十分。Welcome to VRChat

クソ大変表情FXレイヤーを作る

Avatar3.0の一番の大変ポイント。PlayableLayerを設定してジェスチャー操作と表情アニメを紐付ける。AnimatorをいじってFXLayerを作り、表情アニメーションを設定する。

ここでは楽をするために、SDK3に付属するHandLayerテンプレートをコピって改造し、FXLayerとして使う。FXLayerはボーンの動き(transform)を伴わない、あらゆる変更を突っ込め、と公式も言ってる。ので、表情だけでなく、パーツの出し入れ、マテリアル変更とかいわゆるVRChatterが一番やりたがるものはFXLayerに入る、で良い。

 

FXLayerの土台準備

便利なテンプレート素材として、VRCSDK/Example3/Animation/vrc_AvatarHandLayerが提供されているのでコピる*4。このHandlayerにはジェスチャーであれこれアニメさせるのに、便利なステート/遷移図がもう出来てるのだ名前はFXLayerとかにする

 

f:id:o_mega:20220210043225p:plain

このFXLayerをAvatarDescriptorのPlayableLayersのFXに設定

f:id:o_mega:20220210043855p:plain

表情アニメを作る

がとーしょこらさん作VRCAvatarEditorを使って表情アニメを作っている。というのも複数SkinnedMeshRendererのblendshapeをあわせてレビューしつつ確認できるのが便利。

gatosyocora.booth.pm

f:id:o_mega:20220210043606p:plain

Blendshapeをいじって表情を作ったら、Filenameを決めてCreateAnimFileすると表情アニメファイルが出来る。下のチェックは外しておいた方が良いかもしれない。Layerへの設定は後で手作業設定するため。

ちなみに、このVRCAvatarEditorにはMeshRendererのProbeAnchorをまとめる機能*5もあるので、ついでにやっておくと良し

FXLayerにアニメを設定する

上で作ったFXLayer Animatorを開く。Animatorウインドウを見る*6

LeftHandLayer、RightHandLayerのステートFist、Open…それぞれに上で作ったアニメをそれぞれ設定していく。それぞれのステートをクリックした後、インスペクタでAnimationをドロップして設定する。表情が不要なステートはそのままで良い*7

f:id:o_mega:20220210044224p:plain

それぞれのステートを見ていく。

[2022/08/17追記]

Write Defaultsはオフにしよう。公式でも紆余曲折あったが、Write Defaultsは表情がそれぞれのクライアントで一致しない可能性が出てくる設定となった。*8でより問題が拡大する可能性があるようだ

Add BehaivourしてVRC AnimatorTrackingControlを付ける。目パチをオフにしたい表情では、TrackingControlでAnimationをチェック。リップシンク切りたい場合はMouth&Jawを同様にAnimationをチェックすれば良い*9

f:id:o_mega:20220210044352p:plain

表情戻すアニメ対応、あるいはWriteDefaultsオフ問題

これでできたか、と検証したら「表情戻らない問題」が起きたので、対策を入れる。これはWriteDefaultオフによるものだ。対策はこの記事が分かりやすい。

inplanaria.hatenablog.com

FXLayer Animatorにレイヤー追加して、Weightを1に。VRCAvatarEditorで無表情アニメを作って、上のレイヤーに設定、WriteDefaultオフ。レイヤーの一番上に持ってくる

f:id:o_mega:20220212164003p:plain

 

理屈としては、優先度最小(Animatorエディタで一番上に並んでる)のレイヤーで無表情アニメを流し続ける、ようす。Left Hand/Right Handレイヤーで表情アニメが流れればそちらが優先され、表情アニメが解除されれば優先度最小アニメが実行されて元に戻る。

より詳しい説明を読みたい人は同じ作者のこの記事を読もう*10

inplanaria.hatenablog.com

PhysBone対応

[2022/08/09追記]

PhysBoneが4月に来ていた。ババーン。

PhysBone(PB)とはDynamicBoneの置き換えだ。DynamicBoneより動作が軽く、触ったり触られたりできるし、ビヨーンと伸ばして固定とか、さらにその状態をExpressionParameterやOSCでいろいろできる。すごい。

 

強気のVRChat運営はいきなりDynamicBoneを全部止めていて*11、DynamicBoneを含むアバターは自動的にPBへ変換される、何もしなくとも動くといえば動く。まあその動き方はDynamicBoneと結構違ったりするけども。

なのでDynamicBoneそのままでもアバターアップロードはできるか、そうはそうと現代的にしたい。VRC SDKにはありがたいことにPB自動変換ツールが付属するのでそれを使おう。

 

アバターヒエラルキーで選んだ状態にして、メニューからVRChat SDK - Utilities - Convert DynamicBones To PhysBonesを選ぶ

「DynamicBone全部消してPhysBoneにするよ。それっぽいパラメータにはするけど動きは一致はしないよ。この操作は戻せないよ」と言われるので、Proceedする

と、するとDynamicBoneがPhysBonesに置き換わります。やったね。

とはいえ、結構味付けが異なるので、しっぽとかが無限にびよびよして止まらなかったり、スカートが貫通したり…、とかは各自設定値頑張ってほしい

 

 

設定値の参考はしぐにゃもさんのブログがgifアニメ付きでとてもわかり易い。幽狐さんかわいい

signyamo.blog

 

PB新機能。手っ取り早く触ったり掴んだり固定したりするなら、Radiusを0より大きくすると接触できるようになる。Allow Grabingで手で掴めるように、Allow Posingで掴んでからトリガーで固定できるようになる。髪の毛に寝癖とか付けたい人はPosingをオンにしよう

 

ちなみに、DynamicBoneからPhysBone移行に伴い、PCでの揺れものの制限がかなりゆるくなっている。DBからPBに移行するだけで、AvatarPerformanceが上がるケースもある様子

また、制限は厳しいもののPhysBoneはQuestでも有効。Questでも揺れものが楽しめるようになったぞ。対応アバターはまだ少ないと思われるが、いろいろ工夫する余地があるかもね

SPS-i対応

[2022/08/09追記]

これまた4月になされた告知

(おめががダイジェストで意訳)

Unityの次バージョン(2020)ではSPS-iのシェーダーバリアントが必要です。今回のSDKからSPS-i対応シェーダーバリアントをコンパイルようにしました。Unityバージョンに必要な処置はこれだけではないですが、重要なステップです

 

リエーターへ。SDKを更新してください。そうしないと今後のUnityバージョンアップで、コンテンツが壊れてしまいます。

再アップロードが必要です。SDKをビルドした後にシェーダーエラーが出る場合は、SPS-iをサポートしてないシェーダーが原因です

とのことでUnity2020へ生き残るために必要な対応だ

ざっくりいうと、

  • シェーダーをSPS-i対応のものに更新する
  • SDKを最新にする
  • アップロードし直す

をする必要がある

 

さて、問題は自分の使ってるシェーダーはSPS-i対応かどうかだが、それはシェーダー配布元を当たろう。

 

 

VRChat内で大きなシェアを誇る、ユニティちゃんシェーダーことUTS。他のシェーダーに遅れること、6月にSPS-i対応のv2.0.9がリリースされた。ユニティちゃんのページでは、更新が遅れているのか2022/8月現在、一つ前のv2.0.8が最新になっているため、注意しよう。SPS-i対応版はv2.0.9だ。これをダウンロードして、プロジェクトに取り込めば良い

github.com

 

開発な活発で最近話題になりやすいシェーダーとしてはlilToonがある。lilToonにはUTSからのかなり精度のよいマテリアルコンバータが提供されているので、UTSからいっそ乗り換えるのも一つだ。

booth.pm

 

他にもUnlit_WF_Shader、poiyomiなど、VRChatコミュニティ寄りのシェーダーも開発が活発で早くからSPS-i対応をしており、この辺も心配はない。

github.com

www.poiyomi.com

 

もちろんUnityビルトインやSDKのシェーダー、VRChat/Mobile、Standardなどは気にしなくてよいだろう。SDKを最新にしてアバター/ワールドをアップロードし直そう

完成

完成だと思います

f:id:o_mega:20220210040039p:plain

できたと思ったら、SDK2にはあったこうめちゃんの耳としっぽが表情連動しないやん… ということで、それはまた別で頑張る必要があることがわかった!

 

それはさておき、2.0時代のセットアップに近い、素に近いAvatar3.0がセットアップできたはずだ。プレーンなFXレイヤーのセットアップができたので、この上に持ち物の出し入れやVRCLens/VirtualLensの様な拡張、最近話題のOSC連携、Contact含むAvatarDynamicsの導入もできるようになった。Unity2020のカタストロフィックなアップデートにも多分、耐えられるであろう。よしよし

*1:カメラ拡張とかモノを出し入れしたりとかする

*2:と、SDK2プロジェクトのDynamicBone設定を引き継げて便利

*3:こうめちゃんには目のボーンはなかった

*4:Unity上だとCtrl+Dで複製が出来る

*5:MeshのProbeAnchorの位置がバラバラだと、ワールドのLightProbeから拾う光がMeshごとに変わってしまい、パーツごとに明るさが違う現象が起きる。よくあるのが場所によって顔とボディの明るさが違うケース

*6:Animationではなく

*7:初期設定されているproxy~.animはVRC内のデフォルトアニメーションが適用される設定

*8:今後実装予定のHide by Distance機能によって同期されなくなる話があったが、8/16のDeveloperUpdateで方針転換/仕様変更がありWrite Defaults オンでも一応問題はなくなった。Developer Update - 16 August 2022 - Community Updates - VRChat Ask。とはいえ、最近のドキュメントでは Avatars 3.0 WriteDefaultsはオフが推奨されている

*9:Trackingにすると、フルトラやリップシンクなどのユーザー操作や、目パチのようなVRCシステム機能で動く。Animationにすると、アニメーションデータで上書きされる。という理解で良い

*10:なんでこんなクソややこしい機能があるのか、というのは恐らくUnity側が便利だろうと実装してみたが実際はややこしくなってしまい、なまじ使われているので消せない機能になっているようす?なのでUnity側も困ってるしVRC運営も困ってる機能と思われる。Lose-lose-lose悲しいね…

*11:一応、ローカルだけPhysBoneの代わりにDynamicBoneを使う設定はあるが