アバター改変の解説 第10回

ハンドサインで表情を変える

ピースをすると笑顔になる、グーにすると怒った顔になる。ハンドサインで表情を変えるしくみを、FX の Animator に自分で組みます。ハンドサインの番号、左右の手のどちらを優先するか、まばたきや口の動きとの重なり、握りの強さの使い方まで解説します。

公開 · 対象は Unity の Built-in Render Pipeline と VRChat のアバター(Avatars 3.0)です。2026年11月時点の内容です。

こんなときに読んでください

  • ハンドサインで表情が変わるようにしたい。
  • 買ったアバターの表情を、別のハンドサインに入れ替えたい。
  • 左右の手で違うハンドサインをしたとき、どちらの表情になるかを決めたい。
  • 表情を変えたとき、まばたきや口の動きが重なって顔が崩れる。

作るもの

この記事では、次のしくみを作ります。第8回 メニューでオンオフするギミックを作るで、レイヤー・ステート・トランジション・パラメーターを一度使っている前提で書きます。

表情のクリップ
ハンドサインごとの顔を、BlendShape(シェイプキー)だけを書いたアニメーションクリップにします。
左手のレイヤー
FX に Left Hand レイヤーを作り、GestureLeft の番号で表情のステートを切り替えます。
右手のレイヤー
Right Hand レイヤーも同じように作ります。左右で同時に違うハンドサインをしたときは、右手を優先します。
まばたき・口のレイヤー
表情を出している間だけ、VRChat のまばたきや口の動きを止めます。
メニューのオンオフ
表情を変えたくないときのために、メニューでハンドサインの表情を止められるようにします。

買ったアバターの多くは、ハンドサインで表情が変わるしくみを、はじめから FX に持っています。Animator で FX を開き、Left Hand や Right Hand、Gesture のような名前のレイヤーがあるかを見てください。あるときは、新しく作るより、そのレイヤーのクリップを差し替えたり、トランジションの番号を変えたりするほうが手早く、ぶつかりもありません。

新しく作ってつなぐときは、もとのハンドサインのレイヤーを消すか止めてください。同じ BlendShape を書くレイヤーが二重にあると、どちらの表情が出るかが分かりにくくなります(理由は下の「左右の手のレイヤーと優先」で説明します)。

ハンドサインの番号

VRChat は、いまのハンドサインを番号にして、GestureLeft(左手)と GestureRight(右手)という Int のパラメーターに入れます。どちらも VRChat が自動で値を入れてくれるパラメーターです。Expression Parameters に足す必要はなく、ほかの人にも VRChat が送ります。

使うときは、Animator の Parameters に、同じ名前・同じ型(Int)で足すだけです。名前は大文字と小文字まで同じにします。

番号名前手の形この記事の例の表情
0Neutral何もしていない手(軽く開いた形)いつもの顔(Face_Neutral)
1Fistにぎりこぶし(グー)怒り(Face_Angry)
2HandOpen指をすべて大きく開く(パー)驚き(Face_Surprise)
3FingerPoint人差し指だけを伸ばす(指さし)ジト目(Face_Jito)
4Victory人差し指と中指を立てる(ピース)笑顔(Face_Smile)
5RockNRoll人差し指と小指を立てるウインク(Face_Wink)
6HandGun親指と人差し指を立てる(ピストルの形)悲しい(Face_Sad)
7ThumbsUp親指だけを立てる(いいね)大笑い(Face_Laugh)

番号と名前は、VRChat の Animator Parameters のページ(新しいタブで開きます)によります。手の形は目安です。コントローラーによって、どの指をどう動かすとその番号になるかが違います。

表情を割り当てるハンドサインは、全部でなくてかまいません。ものを持つときに出やすい Fist(グー)や、話しながら出やすい FingerPoint(指さし)には、表情を割り当てないこともよくあります。

表情のクリップを作る

表情は、アニメーションクリップに BlendShape の値を書いて作ります。クリップの作り方(録画)は第7回 アニメーションを作るで解説しています。ここでは、表情のクリップで守ることを書きます。

  1. Project ウィンドウで、表情のクリップを置くフォルダを作ります(例:Assets/MyGesture)。右クリック → Create → Animation で、表の右の名前のクリップを作ります(例:Face_Smile)。いつもの顔の Face_Neutral も作ります。
  2. Hierarchy でアバターを選び、Window → Animation → Animation で Animation ウィンドウを開きます。左上でクリップを Face_Smile に切り替え、録画ボタン(赤い丸)を押します。
  3. Hierarchy で顔のメッシュ(Body などの Skinned Mesh Renderer)を選び、Inspector の BlendShapes で、笑顔に使う BlendShape の値を上げます。録画中なので、変えた値がクリップに書かれます。
  4. 表情に使う BlendShape は、すべてのクリップに書きます。笑顔のクリップにも、怒りや驚きに使う BlendShape を 0 で書いておきます。Write Defaults が OFF のアバターでは、クリップに無い BlendShape は前の値が残るためです。全部を書いておけば、Write Defaults が ON でも OFF でも、同じ表情になります。
  5. 表情と関係ない BlendShape(体の縮小や、頬染め、服を消す形など)は書きません。書くと、ハンドサインを変えたときに体の形まで変わります。録画ボタンをもう一度押して、録画を止めます。
  6. ほかの表情も同じように作ります。Face_Neutral は、表情に使う BlendShape をすべて、いつもの値(ふつうは 0)で書いたクリップです。
再現図:Unity の Animation ウィンドウ(笑顔のクリップの中身)。名前は例です
  1. 笑顔に使う BlendShape です。ここだけを上げます。
  2. ほかの表情に使う BlendShape も、0 で書いておきます。前の表情の値が残らないようにするためです。

関係ない BlendShape が入ったときに起きることは、第13回 Unity と VRChat で見た目が変わるの「ハンドサインで関係ないところまで変わる」を見てください。

左右の手のレイヤーと優先

左手と右手は、FX の中で別々のレイヤーにします。Left Hand レイヤーは GestureLeft だけを見て、Right Hand レイヤーは GestureRight だけを見ます。

どちらのレイヤーも、同じ顔の BlendShape を書きます。同じものを書くレイヤーが2つあるときは、Animator の Layers の並びで下にあるレイヤーが勝ちます。上のレイヤーが書いた値を、下のレイヤーが上から書き直すためです。

右手(下のレイヤー)左手(上のレイヤー)見える表情
Neutral(0)Neutral(0)いつもの顔
Neutral(0)Victory(4)左手の笑顔
Fist(1)Neutral(0)右手の怒り
Fist(1)Victory(4)右手の怒り(下のレイヤーが勝つ)

この表のとおりになるには、1つ大事な決まりがあります。下のレイヤー(右手)の Neutral のステートでは、表情の BlendShape を書かないことです。右手の Neutral が「すべて 0」と書いてしまうと、右手が何もしていないときでも、左手の表情が上書きされて消えます。

そこで、右手の Neutral には、表情を書かないクリップ Face_None を置きます。上の左手のレイヤーの Neutral には、いつもの顔の Face_Neutral を置きます。両手が Neutral のときは、左手のレイヤーがいつもの顔を書くので、顔は元に戻ります。

Face_None は、中身が空のクリップでもかまいません。ただ、Write Defaults が OFF のステートに空のクリップを置くと、値が残るなどの不具合が出ることがあるといわれています。気になるときは、アバターの中に空の GameObject(例:FaceDummy)を作り、録画でその GameObject のオン(Is Active)だけを書いたクリップにします。顔には何も起きません。

どちらの手を優先するか

よく使う手を下に
表情を出したいときによく使う手のレイヤーを、下に置きます。両手を使ったときに、その手の表情が出ます。
ものを持つ手を上に
ものを持つとグー(Fist)になりやすいほうの手は、上に置くと、持っている間に表情が勝手に変わりにくくなります。
並びの変え方
Animator の Layers の一覧で、レイヤーの名前をドラッグして上下を入れ替えます。

レイヤーとステートを作る

表情のレイヤーは、FX につなぐ自分の Animator Controller に作ります。コントローラーを作ってアバターにつなぐ方法は、第8回 メニューでオンオフするギミックを作るで解説しています。

  1. 自分の Animator Controller をダブルクリックして、Animator ウィンドウ(Window → Animation → Animator)で開きます。
  2. 左上の Parameters タブで + を押し、Int を選んで GestureLeft と名前を付けます。同じように GestureRight も足します。
  3. Layers タブで + を押し、新しいレイヤーの名前を Left Hand にします。レイヤーの右の歯車を押し、Weight を 1 にします。新しく作ったレイヤーは Weight が 0 なので、このままでは動きません。
  4. Project ウィンドウから、表情のクリップ8つを、Animator ウィンドウの何もないところへドラッグします。クリップと同じ名前のステートが8つできます。
  5. Face_Neutral のステートを右クリックし、Set as Layer Default State を押します。オレンジ色になったステートが、最初に入るステートです。
  6. ステートを1つずつ選び、Inspector の Write Defaults を、アバターのほかのレイヤーと同じにそろえます(迷ったら、もとの FX のステートを1つ選んで見ます)。
  7. 同じように Right Hand レイヤーを作り、Weight を 1 にします。こちらは Neutral のステートに Face_None を置き、それをデフォルトにします。Right Hand が Left Hand より下にあることを確かめます。

トランジションの設定

ハンドサインが変わったら、すぐにその表情のステートへ移るようにします。どのステートにいても移れるように、Any State からトランジションを引きます。

  1. Left Hand レイヤーで、水色の Any State を右クリックし、Make Transition を押してから、Face_Smile のステートをクリックします。矢印ができます。
  2. 矢印をクリックし、Inspector の Conditions の + を押します。GestureLeft、Equals、4 にします。「左手が Victory(4)のとき」という意味です。
  3. Has Exit Time のチェックを外します。付いていると、前のステートのクリップが終わるまで待ってしまいます。
  4. Settings を開き、Transition Duration を 0.1 くらいにします。表情がふわっと切り替わります。オンオフのギミックでは 0 にしましたが、表情は少し時間をかけたほうが自然に見えます。
  5. Can Transition To Self のチェックを外します。付いていると、そのステートにいる間も毎フレーム入り直し、表情がちらついたり、変わりきらなかったりします。
  6. ほかの番号(Neutral の 0 も含めて)にも、同じように Any State からトランジションを作ります。番号だけを変えます。
  7. Right Hand レイヤーでも同じことをします。Conditions は GestureRight にします。
再現図:Unity の Inspector(Any State から Face_Smile へのトランジション)。名前は例です
  1. 外します。ハンドサインを変えたらすぐ移るためです。
  2. 表情は 0.1 くらいで、なめらかに切り替えます。
  3. Any State からのトランジションでは、必ず外します。
  4. 左手が Victory(4)のとき、という条件です。

オンオフのギミックのトランジションの設定は、第8回 メニューでオンオフするギミックを作るで解説しています。

動かして確かめる

左手と右手のハンドサイン、どちらのレイヤーを下に置くか、下のレイヤーの Neutral に何を置くかを変えて、どの表情が見えるかを確かめてください。

左手のレイヤー(上)

笑顔

右手のレイヤー(下)

表情を書かない

下に置くレイヤー(優先)
下のレイヤーの Neutral のクリップ

見える表情

下にある右手のレイヤーは Neutral で、表情を書きません。上にある左手のレイヤーが書いた「笑顔」が、そのまま見えます。

見える表情:笑顔(左手のレイヤー)

まばたき・口との重なり(Tracking Control)

VRChat は、表情とは別に、まばたきと口の形(話したときの口の動き。Viseme)を自分で動かします。表情のクリップが目を閉じたり口を開けたりしていると、その上にまばたきや口の動きが重なり、目が裏返ったように見えたり、口が二重になったりします。

これを防ぐのが、VRC Animator Tracking Control です。ステートに付けると、そのステートに入ったときに、VRChat のまばたきや口の動きを止めたり(Animation)、戻したり(Tracking)できます。No Change は、いまの設定を変えません。設定は、ほかのステートでもう一度変えるまで続きます(VRChat の State Behaviors のページ(新しいタブで開きます))。

左手と右手のレイヤーに別々に付けると、片手を戻したときに、もう片方の手の表情の途中でまばたきが戻ってしまいます。そこで、まばたきと口だけを受け持つレイヤーを1つ作ります。

  1. Layers タブで + を押し、Eyes Mouth というレイヤーを作ります。歯車を押して Weight を 1 にします。
  2. 何もないところを右クリック → Create State → Empty で、ステートを2つ作ります。名前は Tracking(いつも)と Animation(表情を出している間)にします。Tracking をデフォルトにします。ステートの Motion には Face_None を入れておくと、Write Defaults が OFF でも安心です。
  3. Animation のステートを選び、Inspector の Add Behaviour を押して VRC Animator Tracking Control を選びます。Eyes & Eyelids を Animation にします。表情で口の形も変えるなら、Mouth & Jaw も Animation にします。ほかの部位は No Change のままにします。
  4. Tracking のステートにも同じ Behaviour を付け、さきほど変えた部位を Tracking にします。
  5. Tracking から Animation へ、トランジションを2本引きます。1本目の条件は GestureLeft NotEqual 0、2本目は GestureRight NotEqual 0 です。トランジションを分けると「どちらかの手が」という意味になります。
  6. Animation から Tracking へは1本引き、条件を2つ足します。GestureLeft Equals 0 と GestureRight Equals 0 です。1本のトランジションに条件を並べると「両方の手が」という意味になります。どのトランジションも、Has Exit Time を外し、Transition Duration は 0 にします。
再現図:Unity の Inspector(Animation のステートの VRC Animator Tracking Control)。名前は例です
  1. 表情を出している間、まばたきと目の動きを止めます。
  2. 口を変える表情なら、話したときの口の動きを止めます。止めている間は、話しても口が動きません。

口を変えない表情だけなら、Mouth & Jaw は止めないほうが、話したときに口が動いて自然です。表情ごとに分けたいときは、そのハンドサインの番号だけで Animation に移るように、条件を変えます。

握りの強さで、表情を少しずつ変える

GestureLeftWeight と GestureRightWeight は、トリガーをどれだけ引いているかを 0 から 1 で表す Float のパラメーターです。たとえばグー(Fist)でトリガーを引いていないときは、GestureLeft は 1 で、GestureLeftWeight は 0 です。引くにつれて 1 に近づきます。

これを使うと、「グーで、握りこむほど怒った顔になる」ような表情が作れます。しくみは、メニューのダイヤルで少しずつ変えるギミックと同じ Motion Time です(第9回 段階で切り替える・少しずつ変えるギミック)。

  1. Animator の Parameters に、Float で GestureLeftWeight を足します。
  2. 怒りのクリップを複製し、最初のフレーム(0)でいつもの顔、最後のフレームで怒りの顔になるように、キーを2つ打ちます。
  3. Left Hand レイヤーの Face_Angry のステートを選び、Motion をこのクリップに替えます。Inspector の Motion Time の横の Parameter にチェックを入れ、GestureLeftWeight を選びます。

握りの強さは、ほかの人にも送られますが、送られる回数は多くありません。ほかの人からは、変わり方が少しなめらかでなく見えることがあります。

メニューで表情を止める

写真を撮るときや、ものを持つときに、表情が勝手に変わらないようにするスイッチです。Bool のパラメーターを1つ足して、トランジションの条件に加えます。

  1. Expression Parameters に、Bool の GestureFaceOff を足します(Saved と Synced にチェック、Default は外す)。メニューに、このパラメーターの Toggle を置きます。足し方は第8回 メニューでオンオフするギミックを作ると第8回 メニューでオンオフするギミックを作ると同じです。
  2. Animator の Parameters にも、Bool の GestureFaceOff を足します。
  3. Left Hand レイヤーで、Neutral 以外の表情へのトランジションを1本ずつ選び、Conditions に GestureFaceOff、false を足します。「表情を止めていないときだけ」という意味になります。
  4. Any State から Neutral へのトランジションをもう1本引き、条件を GestureFaceOff、true にします。止めた瞬間に、いつもの顔へ戻ります。
  5. Right Hand レイヤーと Eyes Mouth レイヤーにも、同じように条件を足します。Eyes Mouth では、GestureFaceOff が true のときに Tracking へ戻るトランジションを足します。

アバターにつないで試す

  1. 自分の Animator Controller を、Modular Avatar の MA Merge Animator で FX につなぎます。つなぎ方は第8回 メニューでオンオフするギミックを作るを見てください。
  2. Gesture Manager を入れていれば、Unity で再生して、左右のハンドサインを選んで試せます。左だけ、右だけ、両方の順に試し、表のとおりの表情になるかを見ます。
  3. Animator ウィンドウでアバターを選んだまま再生すると、いまどのステートにいるかが青く表示されます。表情が出ないときは、どのレイヤーのどのステートにいるかを見ます。

よくある困りごとと直し方

左手の表情が出ない

起きること
右手だけで作った表情は出るのに、左手のハンドサインでは表情が変わらない。
原因
下にある Right Hand レイヤーの Neutral が、表情の BlendShape をすべて 0 と書いていて、左手の表情を上書きしています。
直し方
Right Hand の Neutral のクリップを、表情を書かない Face_None に替えます。

表情が混ざる

起きること
笑顔から怒りに変えると、笑った目のまま怒った口になるなど、2つの表情が混ざる。
原因
Write Defaults が OFF で、怒りのクリップに笑顔の BlendShape が書かれていないため、笑顔の値が残っています。
直し方
表情に使う BlendShape を、すべてのクリップに書きます。その表情で使わないものは 0 にします。

表情がちらつく・変わりきらない

起きること
ハンドサインをしている間、表情がちらついたり、途中で止まったりする。
原因
Any State からのトランジションの Can Transition To Self にチェックが付いていて、毎フレーム入り直しています。
直し方
Any State からのトランジションを1本ずつ選び、Can Transition To Self を外します。

表情が一拍遅れる

起きること
ハンドサインを変えてから、表情が変わるまでに間がある。
原因
トランジションの Has Exit Time にチェックが付いているか、Transition Duration が長すぎます。
直し方
Has Exit Time を外し、Transition Duration を 0.1 くらいにします。

まばたきや口が重なる

起きること
目を閉じる表情でまばたきが重なって目が崩れる。口を開けた表情で話すと、口が二重になる。
原因
VRChat のまばたきや口の動きが、表情の上から動いています。
直し方
Eyes Mouth のレイヤーを作り、表情の間は Tracking Control で Eyes & Eyelids(と Mouth & Jaw)を Animation にします。

もとの表情と自分の表情が両方出る

起きること
同じハンドサインで、アバターのもとの表情と、自分で作った表情が切り替わって出る。
原因
アバターのもとのハンドサインのレイヤーと、自分のレイヤーが、両方とも同じ BlendShape を書いています。
直し方
どちらか一方だけを残します。もとのレイヤーのクリップを差し替える方法がいちばんぶつかりません。

手を戻しても表情が戻らないときや、体の形まで変わるときは、第13回 Unity と VRChat で見た目が変わるを見てください。

気をつけること

  • 表情のクリップには、顔の BlendShape だけを書きます。体の形や服、オブジェクトのオンオフは書きません。
  • まばたきに使う BlendShape(VRC Avatar Descriptor の Eyelids に入っているもの)は、表情のクリップで書かないほうが安全です。VRChat のまばたきとぶつかることがあります。
  • 同じコントローラーの中で、Write Defaults の ON と OFF を混ぜないでください。
  • 表情を作るツールや、アバターの更新で FX が作り直されると、自分の変更が消えることがあります。変えたクリップは、別のフォルダに複製しておきます。
  • 左右のレイヤーの上下を入れ替えたら、Neutral のクリップも入れ替えます。下のレイヤーの Neutral が Face_None、上のレイヤーの Neutral が Face_Neutral です。

まとめ

  • ハンドサインは GestureLeft・GestureRight に 0〜7 の番号で入ります。Expression Parameters に足す必要はありません。
  • 表情のクリップには、表情に使う BlendShape をすべて書き、関係ないものは書きません。
  • 同じ BlendShape を書くレイヤーは、下のレイヤーが勝ちます。下のレイヤーの Neutral には、表情を書かないクリップを置きます。
  • Any State からのトランジションは、Equals の条件、Has Exit Time なし、Can Transition To Self なしにします。
  • まばたきや口とぶつかるときは、VRC Animator Tracking Control で止めます。

アバター改変の解説の一覧