MacとUnityでVTuberっぽくVRMを動かす方法

この記事では、MacとiPhoneを使い、フェイスキャプチャしたデータをUnity内のVRMに反映させ、OBSで配信する流れを紹介します。[VMagicMirror](https://booth.pm/ja/items/1272298)や[Luppet](https://luppet.appspot.com/#blog)といった、VTuber配信用の素晴らしいツールは存在しますが、動かすにはWindowsの環境が必要です。本記事を通して、VTuber活動に興味があるMacユーザが、VTuber環境の準備方法の手段が学べられると幸いです。


こちらの記事は[Unity #2 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/unity) の9日目の記事です。

## 前置き

### 背景
自社のイベントでForksちゃんという自作アバターでVTuber的なことをやってみた際に、Macでの実装が思っていたより大変だなと思ったので、実装の流れについてこの記事で共有したいと思いました。私自身は公に活動してるVTuberではありません。社内で楽しく受肉してただけです。楽しいね。

### 必要な環境
- Unity
- FaceIDが搭載されてるiOSデバイス(iPhoneX, iPhone11, iPad Pro等)
- iPhone/Ipad用 iFacialMocap (有料)
- Mac用 iFacialMocap (無料)
- OBS

## VRモデルの準備

まずはじめに、VTuber用のモデルの準備をします。
VRoid Studio を使用すると、無料で良いクオリティのモデルを作成することが出来ます。Mac対応のソフトも提供しているので、[公式サイト](https://vroid.com/studio)からツールをダウンロードしてモデルを作成して見ましょう。

![vroidstudio.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/b6abb4fe-4558-542c-28bf-a781bd8bac97.jpeg)

モデルの作成が一通り終わったら「VRMエクスポート」のオプションでファイルを出力します。
エクスポートする際、モデルのポリゴン数、マテリアル数、ボーン数等をいくらか削減することが出来ます。減らした方が後々Unity内で動かす時に、モデルの動きの処理による遅延が少なくなります(多分)。

## iPhone用iFacialMocapの準備
iFacialMocapはiPhoneで顔の動きをキャプチャするアプリです。使用するにはiPhoneにFaceIDが搭載されてる必要があります。iPhoneアプリは下記のリンクから入手することが出来ます。
https://apps.apple.com/jp/app/ifacialmocap/id1489470545

上記のアプリは有料ですが、機能制限付きで無料版もお試しすることも出来ます。
アプリを起動すると、自分の顔の動きがキャプチャされ、iPhone上の顔のモデルに反映されます。

![iFacialMocap_examplemovement.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/477b50ba-4736-efe8-3651-7d3fabf96d3e.gif)

顔の動きのキャプチャが出来ていることが確認出来たら、次のステップに移りましょう。


## Unityの準備

### Unityの設定
Unity Hub を起動し、2019.4.28f1 (LTS) で新しいプロジェクトを作成します。Mac Build Support が出来るように設定しましょう。

### UniVRMをインストールする
UniVRMはUnityでVRMファイルが扱えるように出来るツールです。ツールのインストールからVRMモデルをインポートする一通りの流れは[こちらの記事](https://bluebirdofoz.hatenablog.com/entry/2020/04/23/222111)がとても参考になりました。

![univrm_imported.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/4b5f1620-d83f-8015-ed6a-056f98d5326b.jpeg)

無事にVRMをUnity内に配置が出来たら次のステップに進みましょう。

### Mac用iFacialMocapソフトをダウンロードする
Mac用のソフトは、iPhone版のiFacialMocapとUnityの中継機として扱われます。iPhone版のiFacialMocapのトラッキング情報が中継機を通し、Unity内のVRMの顔を動かします。

### iFacialMocapとUnity内のVRMのシンクの準備
Mac用のiFacialMocapを立ち上げます。【Open Advanced Setting】をクリックすると、多くの設定が出てきますが、基本的に設定する内容は下記の4つです:

#### 1. Unityに対応するようにする
【Software Name】の部分をUnityに選択します。


#### 2. VRMファイルをロードする
下の方にスクロールすると、【Load settings from file】というボタンが出てきます。こちらをクリックし、作成したVRMファイルをアップロードすると、良い感じに他の項目(表情の設定等)がマッピングされます。

#### 3. C#スクリプトをUnityに追加する
一番上の【Script】ボタンをクリックすると、C#スクリプトが入ったFinderウィンドウが開きます。Unity内に適当なオブジェクトを作成し、このスクリプトを付与します。

![attachscript.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/f8c3a693-cfd2-bc0a-3432-c3432c77d3aa.jpeg)

#### 4. IPアドレスを設定する
【iPhone IP address】の項目をiPhoneのiFacialMocapに表示されてるIPアドレスと合わせます。もしiFacialMocapの方にIPアドレスが表示されていない場合、一度アプリを再起動すると表示されるはずです。

### VRMをシンクさせる
この状態で一度iPhoneのiFacialMocapとUnityのモデルをシンクしてみましょう。
順序通りに進めます:
1. iPhoneのiFacialMocapを立ち上げる
2. Unityの再生ボタンをクリックし、ゲームを実行する
3. MacのiFacialMocapで【Connect to Unity】をクリックする

![ifacialmocap_in_unity3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/0f29f8e7-ee52-16d9-f656-080ed2722a08.gif)

うまくシンクが出来ましたでしょうか。【Connect to Unity】を押してもうまくつながらない場合、もしかしたらC#スクリプトを貼り忘れてるかもしれません。

### Mac用にビルドする
シンクが出来ることを確認出来たら、UnityからMac用にビルドをします。【File】→【Build Settings】を開き、【Player Settings】を開きます。【Resolution and Presentation】で【Fullscreen Mode】をWindowedに設定します。後ほどビルドしたファイルの設定内容が微妙でしたら、この【Player Settings】上のオプションを細かに調整してみましょう。

設定が終わったらビルドをします。ビルドしたファイルを実行したら、同じ用にiFacialMocapとシンク出来るかの確認をしましょう。

![BuiltUnityMovement5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/0d21688a-acfa-c24e-80f3-d5ccae925efb.gif)

ビルドしたモデルが反応しない場合、一度先程まで開発をしていたUnityの環境を閉じて、iFacialMocapを接続しなおしてみましょう。

## OBSの準備
OBSとはライブ配信を支援してくれるソフトです。[公式サイト](https://obsproject.com/)からMac版をダウンロードし、インストールをします。先程ビルドしたUnityのファイルを実行した後に、OBSでウィンドウキャプチャのオプションを選び、Unityの実行中のファイルを選びます。設定後、【Start Virtual Camera】をクリックすると、他のアプリやサービスからこのウィンドウを参照することが出来ます。

例えばZoomのオンラインビデオ会議で使うとします。Zoomを立ち上げ、カメラの設定で「OBS Virtual Camera」を選択すると、先ほどOBSで設定した内容が流れるようになります。

![OBSvirtualCamera.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/356f5182-228d-e2b7-b700-891ab33d18cb.jpeg)


## Unityで実装する利点
VTubingの環境をUnityで実装する利点としては、好きに内容をいじれるからです。無料のアセットで自分好みにVR世界をセットアップしたり、VRMがウィンクしたらオブジェクトを生成することもスクリプトで設定が出来ます。自由度が高いです。

個人的にはUnity内からkintoneというデータベースツールのREST APIを叩いてたりしてます。[こういうのとか](https://qiita.com/will-yama/items/489b1f411e59bc95af26)。



## 出来上がったもの
社内イベントで出来上がったものについてインタビューして頂きました。下記のGIFのように、Zoomを通してVRMを通してコミュニケーションすることが出来ました。

![unityvrm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100542/0ce38a60-93dd-76ef-878f-a2f8d4704a68.gif)


内容としては
- Unityの環境でVRMを動かし、Zoomでコミュニケーションしている
- 配信環境からkintoneのREST APIを叩き、データベース情報を引っ張ってきて表示している
- VRMでニッコリした表情をすることをトリガーにkintoneのREST APIを叩いて出張申請のリクエストを承認している

という感じです。

以上となります！

## 補足情報
**Q. VRMがずっとTポーズのままなのだが？**
A. VRMのオブジェクトの階層を掘っていくと、肩や腕のパーツが選択出来ます。これらを良い感じに回転させればTポーズから抜け出せます。

**Q. 動かせるのは顔だけ？**
A. 表情がシンクされ、頭も角度をいくらか変えられます。腕や手の動きはシンクされません。そこまで追求したい方はLeap Motionで実装すると良いかもしれません。

**Q. OBSで配信すると重い・・・！**
A. OBSは初期設定だと高画質で配信しようとします。まずこちらの設定を緩めることからはじめましょう。さらに軽くしたい場合はVRMの軽量化とUnity環境の軽量化にチャレンジする必要があります。というかそもそもMacは3Dの処理にそんなに向いてないので、本気でやるんだったらWindowsでやりましょう (えっ