ハンドサインで表情を変える
ピースをすると笑顔になる、グーにすると怒った顔になる。ハンドサインで表情を変えるしくみを、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)で足すだけです。名前は大文字と小文字まで同じにします。
| 番号 | 名前 | 手の形 | この記事の例の表情 |
|---|---|---|---|
| 0 | Neutral | 何もしていない手(軽く開いた形) | いつもの顔(Face_Neutral) |
| 1 | Fist | にぎりこぶし(グー) | 怒り(Face_Angry) |
| 2 | HandOpen | 指をすべて大きく開く(パー) | 驚き(Face_Surprise) |
| 3 | FingerPoint | 人差し指だけを伸ばす(指さし) | ジト目(Face_Jito) |
| 4 | Victory | 人差し指と中指を立てる(ピース) | 笑顔(Face_Smile) |
| 5 | RockNRoll | 人差し指と小指を立てる | ウインク(Face_Wink) |
| 6 | HandGun | 親指と人差し指を立てる(ピストルの形) | 悲しい(Face_Sad) |
| 7 | ThumbsUp | 親指だけを立てる(いいね) | 大笑い(Face_Laugh) |
番号と名前は、VRChat の Animator Parameters のページ(新しいタブで開きます)によります。手の形は目安です。コントローラーによって、どの指をどう動かすとその番号になるかが違います。
表情を割り当てるハンドサインは、全部でなくてかまいません。ものを持つときに出やすい Fist(グー)や、話しながら出やすい FingerPoint(指さし)には、表情を割り当てないこともよくあります。
表情のクリップを作る
表情は、アニメーションクリップに BlendShape の値を書いて作ります。クリップの作り方(録画)は第7回 アニメーションを作るで解説しています。ここでは、表情のクリップで守ることを書きます。
- Project ウィンドウで、表情のクリップを置くフォルダを作ります(例:
Assets/MyGesture)。右クリック →Create → Animationで、表の右の名前のクリップを作ります(例:Face_Smile)。いつもの顔のFace_Neutralも作ります。 - Hierarchy でアバターを選び、
Window → Animation → Animationで Animation ウィンドウを開きます。左上でクリップをFace_Smileに切り替え、録画ボタン(赤い丸)を押します。 - Hierarchy で顔のメッシュ(Body などの Skinned Mesh Renderer)を選び、Inspector の
BlendShapesで、笑顔に使う BlendShape の値を上げます。録画中なので、変えた値がクリップに書かれます。 - 表情に使う BlendShape は、すべてのクリップに書きます。笑顔のクリップにも、怒りや驚きに使う BlendShape を 0 で書いておきます。Write Defaults が OFF のアバターでは、クリップに無い BlendShape は前の値が残るためです。全部を書いておけば、Write Defaults が ON でも OFF でも、同じ表情になります。
- 表情と関係ない BlendShape(体の縮小や、頬染め、服を消す形など)は書きません。書くと、ハンドサインを変えたときに体の形まで変わります。録画ボタンをもう一度押して、録画を止めます。
- ほかの表情も同じように作ります。
Face_Neutralは、表情に使う BlendShape をすべて、いつもの値(ふつうは 0)で書いたクリップです。
- 笑顔に使う BlendShape です。ここだけを上げます。
- ほかの表情に使う 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回 メニューでオンオフするギミックを作るで解説しています。
- 自分の Animator Controller をダブルクリックして、Animator ウィンドウ(
Window → Animation → Animator)で開きます。 - 左上の
Parametersタブで+を押し、Intを選んでGestureLeftと名前を付けます。同じようにGestureRightも足します。 Layersタブで+を押し、新しいレイヤーの名前をLeft Handにします。レイヤーの右の歯車を押し、Weightを 1 にします。新しく作ったレイヤーは Weight が 0 なので、このままでは動きません。- Project ウィンドウから、表情のクリップ8つを、Animator ウィンドウの何もないところへドラッグします。クリップと同じ名前のステートが8つできます。
Face_Neutralのステートを右クリックし、Set as Layer Default Stateを押します。オレンジ色になったステートが、最初に入るステートです。- ステートを1つずつ選び、Inspector の
Write Defaultsを、アバターのほかのレイヤーと同じにそろえます(迷ったら、もとの FX のステートを1つ選んで見ます)。 - 同じように
Right Handレイヤーを作り、Weight を 1 にします。こちらは Neutral のステートにFace_Noneを置き、それをデフォルトにします。Right HandがLeft Handより下にあることを確かめます。
トランジションの設定
ハンドサインが変わったら、すぐにその表情のステートへ移るようにします。どのステートにいても移れるように、Any State からトランジションを引きます。
Left Handレイヤーで、水色のAny Stateを右クリックし、Make Transitionを押してから、Face_Smileのステートをクリックします。矢印ができます。- 矢印をクリックし、Inspector の
Conditionsの+を押します。GestureLeft、Equals、4にします。「左手が Victory(4)のとき」という意味です。 Has Exit Timeのチェックを外します。付いていると、前のステートのクリップが終わるまで待ってしまいます。Settingsを開き、Transition Durationを 0.1 くらいにします。表情がふわっと切り替わります。オンオフのギミックでは 0 にしましたが、表情は少し時間をかけたほうが自然に見えます。Can Transition To Selfのチェックを外します。付いていると、そのステートにいる間も毎フレーム入り直し、表情がちらついたり、変わりきらなかったりします。- ほかの番号(Neutral の 0 も含めて)にも、同じように Any State からトランジションを作ります。番号だけを変えます。
Right Handレイヤーでも同じことをします。Conditions はGestureRightにします。
▼ Settings
Conditions
- 外します。ハンドサインを変えたらすぐ移るためです。
- 表情は 0.1 くらいで、なめらかに切り替えます。
- Any State からのトランジションでは、必ず外します。
- 左手が Victory(4)のとき、という条件です。
オンオフのギミックのトランジションの設定は、第8回 メニューでオンオフするギミックを作るで解説しています。
動かして確かめる
左手と右手のハンドサイン、どちらのレイヤーを下に置くか、下のレイヤーの Neutral に何を置くかを変えて、どの表情が見えるかを確かめてください。
左手のレイヤー(上)
笑顔
右手のレイヤー(下)
表情を書かない
見える表情
下にある右手のレイヤーは Neutral で、表情を書きません。上にある左手のレイヤーが書いた「笑顔」が、そのまま見えます。
見える表情:笑顔(左手のレイヤー)
まばたき・口との重なり(Tracking Control)
VRChat は、表情とは別に、まばたきと口の形(話したときの口の動き。Viseme)を自分で動かします。表情のクリップが目を閉じたり口を開けたりしていると、その上にまばたきや口の動きが重なり、目が裏返ったように見えたり、口が二重になったりします。
これを防ぐのが、VRC Animator Tracking Control です。ステートに付けると、そのステートに入ったときに、VRChat のまばたきや口の動きを止めたり(Animation)、戻したり(Tracking)できます。No Change は、いまの設定を変えません。設定は、ほかのステートでもう一度変えるまで続きます(VRChat の State Behaviors のページ(新しいタブで開きます))。
左手と右手のレイヤーに別々に付けると、片手を戻したときに、もう片方の手の表情の途中でまばたきが戻ってしまいます。そこで、まばたきと口だけを受け持つレイヤーを1つ作ります。
Layersタブで+を押し、Eyes Mouthというレイヤーを作ります。歯車を押して Weight を 1 にします。- 何もないところを右クリック →
Create State → Emptyで、ステートを2つ作ります。名前はTracking(いつも)とAnimation(表情を出している間)にします。Trackingをデフォルトにします。ステートの Motion にはFace_Noneを入れておくと、Write Defaults が OFF でも安心です。 Animationのステートを選び、Inspector のAdd Behaviourを押してVRC Animator Tracking Controlを選びます。Eyes & EyelidsをAnimationにします。表情で口の形も変えるなら、Mouth & JawもAnimationにします。ほかの部位はNo Changeのままにします。Trackingのステートにも同じ Behaviour を付け、さきほど変えた部位をTrackingにします。TrackingからAnimationへ、トランジションを2本引きます。1本目の条件はGestureLeft NotEqual 0、2本目はGestureRight NotEqual 0です。トランジションを分けると「どちらかの手が」という意味になります。AnimationからTrackingへは1本引き、条件を2つ足します。GestureLeft Equals 0とGestureRight Equals 0です。1本のトランジションに条件を並べると「両方の手が」という意味になります。どのトランジションも、Has Exit Time を外し、Transition Duration は 0 にします。
- 表情を出している間、まばたきと目の動きを止めます。
- 口を変える表情なら、話したときの口の動きを止めます。止めている間は、話しても口が動きません。
口を変えない表情だけなら、Mouth & Jaw は止めないほうが、話したときに口が動いて自然です。表情ごとに分けたいときは、そのハンドサインの番号だけで Animation に移るように、条件を変えます。
握りの強さで、表情を少しずつ変える
GestureLeftWeight と GestureRightWeight は、トリガーをどれだけ引いているかを 0 から 1 で表す Float のパラメーターです。たとえばグー(Fist)でトリガーを引いていないときは、GestureLeft は 1 で、GestureLeftWeight は 0 です。引くにつれて 1 に近づきます。
これを使うと、「グーで、握りこむほど怒った顔になる」ような表情が作れます。しくみは、メニューのダイヤルで少しずつ変えるギミックと同じ Motion Time です(第9回 段階で切り替える・少しずつ変えるギミック)。
- Animator の Parameters に、
FloatでGestureLeftWeightを足します。 - 怒りのクリップを複製し、最初のフレーム(0)でいつもの顔、最後のフレームで怒りの顔になるように、キーを2つ打ちます。
Left HandレイヤーのFace_Angryのステートを選び、Motion をこのクリップに替えます。Inspector のMotion Timeの横のParameterにチェックを入れ、GestureLeftWeightを選びます。
握りの強さは、ほかの人にも送られますが、送られる回数は多くありません。ほかの人からは、変わり方が少しなめらかでなく見えることがあります。
メニューで表情を止める
写真を撮るときや、ものを持つときに、表情が勝手に変わらないようにするスイッチです。Bool のパラメーターを1つ足して、トランジションの条件に加えます。
- Expression Parameters に、Bool の
GestureFaceOffを足します(Saved と Synced にチェック、Default は外す)。メニューに、このパラメーターの Toggle を置きます。足し方は第8回 メニューでオンオフするギミックを作ると第8回 メニューでオンオフするギミックを作ると同じです。 - Animator の Parameters にも、Bool の
GestureFaceOffを足します。 Left Handレイヤーで、Neutral 以外の表情へのトランジションを1本ずつ選び、Conditions にGestureFaceOff、falseを足します。「表情を止めていないときだけ」という意味になります。- Any State から Neutral へのトランジションをもう1本引き、条件を
GestureFaceOff、trueにします。止めた瞬間に、いつもの顔へ戻ります。 Right HandレイヤーとEyes Mouthレイヤーにも、同じように条件を足します。Eyes Mouthでは、GestureFaceOffが true のときにTrackingへ戻るトランジションを足します。
アバターにつないで試す
- 自分の Animator Controller を、Modular Avatar の MA Merge Animator で FX につなぎます。つなぎ方は第8回 メニューでオンオフするギミックを作るを見てください。
- Gesture Manager を入れていれば、Unity で再生して、左右のハンドサインを選んで試せます。左だけ、右だけ、両方の順に試し、表のとおりの表情になるかを見ます。
- 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 で止めます。