VRChat設定方法(2025/01/01)

目次

この記事の目的

設定が難解なVRChatの設定をスムーズに行えるように設定の手順をこの記事に記載していく。

Unityのバージョンは2022.3.22f1

VRCSDKのバージョンはVRChat SDK – Baseが3.7.5、VRChat SDK – Avatarsも3.7.5。

 

BlenderでのFBXエクスポート

エクスポートする際は最初にエクスポートするオブジェクトをすべて選択する。アーマチュアを選択して「階層を選択」をするのが良い。

 

メニューの「ファイル→エクスポート→FBX」を選択し、上の画像のように「選択したオブジェクト」「可視オブジェクト」にチェックを入れ、オブジェクトタイプは「アーマチュア」と「メッシュ」を選択する(SHIFTを押しながらクリックで複数選択できる)

 

続けて、スケールを適用は「FBX単位スケール」に変更する。これを設定しないとUnityでのインポート時にサイズがおかしくなるらしい。

「リーフボーン追加」は自分でリーフボーンを追加しているのであれば外しておく。よくわからなかったらオンにする。

アニメーションは不要なのでオフにしておく。

これでエクスポートで行けるはず。

 

FBXインポート

山ほど解説があるので後回し

 

FBXのModelタブの設定は

  • ・Legacy Blend Shape NormalsのチェックをOFF
  • ・NormalsをImport
  • ・Blend Shape NormalsをNone
  • ・Normals ModeをUnweighted
  • ・Smoothness SourceをNone
  • ・TangentsをNone

がいいらしい。Import CamerasとImportLightsはカメラとライトは不要なのでオフ。Read/Writeはオフにしてもアップロード時にオンに修正する必要があるので今の段階でオンにしておく。

 

参考:

Unityでカスタム法線メッシュにブレンドシェイプを適用した際に法線が崩れる問題の解決法

 

Avater Descriptor基本設定

海ほど解説があるので大部分は後回し。

View Potition

カメラの位置の設定。なのだが値がおかしいと6点トラッキング時の挙動もおかしくなるという罠がある。とりあえず0.1にするとよさげ。

 

6点トラッキング時に横を向くとView Positionの設定によっては体が変な傾き方をすることがある。上の画像はそれぞれView PositionのZの値を「0.2」「0.1」「1.0」に設定して横を向いて撮影したもので。0.1だと問題ないのだが0.2にすると体が傾き1.0になるとえらいことになる。

  

表情を変更できるようにする

ここからはVRChat内のリングメニューで表情を変更するための方法について説明します。この説明を通してVRChatのメニューやアバターコントロールの仕組みの基本が理解できる、はず。

 

Playable Layersの基本的な動作の概念

Playable LayersはVRChatのアバターの立ち、歩きなどの基本モーションや、ハンドサインでの表情変更、エモートや着替え、表情変更などに使用するために必要なものである。

まずは設定手順の前に、どのような仕組みで動いているかざっくりと書いていく。

 

VRC Expression Parameters

VRChatのエモートのざっくりとした仕組みとしては、VRChatのシステムまたはユーザーによって定義された変数の変化によってAnimator Controllerの状態が遷移し、遷移先に設定されたAnimationを再生するというものである。

上の画像の「VRC Expression Parameters」はユーザー定義の変数を設定させるためのものである。各項目の説明は以下の通り。

 

Name

変数名。

Type

変数の型、int/Float/boolの3種類がある。

Default

デフォルト値。

Saved

ワールド移動やアバター切り替え時に値を保持するか否か。ワールド移動後も切り替えた衣装を保持したい場合などに使用する。

Synced

このパラメータの状態をほかのプレイヤーにも送信するか否か。基本ONでよいだろう。

 

VRC Expression Parametersは新規追加すると「VRCEmote」「VRCFaceBlendH」「VRCFaceBlendV」のパラメータが初期設定されている、「VRCEmote」はデフォルトのエモートで使用するが残りの二つは用途が不明。メニュー選択による表情変化や着替えなどを実装したい場合はここにパラメータを追加する。

 

VRC Expressions Menu

「VRC Expressions Menu」はゲーム内で開くリングメニューの定義および、「VRC Expression Parameters」で定義したパラメータを操作するためのものである。各項目の説明は以下の通り。

 

Parameters

「VRC Expression Parameters」をセットする、ここが空だと後述のParameterの設定ができない。

Name

メニューに表示される名前。

Icon

メニューに表示されるアイコン(Texture 2D)を設定できる。

Type

メニューのタイプ、Buttonは一瞬だけパラメータを操作する、Toggleはオフにされるパラメータの値を固定する、SubMenuを使うことで階層型メニューを作れる。基本的にこの3つを使えばよいだろう。

Parameter

操作するパラメータの名前、TypeがSubMenuの時は設定しなくてもよい。

Value

パラメータに設定する値。

 

Animator Controller

「Animator Controller」はUnity標準のコンポーネントでParametersタブで設定した変数の変化によって状態を遷移するステートマシンであり、各状態に設定されたAnimationを再生する。

まとめると「VRC Expression Parameters」で定義した変数を「VRC Expressions Menu」で操作し「Animator Controller」内の状態が遷移し遷移先のAnimationが再生される。というのがVRChatにおけるエモートや着替えの仕組みとなる。

 

Expressions設定

ここから実際にメニューから表情を変更するためにExpressionsの設定をしていく。ここではメニューから表情を笑顔に変えるための設定をしていく。

まずAvatar DescriptorのExpressionsセクションのCustomizeボタンを押す。

Customizeボタンを押すと上の画像のようになるので、ここにセットするためのVRC Expressions MenuとVRC Expression parametersを作成する(右クリックメニューのCreateから作れる)

 

VRC Expression parameters作成

作成したVRC Expression parametersを選択し、パラメーターを追加する。名前は「Lop_Facial」とする。

 

VRC Expressions Menu作成

続いてVRC Expressions Menuを選択し、Controlsを2つ追加する。

1つ目はNameをDefault、TypeをButton、ParameterはLop_Facial、Valueは0を設定する。こちらはデフォルトの表情を選択するときに使用する。

2つ目はNameをJoy、TypeをToggle、ParameterはLop_Facial、Valueは1を設定する。こちらは笑顔用となる。

さらにもう一つVRC Expressions Menuを作成し、上の画像のようにSubMenuを追加する。一番下のSub Menuには上で作成したExpressions Menuを設定する。

 

作成したExpressions MenuとExpression ParametersをVRC Avatar DescliptorのExpressionsにセットする。このときMenuのほうにはSubMenuを追加したほうをセットしておく。

 

Animator Controllerの作成

Animator Controllerの作成

次に右クリックメニューのCreateからAnimator Controllerを作成し、ダブルクリックでAnimator編集ウィンドウを開き左上にあるParametersタブを選択しパラメータ追加ボタンを押す。

次にAnimatorエディタ内で右クリックをして「Create State→Empty」でステートを2つ作成する。それぞれ名前は自由だがここではdefaultとJoyにしておく。

defaultのステートを右クリックし、「Make Transition」を選びJoyに接続する。接続した矢印をクリックしてHas Exit Timeのチェックをオフに、Conditionsにパラメータを1つ追加し、それぞれLop_Facial・Equals・1と設定する。

警告が出ているがこれはアニメーションが設定されていないためのもので、後で設定するので問題ない。

Transitionの一部の設定については以下に記載する。

Has Exit Time

時間経過で遷移するか否か、チェックを入れると時間経過で遷移する。チェックをオフにしてConditionsを設定しないと警告が出る(その状態から移動できなくなるため)

Exit Time

その状態を保持する時間、時間が過ぎると遷移する。Has Exit Timeがオフの場合は設定できない。

Transition Duration

状態遷移にかかる時間、ゆっくり表情を変えたいときなどは長く指定する。大体は0~0.2ぐらいでよい。

 

続いてJoyからExitへのTransitionも作成する。先ほどと同様にHas Exit Timeをオフに、Conditionsを追加して、Lop_Facial・NotEqual・1と設定する。

これはLop_Facialの値が1以外になったときにJoyからExitへ遷移するという意味になる。

 

Animationの作成

Animator Controllerを作成したら次は実際に再生するアニメーションを作成していく。

まずはデフォルト表情用のアニメーションを作成する。

右クリックのCreate→Animationで新規にアニメーションファイルを作成し名前を付ける(ここではdefault_faceとする)、先ほど作成したコントローラーのdefaultを選択しMotionにセットする。

 

次に、シーンにセットしたPrefabを選択し、AnimatorコンポーネントのContollerに先ほど作成したAnimator Controllerをセットする。

 

セットしたらUnityメニューの「Window→Animation→Animation」でアニメーションウィンドウを出し、アニメーションファイル名が表示されていること、Add Propertyボタンが押せる状態になっていることを確認する。

 

Add Propertyを押して、ブレンドシェイプが設定されているオブジェクトまで展開し、Skind Mesh Renderer以下にあるブレンドシェイプを登録していく。

SHIFTを押しながら”+”を押していくことで連続して登録できる。

 

ブレンドシェイプを登録したら値が全て0になっていることを確認し、0フレーム目のキーを1フレーム目にコピーする。コピーする際はウィンドウ一番上の部分を選択すると全選択できる。

 

キーのコピーが出来たら、インスペクターからLoop Timeのチェックを入れる。これでdefault_faceのアニメーションファイルの準備は完了となる。

 

次にdefault_faceをコピーして名前を変更する。ここでは「face_smile」という名前にしておく。

 

Animator Controllerを開いて、JoyのステートのMotionに今コピーして作ったface_smileを設定する。

 

先ほどと同じようにシーン上のPrefabを選択し、アニメーションウィンドウを開くと左上のセレクトボックスで「face_smile」が選択できるようになっているはずなので変更して笑顔用のブレンドシェイプキーの値を変更する。

シェイプキーの設定をしたら先ほどと同じように0フレーム目のキーをすべて1フレーム目にコピーする。

 

 

Playable Layers設定

シーン上のPrefabを選択し、Playable LayersのFXに先ほど作成したAnimator Controllerをセットする。

これで一通りの設定ができたのでVRChatで確認する。

リングメニューにFacialというサブメニューが追加され、その中のJoyを選択することで表情変更が確認できる。

 

上記の設定だと表情変更中にまばたきをしてまぶたが崩壊するため、まばたき(とリップシンク)をしないように設定する。

 

Animator Controllerを開き、defaultのステートを選択し「VRC Animator Tracking Control」を追加する。そして「Eyes & Eyelids」と「Mouth & Jow」をTrackingにセットする。

 

次にJoyのステートを選択し、「Eyes & Eyelids」と「Mouth & Jow」をAnimationにセットする。これで表情変化中の瞬きを防げる、はず。

参考:[VRChat] Avatars3.0で表情切り替え時のまばたき干渉防止を実装する

 

表情コントローラーの修正

ここまで作成してきた表情コントローラーは笑顔から別の表情に移行するときに一度デフォルトの表情を挟んでしまう。なのでどの表情からでもから各種表情にスムーズに遷移できるようにコントローラーを修正する。

 

修正したコントローラーはこのような感じになる。Any StateからTransitionをつなげることでどのステートからでも任意のステートに遷移することが出来る。今まで特に設定していなかったdefaultへはLop_Facialが0の時に遷移するように設定する。

 

エモートを差し替える(導入)

ここからはエモート(手を振る、拍手などの動作)を差し替える方法を記載していきます。大まかな流れとしては

  1. 1.エモートのアニメーションファイルを用意する。
  2. 2.サンプルのAction LayerのAnimator Controllerを複製する。
  3. 3.アバターのAction LayerのAnimator Controllerを複製したものに差し替える。
  4. 4.Expression Menuの設定をする
  5. 5.Animatior Controller内のアニメーションを差し替える。

となります。

 

アニメーションクリップのプロパティについて

今回は上の画像のような手を振るアニメーションを用意して、これをデフォルトのアニメーションと差し替えようと思います。

 

エモートで使用するのであれば、各カテゴリのBake Into Pose のチェックをオン、Based Upon をオリジナル、Offsetを0にしておけば問題ないでしょう。

 

各項目の説明は以下の通りです。

Bake Into Pose

ルート要素が移動/回転するアニメーションの時にオンにすると、ルート要素を固定する代わりにポーズを動かすようにする。

 

文字だけだとわからないと思うので説明用の動画を用意しました。

まずは説明用として「回転しながら浮いて斜め前方に移動する」というアニメーションを作成しました。このアニメーションの

  • Root Transform RotationのBake Into Pose をオフ
  • Root Transform Potition(Y)のBake Into Pose をオフ
  • Root Transform Potition(XZ)のBake Into Pose をオフ

にしたものを設定してVRChat上で再生してみます。

 

それぞれ「回転が無効化」「上下移動が無効化」「前後左右の移動が無効化」されているのがお分かりいただけるでしょうか?

このようにBaked Into PoseをオフにするとUnity上とは異なる挙動になるため基本的にはオンにすることが望ましいです。

 

Based Upon

アニメーションの回転およびXYZの基準をどこに設けるかの設定です。

  • ・Original:アニメーションで設定した値
  • ・Body Orientation(Rotationのみ):体の正面
  • ・Center of Mass(Positionのみ):重心
  • ・Feet(Yのみ):足元

エモート用のアニメーションであれば全てOriginalで問題なさそうです。ジャンプや浮遊するアニメーションなどでBody OrientationやFeetを選択すると地面に埋まるなどの不具合が起きる可能性があります。

 

Offset

アニメーションの回転および高さの調整です。アニメーション再生時に地面に埋まっている、浮いている場合に使用すると良さそうです。

 

参考:【Unity】アニメーションクリップのプロパティを理解する|XR-HUB

 

サンプルファイルの場所

エモートの差し替えを行うためにはPlayable LayersのAction Layerを独自のものに差し替える必要があるのだが、0から作るのは難しいためサンプルのAction Layerで使用されているAnimator Controllerを複製して使用します。

 

サンプルは「Packages/VRChat SDK – Avaters/Samples/AV3 Demo Assets」配下のファルダにあります。ここにはAnimator Controller以外にもBlendTreeやデフォルトアニメーションのファイルなどがあるので覚えておきましょう。

 

ここの「Animation/Controllers」フォルダに「vrc_Avatar V3 Action Layer」と言うファイルがあるのでこれを複製・名前の変更をして自分のアバター作成用のフォルダに移動しておきます。

 

デフォルトのエモート再生できるようにする

作成したエモートを使う準備として、まずはデフォルトで用意されているエモートを再生できるようにします。

 

まずは先ほど複製してきたAction LayerのAnimator ControllerをアバターのPlayable LayersのActionにセットします。

 

Animator Controllerの中身はこのようになっており、緑の枠で囲んでいる場所がデフォルトのエモートがセットされている箇所となります。

 

Transitionの一つを確認すると遷移条件として「VRCEmote」「Equals」「1」が設定されています。これはVRCEmoteという変数が1の時に遷移するという意味なので、これをリングニューから設定できるようにします。

 

Expression Paramtersの確認

ここでこの記事の最初の方で作成したExpression Parametersを確認します。特にいじっていなければ「VRCEmote」が定義されているはずです。なかったら上の画像を参考にして作成しましょう。

 

Expressions Menuの作成

エモートを呼び出すために右クリックのCreateからExpressions Menu を新規作成する。

Parametersには上のExpression ParametersをセットしControlsを追加し、名前はWave、TypeはButton、ParameterはVRCEmote、Valueは1に設定する。

これを合計8つ作成する。残り設定は以下の通り。

 

  • ・Clap:Toggle:2
  • ・Point:Button:3
  • ・Cheer:Toggle:4
  • ・Dance:Toggle:5
  • ・BackFlip:Button:6
  • ・SadKick:Button:7
  • ・Die:Toggle:8

 

次に親のExpressions Menuを開き、今作成したEmote用のメニューをサブメニューとして追加する。

 

動作確認

設定が終わったらVRChatで動作確認をする。

 

エモートを差し替える

ここまで来たらあと少しです。Action LayerのAnimator Controllerを開き、デフォルトエモートがセットされているステートのMotionを用意したアニメーションに差し替えます。

 

差し替えたエモートがループアニメーションか否かによって終了のTransitionの設定を変えましょう。

ループアニメでなければHas Exit Timeを設定し、一定時間で終わるようにします。ループアニメであればHas Exit TimeをオフにしてVRCEmoteが○○(エモートを動作させる時の値)でなくなったら遷移するように設定します。

 

エモートの差し替えはこれで完了です。

 

立ちポーズを変更する(導入)

ここからは立ち、しゃがみポーズ変更の方法を記載していく。大まかな流れとしては

  • 1.立ちポーズのアニメーションファイルを用意する。
  • 2.サンプルのBase LayerのAnimator Controllerを複製する。
  • 3.サンプルのBrend Tree3つを複製する。
  • 4.アバターのBase LayerのAnimator Controllerを複製したものに差し替える。
  • 5.Base Layer内のBrend Treeファイルを複製したものに差し替える。
  • 6.Brend Treeファイル内の立ちポーズアニメーションを差し替える。

となります。

 

Blend Treeとは

Blend Treeとは複数のアニメーションをスムーズにブレンドするための機能で、Animatorウィンドウの空いている場所を右クリックして「Create State → From new Blend Tree」を選択することで作ることが出来ます。

 

作成したステートを選択してMotion欄にあるBlend Treeをダブルクリックすることで中身を見ることが出来ます。

 

Blend Treeにはいくつか種類がありますが、VRChatでは「2D Freedom Directional」というものが使われています。これは2つの変数の組み合わせによってブレンドするアニメーションを決めるというものになります。この例の画像ではFloatXとFloatYの値の組み合わせによって下の4つのアニメーションがブレンドされます。

各項目の説明は以下の通りです。

Motion

再生されるアニメーション。

Pos X

1つ目の変数の値。

Pos Y

2つ目の変数の値。

時計のマーク

アニメーションの再生速度、2で2倍、0.5で1/2の速度になる。

人のマーク

チェックをオンにするとアニメーションを反転する。

 

上の画像を例にすると、FloatXの値が-1、FloatYの値が1の場合はproxy_run_forwardのアニメーションとproxy_run_strafe_rightのアニメーションがブレンドされる結果となります。

 

また、上記画像の赤い点を動かすと下にある3Dモデルのモーションが変わり、変数の変化によるモーションの変化を確認することが出来ます。

 

立ちポーズを変更する

というわけで今回はこのような立ちポーズのアニメーションファイルを用意してデフォルトの立ちポーズと差し替えようと思います。

 

サンプルファイルのコピー

まずはサンプルのBase Layer用のAnimator Controllerを複製します。「packages/VRChat SDK – Avatars/Samples/AV3 Demo Assets/Animation/Controllers」配下にあるvrc_AvatarV3LocomotionLayerファイルを複製して適当な名前を付けておきます。

 

同様に「packages/VRChat SDK – Avatars/Samples/AV3 Demo Assets/Animation/BlendTrees」配下にある3つのファイルも複製しておきます。これら3つは立ち、しゃがみ、伏せのアニメーション用のBlendTeeファイルとなっています。

 

Playable Layer設定

複製したBase Layer用のAnimator ControllerをアバターのPlayable Layers のBaseにセットします。

 

Animator Controller設定

セットしたAnimator Controllerを開き、Standingを選択、Motionに先ほど複製した3つのBlend TreeのうちのStanding用のもの(コピー元の名前がvrc_StandingLocomotion)をセットします。

 

Blend Treeの設定

セットしたBlend Treeをダブルクリックで開き、デフォルト立ちポーズのアニメーション(PosX 0、Pos Y 0 にセットされているproxy_stand_still)を用意したアニメーションクリップに差し替える。

 

これで設定は完了です。しゃがみや伏せのモーションについても立ちと同様の手順で変更することが出来ます。

 

腕がプルプルする

今回設定した立ちポーズは腕がゆっくり動くように設定していたのですが、実際にVRChat上で確認すると上の動画のように腕が細かく動いてしまっています。

 

Additive Layerを修正する

Additive LayerとはBase Layerのモーション(立ち、歩き、しゃがみなど)に追加のモーション(主に呼吸による動き)を追加するためのレイヤーで、このレイヤーでのアニメーションはUnityのHumanoidボーンの動きのみ動かすことが出来ます。

 

腕の動きを解消するためにはこのAdditive Layerのデフォルトでセットされているモーションを修正する必要があります。

 

ということでSampleファイルから「vrc_AvatarV3IdleLayer」コントローラーを複製してAdditve Layerにセットします。

 

そしてコントローラー内のUprite Idleにセットされていた「proxy_idle」を外すかキーフレームを打っていないアニメーションクリップに差し替えて設定完了です。

 

これで立ちポーズの時に腕が意図しない動きをするのを修正できました。

 

しゃがみポーズを変更したらポーズがおかしい

しゃがみポーズを変更しようとして上の画像のようなアニメーションを作ったとします。

 

しかし実際にVRChat上で確認すると足の位置などがずれてしまうという現象が発生することがあります。

 

参考:BaseLayerを設定する上での注意点・ぺた座りの実装方法 |しぐにゃもブログ

 

解決方法としては、座りポーズに使っているアニメーションファイルのRoot Transform Position(Y) の Offsetを調整することで解決します。

 

ただ、座り時のHeadボーンの高さは立ち状態の時の60%に固定されるという仕様のせいでお尻を地面につけるようなしゃがみポーズを作るのは難しそうです(上の画像も実はちょっとお尻が浮いている)

どうしてもやりたい場合はエモートとして作る等の必要がありそうです。

 

PhysBone設定

VRChatで髪の毛等を揺らすためにはPhysBoneコンポーネントを使う必要がある。コンポーネント自体は揺らしたいボーンにつける必要はないので、PhysBone用のオブジェクトを作ってそこに集約してしたほうが設定しやすい。

 

各パラメータの説明

Forces

PhysBoneの動きを決める項目群。

Pull

元に戻る強さを決める。値が大きいほど元の形に戻る力が強くなり、小さくなると元の形に戻るまで時間がかかる。

Momentum

戻る際の勢い。値が大きいほど戻る際の揺れが激しくなり、小さいとゆったりと元の形に戻っていく。髪の毛やスカートのような軽いものは小さく、重いものなどは大きくすると良い。

Stiffness

硬さ。値が大きいほどボーンが動きにくく、戻りにくくなる。小さいと良く動くようになる。

Gravity

重力。

Gravity Falloff

よくわかんないッピ・・・。

Immobile Type

影響の受けにくさの種類を設定する。World(Experimental)を指定すると移動時にPhysBoneが動きすぎるのを防ぐことが出来る。

Immobile

影響の受けにくさ。上記Immobile TypeをWorld(Experimental)にしてこちらを1にすると移動時に動かずにモーションでのみPhysBoneが動くようにできる。

 

RotationConstraint設定

設定方法

気が向いたら書く。

 

Constraint設定した箇所が逆に動く

RotationConstraintを設定したボーンが逆に動くことがたまにある。上の画像は右足首に設定した補助ボーンが足首の動きとは逆の方向に回転してしまっている。

 

ソースを忘れてしまったが「UnityのRotationConstraintは連動するボーンの向きとロールが大きくずれていると正しく動かないことがある」らしいのでBlenderで補助ボーンの向きとロールを足に近い向きに合わせた。

 

FBXをエクスポートしなおしてUnityでRotationConstraintを設定しなおすと、補助ボーンの回転が想定通りに直っていることが確認できた。

 

UnityPackageを作る

UnityPackageを作るには、エクスポートしたいPrefabを右クリックして「Export package」を選択するだけでよい。必要なアセットが表示されるので不要なアセットや再配布が禁止されているアセットが含まれていないことを確認してエクスポートする。

 

TOP

コメントする

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

CAPTCHA