VRCでフレンドをMMDダンスさせる（2025/02/16 時点）

## 初めに
これはVRChat向けの記事です。
VRChatにおけるUnityを前提として書いているため、一般的なUnityとは乖離しているケースが多々含まれます。ご注意ください。
また、今回の記事は導入編なので最適化はあまり突き詰めて解説を行いません。
~~細かいこと書き出すとアニメーターのレイヤー１個に綺麗にまとめたりするやり方など色々書けますが、あまりに複雑になり導入向けでなくなるので今回は見送っております~~

### 前提知識
この記事では以下の知識を前提としています。

* 基本的なUnity操作（アニメーターのState遷移など）
* VRC_Stationの基礎動作
* 筆者の拙い文章を理解する読解力と根気

特に、今回はある程度知識がある方に向けてになりますので、説明かなり端折ります。
エクスプレッションメニューの追加方法などは別の方の記事等を参考にしてください

https://note.com/ran_kotonoha/n/nd1fc7f1d84ea

### やりたいこと
フレンドをダンスさせたい！と質問を受け、記事を探してみたが情報が古い記事しかなかった為、新しいやり方の提示

内容に関しては３段階に分けて解説します

* MMDダンスをUnity用に変換する方法
* ダンスさせる椅子の実装
* ダンスと同時に音楽が鳴り始めるギミックの実装

## 事前準備
この項目ではこの記事にて使用するものをDLするリンクと著作権についての解説です。
unityやVCCと言ったアバターをアップロードするのに全員必須級のモノに関しては省略させていただきます。

### 著作権等に関する注意！！！
**MMDダンス側の利用規約をよく読み著作権で揉めないように
最大限注意を払ってください！！！！**

以前MMDダンス界隈とVRC界隈でバチってた時期もあり利用規約で名指しで「VRCで使用不可」と書かれているモノがあるほどです。
こちらはお借りする側なので絶対に**リスペクトを持って利用規約厳守でお願いします**
炎上したらこの記事も消さないといけなくなります。
御理解と御協力のほどお願い致します。

### 事前準備（blender）
変換するには、blenderのアドオンを利用します
~~例の如く本来の利用用途ではないです。unityはアバターをアップロードするソフトではないのと同じ~~

まず、blenderと今回使うアドオンのverを揃える必要があります。
こちらのサイトを参考にverを揃えて下さい

https://mmd-blender.fandom.com/ja/wiki/MMD_Tools

執筆時点(2025/02/16)では下記の状態で揃える事のみサポートされている状態です

**blender   v4.2LTS**

https://www.blender.org/download/lts/4-2/

**MMD Tools v4.2.2**

https://extensions.blender.org/add-ons/mmd-tools/

blenderは、 GNU 一般公衆利用許諾契約書
MMD toolは、GLPv3ですのでツールとして利用する分には何も問題ないです



### 事前準備（MMDダンスのモーションDL）
変換に使用するMMDダンスのモーションは、「好き！雪！本気マジック 」を使用させていただきます。
まずはダンスのモーションについて以下の動画の概要欄の先のbowlrollにてDL出来ます。

https://www.nicovideo.jp/watch/sm23692832

https://bowlroll.net/file/30993

```
MikuMikuDance用モーションデータ
好き！雪！本気マジック 

○配布元動画
【MikuMikuDance】 好き！雪！本気マジック 【MMDモーショントレース】
http://www.nicovideo.jp/watch/sm23692832

○トレース元動画：足太ぺんたさん
【足太ぺんた】好き！雪！本気マジック　踊ってみた【オリジナル振付】
http://www.nicovideo.jp/watch/sm22802991

○オリジナル曲：Mitchie M さん
ミクが英語ラップも披露！雪ミク2014テーマ曲『好き！雪！本気マジック』
http://www.nicovideo.jp/watch/sm22791352

■使用条件

データを自分の責任で改造して使ってもかまいません。
自分で責任をとれる限り、改造したデータは配布してかまいません。元データの再配布はご遠慮ください。 
ただし配布する場合、必ず同じ条件（非営利・改造可・改造データ再配布可）で、改造の履歴を記述して配布してください。
ご利用は自己責任で権利者の方々の迷惑にならないよう常識の範囲内でお願いします。
営利目的の利用はご一報ください。無断での商用利用は禁止します。

■免責事項

このモーションデータを使用したことによって生じたすべての障害・損害・不具合等に関しては、
私と私の関係者および私の所属するいかなる団体・組織とも、一切の責任を負いません。
各自の責任においてご使用ください。

■説明・注意点

Lat式ミクVer2.3 Whiteを利用して作成しております。
上半身2ボーンが必須です。

あぴミクなどLat式より足が短いモデルの場合は
足IKのキーを全フレームで選択して
「フレーム編集」→「フレーム位置角度補正」で
X軸とZ軸のみ0.9倍（Y軸はそのまま）にすると良い感じになります。


ミクより体の大きなモデルに読み込む場合
モデルにモーションを読み込んだ後
モデルの大きさに応じて移動距離を調整してください。
「フレーム編集」→「フレーム位置角度補正」

目安
パステルくんさん　位置XYZ x0.1
ラビット・ユキネ　位置XYZ x0.14
丸くなるミク　　　位置XYZ x0.2
妖精さん　　　　　位置XYZ x0.3
BASARA系　　　　　位置XYZ x1.1～1.2
スコープドッグ　　位置XYZ x2.5～3.0


mail:hino.mmd39@gmail.com

2014/06/03　配布
2015/04/12　Tda式モーション追加、モーション微調整

hino
```
営利目的でない場合は、改造・再配布可である事が記載されています。

今回のように記事として紹介したい場合にとても助かりますね。
「hino」様、並びにトレース元である「足太ぺんた」様ありがとうございます。

### 事前準備（MMDモデルDL）
MMDモデルも必要です。
ダンスモーションをUnity用に変換する際に基準となるMMDモデルもないといけません。
こちらは「ニコニコ立体ちゃん」（アリシア・ソリッド）を利用させていただきます
企業が無料配布を行っており規約もキッチリ明記してある為、安心安全です

https://3d.nicovideo.jp/alicia/

```
————————————————————————
ニコニ立体公式キャラクター「ニコニ立体ちゃん」
http://3d.nicovideo.jp/alicia/
version 4
©dwango, inc. All rights reserved.
————————————————————————


この度は、ニコニ立体公式キャラクター「ニコニ立体ちゃん」をダウンロードいただきましてありがとうございます。

◯ 内容物
1. MikuMikuDance(MMD)用ファイル2種 (ニコニ立体ちゃん本体・ビーム彫刻刀)
2. MMD用モーションファイル16種 (ニコファーレのモーションキャプチャーデバイスを用いて収録)
2. FBXファイル2種 (MMD用データ、Unity用データ) + MAXファイル(オリジナルデータ)
3. Unity Package1種
4. ニコニ立体ちゃん壁紙1種


◯よくある質問
* 「ニコニ立体ちゃん」と「アリシア・ソリッド」、正式名称はどちら？
キャラクターの本名はアリシア・ソリッドですが、クレジット等での表記はニコニ立体ちゃんが正式名称となります。
作品発表の際には「ニコニ立体ちゃん」タグをご活用ください。

* ニコニ立体ちゃんを用いた、年齢制限のある二次創作物の公開は可能なのか？
利用規約にある禁止事項に抵触しない限りにおいて可能です。


◯ 利用規約抜粋
必ず利用規約( http://3d.nicovideo.jp/alicia/rule.html )をご確認ください。
利用規約の改訂などによって下記抜粋と利用規約の内容が異なる場合は利用規約が優先されます。

* 非営利、営利に関わらず個人(同人サークルなど、法人を除く団体を含む)の利用が可能です。
* 二次創作物について株式会社ドワンゴ(以下、当社)のクレジットを表記する必要はありません。
* 改変物を配布することができます。
* niconico内でキャラクターやモーションを利用した作品を投稿する場合は、コンテンツツリーの親作品にキャラクター( http://3d.nicovideo.jp/works/td14712 )を登録するよう努めるものとします。


◯禁止事項
* 第三者の知的財産権その他一切の権利及び名誉を侵害しないこと。
* 当社（当社が提供するサービス等を含む）及び当社キャラクターの名誉・品位傷つける行為をしないこと。
* 公序良俗に反する行為や目的、暴力的な表現、反社会的な行為や目的、特定の信条や宗教、政治的発言のため利用しないこと。
* 当社の公式商品であるかのような誤解を招く利用をしないこと。
* その他、当社が不適切と判断する行為に利用しないこと。


◯ クレジット
企画: 株式会社ドワンゴ
キャラクターデザイン: 黒星紅白
モデリング: 雨刻
```
今回利用するのは変換の基準の為に使うだけですので禁止事項にも引っかからないです。
「ドワンゴ」様、「黒星紅白」様、「雨刻」様、ありがとうございます。

### 事前準備（音源）
変換途中で使うツール、MMDダンスモーションだけではありません。
音源（曲）にも当然、配慮すべき著作権があります。
今回、使用させていただく曲は、下記の動画「Mitchie M」様の元祖動画の概要欄にある

http://www.nicovideo.jp/watch/sm22791352

ニコニ・コモンズへの登録がされていて、権利関係が明記されていて尚且つ、DLが出来るこちらを利用させていただきます

https://commons.nicovideo.jp/works/nc84362

```
利用許可範囲  インターネット全般
ニコニコ投稿時の親子登録  任意
権利表記  任意
動画配信サイトでの収益化  個人：OK、法人：要連絡
営利利用  個人：要連絡、法人：要連絡
```
営利利用でなければインターネット全般において利用が許可されています
「Mitchie M」様、ありがとうございます。


## MMDダンスのモーションをUnity向けに変換



### blenderでの操作
blenderの左上の「編集」→「プリファレンス」→「システム」→「オンラインアクセスを許可」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/1dbc5cfc-da5d-9ef3-ce6c-f4130f72c824.png)

これで簡単にアドオンを取り込めるようになりました。
アドオンを入れる為に下記リンクを開きます

https://extensions.blender.org/add-ons/mmd-tools/

サイト上で「Get Add-on」を押して、十字矢印になったらblender上に、ドラッグ＆ドロップするとアドオンが組み込まれます

MMDをインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/36a36457-5c42-1705-68a1-bfb18ffd6485.png)
インポートしたアリシアソリッドを右のシーンで選択した状態にして、次はvmdファイル（MMDダンスモーション）を読み込む

エクスポートは画像の通りFBXで行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/063b4dc1-8e9e-084f-2bc1-2b51be86ea47.png)

エクスポート設定は下の画像通りにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/91072ca2-6de3-a4dd-99b3-89707ff05c97.png)

エクスポートしたFBXをUnityにインポートし、FBXをGenericからHumanoidに変更する
ヒューマノイドに変更する事で、中身のアニメーションもヒューマノイドアニメーションに変換されるので忘れずに！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/0e3de762-3666-9879-c3c1-c4a7ae6ee7e3.png)

FBXに入っているanimファイルの取り出し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/57fb9c1f-6f8c-20bc-4154-7737a6177d7a.png)
中身を展開した状態で、取り出したいanimファイルを選択し、「ctrl」+「D」

## 他人をダンスさせる椅子の実装
椅子（以下、SDKのコンポーメント名にならってVRC_Stationと記す）を使って他人をダンスさせます。
VRC_Stationには椅子に座った時のポーズを指定するために、座ったプレイヤーのアニメーターにこちらが設定したアニメーターコントローラーをマージする仕様があるのでそれを利用します。

### VRC_Stationの設定
ここから先の操作はアバターアップロードするプロジェクトでの操作になります
Armatureの外、アバターのプレファブの上で「create empty」して「add component」で「VRC_Station」を付ける
**VRC_Stationを非アクティブにしない**
Stationの子に以下の３つの名前のゲームオブジェクトを作る
* Enter
* Exit
* Music

空のアニメーターコントローラーを作る（名前は分かりやすくStationとしておく）
それらを画像の通りに当てはめる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/6a3424dd-7174-d323-34eb-f86ed2ec509e.png)

#### Stationに設定するAnimator内部
１つ上の項目で作った「Station」という名前のアニメーターコントローラーの中身の設定をしていく
Stateを「Entry」→「Tracking_OFF」→「animation」→「Tracking_ON」（Exitには繋げない）の構成にします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/728bc45a-d10f-82b2-8530-51e540b58480.png)

「Tracking_OFF」と「Tracking_ON」に
VRC Animator Tracking Control[^1]を付けます。

「animation」に変換したMMDダンスモーションを入れます


![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/82b315f2-bbf8-5fe7-8be2-e85f104c2c9f.png)

それぞれの設定は画像の通りにします。

write defaultはレイヤー内で「有りなら全部有り」「なしなら全部なし」で統一してください。
write defaultなしで統一する場合は「Tracking_ON」のstateにダミーアニメーション（空のアニメーション）を入れるのを忘れずに

また、「Tracking_OFF」にはAポーズのアニメーションを入れておきます（理由は後述）

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/02ac2c92-0237-4721-9b11-a6d68ac9d4b0.png)

State以降の矢印は、
Tracking_OFF → animationのExit timeを調整して音源との再生位置調整に使う。

animation → Tracking_ONのExit Timeを１にする事で、アニメーションが終わったらトラッキングONにする設定となっている

## ダンス開始と同時に音楽が鳴り始めるギミック
まずワールドではなくアバターで今回実装する都合上、「椅子に座った」という判定は取れません。
なのでゴリ押しで解決します。
Contactを使います。
椅子の上で立ってダンスし始める＝足が椅子に当たる
＝椅子の位置に足が当たったら音楽を鳴らし始める設定にしておけばOK！

ただし、ダンスの初動で足が椅子に触れない（逆さの状態で始まる等）場合に音が流れないので、「Tracking_OFF」にはAポーズのアニメーションを入れる必要があったわけです。
Aポーズがダサいと思うなら足が触れていればいいので好きに改変してください


### Audio source等の設定
まず、画像の通りに設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/a3a2ac8c-2837-bf36-d242-5b0435a5b975.png)

Audio Source
* Doppler Levelを  0（ドップラー効果の削除）
* Spreadを  180
* Spatial Blend[^2]:を、3D

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/d2e60118-7742-2afc-785d-8fe445108716.png)

VRC Spatial Audio Source
* Gainを 0

必須の項目（音の聞こえ方が変にならない設定）は文字に起こしていますが、基本は全部画像の通りにしてください
その後、mp3ファイルを「Audio Clip」にドラッグ＆ドロップ

### Contactの設定
VRC_Stationの子にContact用のゲームオブジェクトを作り、そこに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/b853e4fa-c380-43ec-9610-9461238a78ed.png)

VRC Contact Receiverを付け画像の通り設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/d3f9e80b-4d6e-eb67-44a5-fa70bf49b422.png)

画像の通りに設定する事で、椅子付近1.5ｍ圏内に足が触れる事で、「Dance_Music_Contact」というパラメーターをアニメーターに渡せるようになりました。後はそれを受け取ったアニメーター側の設定をしていきます

### Animatorの設定
「Dance_Music_Contact」というパラメーターを「Bool」で作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/a46e0e83-7081-30ef-38da-454bef542efb.png)

Layersの方でも新しくレイヤーを作り名前を分かりやすくし、Weightを１にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/404743bd-c1bc-689f-072f-f5787cdf195a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/96dfdfb5-fc8e-3240-84e2-fcdb1876efc3.png)

後は、普通に分岐を組むだけです
「Dance_Music_Contact」がtrueなら「Music_ON」に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/d72bebe3-269b-8986-7eb1-13bee41b59b5.png)
「Dance_Music_Contact」がfalseなら「Music_OFF」に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/c9567ed7-2416-d5db-3458-ab1a71be4a72.png)

write defaultはレイヤー内で「有りなら全部有り」「なしなら全部なし」で統一してください。
write defaultなしで統一する場合は「Empty」のstateにダミーアニメーション（空のアニメーション）を入れるのを忘れずに

### タイミング調整

ダンス始めるのを遅らせる場合は
* Stationに設定しているAnimator内部のStateの「Tracking_OFF」→「animation」部分のExit timeを伸ばす

音が流れ始めるのを遅らせる場合は
* 前項目で設定した「Sound_OFF」→「Sound_ON」部分のExit timeを伸ばす

Exit timeを0にするのは、あまり推奨しません。
ダンスのモーションで足が地面に触れないモーションの場合、contactを安全に起動する為に少し待機時間を置くのが大事です。

### Expression menuの設定
自動で音を鳴るように設定しましたが、これだけではアバターが巨大過ぎて足がContactに当たらない等の場合に困ってしまいます。
手動でも鳴らせるようにExpression menuに入れましょう。
（同期安定の為にどの道、Paramaterには入れないといけないので横着せずこの項目もしっかりやりましょう）

アバターに入ってる「VRCExpressionParameters」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/5bdae4d5-61a5-4967-a96e-a1f361075ca5.png)

animatorに追加したparametersを「VRCExpressionParameters」に追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/c465b2be-2365-4315-906b-46c9b086727c.png)

「Dance_Music_Contact」というパラメーターを「Bool」で作成したのでそれを切り替えできるToggleを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460716/2ef4144a-d35c-4677-ad41-775813a16d86.png)



### VRC Animator Play Audio
これは椅子ではなく自分自身に使う。今回は解説しません。
オーディオソース（音源）の参照先ファイルの変更
ダンスを複数入れるなら音源も複数必要になりますが、軽量化の為にこれ使いましょうね
ありがたーい解説動画も置いておきます。
英語ではありますが、youtubeの自動翻訳字幕で何とかなります。
要望が多ければこちらの解説（というよりただの翻訳？）記事も書きます

https://www.youtube.com/watch?v=BmXCXP6UsQ8


## おつかれさまでした
これで完成です。
ここまでやってみてどうでしたか？やればできる内容でありますので難しくはないと思います

**『センスを求められたり、完成の姿が明確でない　曲、ダンス、モデルの創造』** と違い完成形が先にあってそれに向けて組み立て変換するだけだからです。
偉大なる先駆者に敬意を表し感謝を述べながら利用させていただきましょう。

## 記事の通りにやっても上手くいかない場合
VRC_Stationには幾つか隠し仕様があります。以下の項目をチェックしてください

* VRC_Stationは、アバターアップロード時点でactiveである必要がある。（後からAnimationで非activeにするのは問題ない）
* VRC_Stationは、１つのアバターに６個まで。それ以上の場合先に読み込んだ順に優先され、溢れた分は無効化される
* VRC_Stationは、座る判定のサイズ計測の為に強制的にBox coliderが付く。coliderなので干渉する可能性有。

* あまりに長いアニメーションファイルだとBlenderの変換も限界がある（動きがおかしくなる

### どうしても上手くいかない場合
まずは自力でやってほしいです。自分でやらないと応用が効かないので。
でもどうしても上手くいかない場合、自分の説明の仕方が悪いかもしれないので一応サンプルを置いておきます

https://superamatou.booth.pm/items/6604273


[^1]:VRC Animator Tracking Control
アニメーションを優先するかトラッキングを優先するかの設定が出来るscript
これを「Animation」に設定する事で、トラッキングを無効化し椅子に座ったプレイヤーをダンスさせる事が出来る
たまに降りた後も元のトラッキングやリップシンクが返ってこない事がある。再度トラッキング優先の椅子に座ると直るので、別途用意しましょう


[^2]:Spatial Blend
ステレオ効果優先するか、音の聞こえる3次元上での効果を優先するかの設定
2D（一番左）のままだと3D上での距離を無視してワールド全員に聞こえる設定となってしまうので3Dにしよう
3Dに寄せるとその分ステレオ効果が薄くなり、一番右まで行くとモノラルになる。
拘りたい場合は、元の音源を右耳左耳用のモノラル音源に分けるとかの工夫をしてる人もいたりする