VRChatアバター「アクアル」を買ってQuest上でも見られるように設定とかしたことを書くよ

つい数日前に、以前から気になっていたアクアルというVRChat向けのアバターを買ったんだよ。サバキチくんも可愛いけど、アクアルくんも可愛いよね。

この写真ではすでにオリジナルのアクアルくんからかなり印象が変わってしまっているけど、まるまるとしたお腹があったり、動くたびに長い耳や尻尾が揺れるのがなかなかツボに刺さるんだよね。

アクアルくんも色々な場所で使うことになりそうな気がするから、Unity上でアップロードする際に自分色に染めたり、QuestからVRChatを楽しんでいる人でも見られるようにカスタマイズしたよ。サバキチくんの時と比べて触った部分が多かったから、その辺の覚書きということで書いておこうと思うんだ。

ちなみにテクスチャ―関係も手を付けているけど、この辺りは色々なアバターで色々な手の加え方を紹介しているところが沢山見つかるから、今回は省略するよ。

使ったツールの一覧

アクアルが映っているUnityの画面

VRChatを利用しているならほぼ見たことがあるであろうUnityの画面だよ。上のスクリーンショットでは、自分色に染めたりした後のアクアルが映っているけど、左側のヒエラルキーから、沢山あるテクスチャーをひとまとめにしたり、ポリゴン数を減らすようなことをしたりと、主にMeta QuestやPico4からVRChatに来ている人でも見られるようにする策が盛り込まれているよ。そして個人的に大事にしたのは、アバターの内部に元々あった部分をなるべく触らずに非破壊で仕上げること。下手に触って元に戻す方法を忘れたりでもしたら大惨事だからね。

使ったツールは以下の通りで、Googleなどの検索でゴリゴリに調べて何とかQuest対応することができたし、それ以外にも表情関係の設定やAFK(離席)状態の時のアニメーションや表情の変更も盛り込んでいるよ。いずれのツールは、後々のアップデートの手間とかを考えてVRChat Creator Companion経由でダウンロードしよう。

  • Modular Avatar
    • アバターに簡単に服を着せたりできるアセット。今回はメニューの設定に手を加えたり、服を着せること以外に利用しているよ。
  • Avatar Optimizer
    • アバターをアップロード時に軽量化してくれるアセット。基本的に入れておいた方がみんなのためにもよさそう。Quest対応の際に重要な存在となっているよ。
  • Meshia Mesh Simplification
    • アバターのポリゴンを減らしてくれるアセット。Quest対応の際に役立っているよ。
  • TexTransTool
    • アクアルくんで使われている沢山のテクスチャーを1枚にまとめてくれるアトラス化のために使っているアセットだよ。
  • Gesture Manager
    • 必須というわけではないけど、動作の確認をするにあたって、あった方が手間が省けるアセットだよ。

アクアルくんをカスタマイズする前に下準備しよう

まずはVRChat Creator Companionからアクアルくん用のプロジェクトを作って、使うのに必要なツールをあらかじめダウンロードしておこう。そしてプロジェクトを立ち上げたら、ダウンロードしたアクアルくんのzipファイルからunitypackageという拡張子のファイルを探して、Unityプロジェクト内にインポートしよう。

インポートし終えたら、インポート後の中のPrefabというフォルダにアクアルくん用のPrefabがあるんだけど、オレはAqual Variantの方をヒエラルキー内にドラッグアンドドロップしたよ。Aqualの方でもいいんだろうけど、こっちは完全にオリジナルのデータみたいだったし、何となくオレの中で完全オリジナルの方はそのままにしておきたくなるんだよ。というわけであえてVariantの方で。最終的に多分どっちでもいける。

Avatar Optimizerを使ってアバターを軽くしよう

そこまで難しい話じゃないよ。ドラッグアンドドロップしたAqual Variant(以下呼び方をAqualに省略)の親オブジェクトに当たる部分(VRC Avatar Descriptorのコンポーネントがあるところ)を選択して、そこに新たにコンポーネントとして「AAO Trace And Optimize」を追加しよう。

これを追加しておくだけで、テクスチャのデータのサイズを縮めてくれたり、不要なボーンとかを取り除いてくれて、全体的に軽量化してくれるんだよ。ありがたいよね。

個人的な好みに合わせて装飾類を触るよ

個人的には装飾類は控えめなぐらいが好みというのがあって、装飾類をある程度無効にしていこうと思うよ。もし忘れたら結構時間を使う部分になると思うから、いざ忘れても大丈夫なように書いておくよ。

というわけで、王冠とイヤリング全てとネックレスと尻尾のリング全てを無効にするよ。Aqualのヒエラルキーのツリー内にはCrownとEarringsとRingsがあるから、それぞれ選択して右側のインスペクターを見てみよう。インスペクター内の左上にはチェックボックスとUntaggedと書かれているところがあるから、無効にするためにUntaggedをEditorOnlyにしよう。これでUnityのエディター上に見えるだけで、再生ボタンやVRChatのアバターのアップロード時には反映されなくなるよ。もうそれだけで無効になるんだけど、それだけだとEditorOnlyのオブジェクトかそうじゃないオブジェクトなのかが判別できなくなるから、さらにチェックボックスを外して、文字を半透明にさせるよ。こうすれば見分けがつくよね。

さらにリボンと一緒についているネックレスも外したいんだけど、これはオブジェクト内にリボンとネックレスが一体になっているみたいで、簡単に個別で消すことは難しそうなんだよ。色々調べたら、Avatar Optimizer側でAAO Remove Mesh By Maskというコンポーネントが用意されているみたい。これは消したいオブジェクト内にこのコンポーネントを付けて、このコンポーネントに消したい部分のテクスチャを黒く塗って割り当てると、再生時やアバターのアップロード時に消してくれるんだよ。これで無事に消えてくれるよ。

あと、Crownについては揺らしたりするのに使われるPhysBoneが割り当てられているから、PhysBonesオブジェクト内にあるCrownをEditorOnlyにして無効にしておこう。

メニューを触りつつ各表情の固定機能を追加するよ

前々から使っているサバキチくんにはいくつかの表情を固定できる機能がエクスプレッションメニューにあるんだけど、アクアルくんにはその機能がないから、オレで強引にその固定機能を付けてみようと思うよ。なお、FaceEmoを使う方法もあるけど、返って動作がおかしくなってしまったりして扱いづらかったから、今回はそれを使わずにやらさせてもらうよ。

先にエクスプレッションメニューの方の準備をするために、Modular Avatarの非破壊でメニューをカスタマイズできる機能を使っていくよ。親オブジェクトを右クリックして、Modular Avatar -> Extract Menuを選択しよう。すると、親オブジェクト内の真下にAvatar Menuというオブジェクトができるよね。そこに色々追加したり無効にしたりしてカスタマイズしていくよ。

オレとしては少なくとも現時点では着せ替えはするつもりはないから、Avatar Menu内の「着せ替え」はEditorOnlyにして無効にするよ。これでアバターアップロード時にエクスプレッションメニュー内には消してくれます。

そしてここからが肝心の各表情の固定機能の選択を追加するよ。表情固定用のメニューのオブジェクトをAvatar Menu内に作成して(オレはここではExFaceにしてみました)、そのオブジェクトに「MA Menu Item」と「MA Parameters」と「MA Marge Animator」というコンポーネントを追加しよう。先に「MA Parameters」で表情固定の際に用いるパラメーターをひとつ追加しておこう(オレの場合はExFaceにしてみました)。パラメーター名の右側にあるリストは「Int」にし、すぐ下にある「保存する」と「同期する」にはチェックを入れておこう。そうしないとVRChatを起動したりするたびに消えてしまうだろうしね。

「MA Parameters」が終わったら、続いて「MA Menu Item」だよ。表示名を確認して、サブメニュー引用元は「子オブジェクトから生成」として、入れたい表情の名前を全部追加していこう。その際に各タイプはToggleとして、パラメーター値は被らないようにし、パラメーター名は全部同じにしてね。そうしないとうまく動かないよ。

「MA Merge Animator」は、レイヤー種別は「FX」で、付属アニメーターを削除にチェックを入れて、パスモードは「絶対的」、統合モードは「アニメーターに追加」、アバターのWrite Defaults設定にチェックを入れてね。統合されるアニメーターに設定されるファイルについては、画像を見るとすでに割り当てられているけど、この部分はこれから作っていくよ。しかし、ちょっと難しいんだよこれ。

色々調べてみて分からないことだらけだったけど、調べている最中にBOOTHで「【無料】Expressions Menuから表情を変えるやつ」というのを見つけたから、それを使わせてもらって自分なりに弄ったらうまくいったよ。

オレのお目当ては表情メニューの設定に使うFXLayerのコントローラーファイルで、ダウンロードしてUnity内にインポートしたら、そのファイルをAnimatorエディタ画面で「Face」の部分を見てみよう。すると、上の1枚目の画像のようなものが見えてくると思うんだ。その中の矢印と長方形の部分を見てみよう。2枚目が矢印(トランジション)の部分で、3枚目が長方形(ステート)の部分の情報だよ。矢印については、Conditionsのパラメーター部分を「MA Menu Item」で設定したパラメーター名と同じにして(今回はfaceparam)、すぐ右側の数字の部分は同じく「MA Menu Item」の各メニューで設定したパラメーター名と連動するから、それと照らし合わせながら設定していってね。

ひとつ書き忘れていたというか、気づいたことがあって、このままだと表情固定中にまばたきの動作が発生して、場合によっては表情が乱れてしまうかもしれないよ。だから各表情のステート全てに「VRC Animator Tracking Control」コンポーネントを追加して、「Tracking」のところの「All」を選択してから、「Eyes & Eyelids」に「Animation」を選択しておこう。これで表情固定中はまばたきをしなくなるはずだよ。

ちなみに、左側に書かれているFaceというレイヤー名のすぐ下にリップシンク関係のレイヤー設定があるけど、これがあると表情固定時にリップシンクが動かなくなってしまったから、思い切って消してしまったよ。もしもリップシンクも動いてほしくなかったらそのままにしてね。

完成したコントローラーのファイルは、表情固定のオブジェクト内にあるMA Marge Animatorの「統合されるアニメーター」にファイルを割り当てておこう。これでメニューにしっかり追加されるはず。

Quest用のアバターをもっと軽量化しよう

ポリゴン数を非破壊で削減しよう

さすがにBlenderなどを使って自力で削減しようにもかなり厳しいから、まさかと思って非破壊で削減してくれるツールを探したところ、Meshia Mesh Simplificationというのがあったよ。というわけで、Skinned Mesh Rendererがあるオブジェクト全てに「Meshia Mesh Simplifier」コンポーネントを追加しよう。Valueの数字が増えれば増えるほど削減してくれるみたいだけど、初期値が0.5がそのままにするよ。

コンポーネントを追加しておけば、再生やアバターアップロード時に自動で削減してくれるよ。これは嬉しい。

PhysBone ColiderやPhysBone Componentをいくつか無効にするよ

アクアルくんの場合だと、ポリゴン数の次に削減したほうがいいのがPhysBone関係だから、やむなしだけどいくつか無効にするよ。

PhysBone Coliderが割り当てられているのは頭と頭の周辺。具体的にはHips->Spine->Chest->Neck->Headという頭の部分。Hips->Spine->Chest->Shoulder.Lと、Hips->Spine->Chest->Shoulder.L->UpperArm.Lと、Hips->Spine->Chest->Shoulder.L->UpperArm.L->Hips->Spine->Chest->Shoulder.L->UpperArm.L->LowerArm.L、そして反対側も同様。という具合に割り当てられているんだけど、今回はHips->Spine->Chest->Neck->Headを無効にしよう。他を無効にすると違和感がすごい出てしまうと思う。

PhysBone ComponentはPhysBonesオブジェクトにまとめて割り当てられているよ。結構前に書いた通り、すでにCrownはEditorOnlyにして無効にしているけど、さらにHairもEditorOnlyにするよ。

テクスチャとマテリアルスロットをまとめて削減しよう

テクスチャをひとつにまとめたり、マテリアルスロットをひとつにまとめたりするために、「AAO Merge Skinned Mesh」と「TTT AtlasTexture」というコンポーネントを利用するよ。

まず「AAO Merge Skinned Mesh」だけど、オレの場合はアバターの親オブジェクトにコンポーネントを作ったよ。新しくオブジェクトを作って、そこにコンポーネントを作る感じでもいけるみたい。画像の通り、まとめたいオブジェクトもといSkinned Meshのオブジェクトを全部ドラッグアンドドロップなどで持ってこよう。これだけで再生時やアバターのアップロード時は自動でまとめてくれるよ。

「TTT AtlasTexture」は、今回は新しくオブジェクトを作って、そこにコンポーネントを入れてみるよ。これも他のオブジェクトにコンポーネント入れても大丈夫なのかな。それはさておき、これもさっきと同じ感覚で、マテリアルを全部入れてしまえば大丈夫だよ。ただ、Quest用となると、マテリアルの種類は全部同じ種類にしないとエラーが出ると思うから、今回はまとめるテクスチャのマテリアルを全部「VRChat/Mobile/Toon Lit」にしました。ひとつだけ透過を使っているマテリアルもあって、それはなくても見た目的な意味で致命傷にはならなさそうだから、まとめるテクスチャの中からは外したよ。

あと、下の方のマテリアル設定で、「すべてのマテリアル結合時参照」に空の同じ種類(今回はVRChat/Mobile/Toon Lit)のマテリアルを作ってドラッグアンドドロップで設定しておいて、「テクスチャ―を強制的にセット」にチェックを入れることも忘れずにね。いずれもやっておかないと、エラーが出るか、アバターとして利用するときにテクスチャーがうまく適用されずにおかしくなったりしたことがあったからね。

AAOのエラー対策で親オブジェクトにMA Mesh Settingsを入れよう

「AAO Merge Skinned Mesh」コンポーネントを使った場合、そのまま再生したりアップロードしようとすると、1枚目の画像のようなAvatar Optimizerのエラーが表示されるよ。このままだと予期しない動作が引き起こされる場合があるらしい。

今回はModular Avatarが利用できるから、親オブジェクトにMA Mesh Settingsコンポーネントを追加し、Anchor Override 設定のAnchor Override、Bounds 設定のルートボーン、いずれもアクアルくんのArmature内にあるHipsを割り当てておこう。そうすればエラーは発生しないはずだよ。

これでQuest用のアバターの準備は全て整ったはず。試しにアップロードしてみてね。

AFKのデフォルトのアニメーションや表情を入れ替えよう

これは必須というわけではないけど、せっかくだからAFKのデフォルトのアニメーションや表情を差し替えてみたかったんだよ。ちょっと難しかったからここに書き留めておくね。

AFKの表情部分と体のアニメーション部分とで触る部分が違っていて、表情部分はFXレイヤーのアニメーターコントローラーで、体のアニメーションはActionレイヤーのアニメーターコントローラーだよ。ただ、やっぱりなるべくオリジナルのファイルには触れずに非破壊でいきたいから、FXレイヤーのアニメーターについては、後で新しくオブジェクトを作って、そこにMA Merge AnimatorコンポーネントにまとめるAFKの表情アニメが乗ったFXレイヤーのファイルを当てて、まとめるようにするよ。

まずFXレイヤーのファイルを用意するよ。FXレイヤーの設定については「【VRChat】AFK時のポーズとか表情とかを変えたい!」をほとんどそのまんま参考にしています。プロジェクト内を右クリックして新規でAnimator Controllerを作成し、上の写真のように設定してみてね。今回はレイヤー名を「AFKface」、レイヤーの隣のパラメーターのところから今回利用するパラメーターであるBool型の「AFK」を追加しておくよ。「AFKface」のレイヤーの隣にある歯車マークを選択して、Weightを1と設定しないとうまく動作しないらしい。

AFKfaceのレイヤー内では、新しくOnとOffのステートを用意し、EntryからOff、Any StateからOff、Any StateからOnにトランジションを設定するよ。

Any StateからOnのトランジションの設定は、もしHas Exit Timeにチェックが付いていたら外して、Conditionsから「+」ボタンを押して、「AFK」が「true」の時というような情報を設定しておこう。Any StateからOffのトランジションの設定も、同じくHas Exit Timeのチェックを外して、ここではConditionsの設定を「AFK」が「false」の時というような設定にしよう。

各ステートではWrite Defaultsのチェックを外して、OnステートのMotionはAFKが有効の時のアニメーションを、OffステートのMotionはAFKが無効の時のアニメーションを設定するよ。今回はOnステートで「Nagomi」、Offステートで「Empty」と設定したよ。

新しく作ったオブジェクトにコンポーネントを設定

これでAFK設定用のFXレイヤーのアニメーションコントローラーファイルが出来上がったから、この設定が反映されるように、親オブジェクトに新しくオブジェクトを作成し(オブジェクト名はAFKfaceとか分かればOK)、そのオブジェクトにMA Merge Animatorコンポーネントを追加するよ。統合されるアニメーターをさっき作成したFXレイヤーのアニメーションコントローラーを割り当てて、レイヤーの種別はFX、付属アニメーターを削除、パスモードを「絶対的」、統合モードを「アニメーターに追加」、アバターのWrite Defaults設定に合わせるにチェックを入れて終わりだよ。

今度はActionレイヤーのアニメーターだよ。アクアルくんは独自のActionレイヤーのアニメーターコントローラーファイルがないから、プロジェクトの「Package/VRChat SDK – Avatars/Samples/AV3 Demo Assets/Animation/Controllers」にある「vrc_AvatarV3ActionLayer.controller」をコピーして使うよ。

コピーしたアニメーターコントローラーファイルを確認してみると、色々なトランジションやステートがあるけど、手を加える必要があるのが、写真1枚目にある「Afk init」「AFK」「BlendOut」の3つのステートだよ。いずれのステートもMotionの設定があって、そこにVRChatの初期のAFKのアニメーションが設定されているから、そこをお目当てのAFKアニメーションを設定しておこう。オレはふぇのるとくんのアバターを持っているから、今回は僭越ながらふぇのるとくんのAFKモーションをありがたくお借りいたします。

出来上がったActionレイヤーのアニメーターコントローラーは、親オブジェクトにある「VRC Avatar Descriptor」内のPlayable LayersでActionというところがあるから、そこの「Default Action」ボタンを押すと、オブジェクトをドラッグアンドドロップできる場所が出てくるよ。そこにさっき用意したActionレイヤーのアニメーターコントローラーのファイルを割り当てよう。

これでAFKの表情と体のアニメーションの設定はおしまい。再生ボタンを押して、Gesture ManagerからAFKの表示を試して、上の2枚目の写真の通りになったら成功だよ。

おしまい

これでオレがアクアルくんに手を加えた部分の紹介はおしまい。これを一通りやれば、QuestのVRChatアプリから来ている人でも可愛いアクアルくんが見られるようになるし、色々とカスタマイズの幅が広がるかもしれないね。多少たりとも参考になったら嬉しいよ。

コメント&トラックバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください