VMagicMirrorのモデルを自動で切り替える
はじめに
私はTwitchでアバターを使って配信しております。Twitchでは「チャンネルポイント」という、視聴者がポイントを使って色々遊べる機能を実装できるのですが、私はアバターにネコミミを生やすというポイント交換を今まで「手作業でアバターのモデルを切り替える」ことで実現してました・・・。
これをなんとか自動化しようと試行錯誤した内容について書きます。
解説用のスクショとかも無しで書き殴ってますが、そのうち追加しようと思います・・・。
なお、本記事の内容を実行する際は自己責任でお願いします。
読むと出来るようになること
2種類のアバターのモデルを順次切り替えるコマンドを作成できます
何をやってるかについても解説しているので、他のことにも応用可能かと思います
用意するもの
PCに保存したアバターのVRMモデル 2つ(切り替え元・切り替え先)
設定方法
VMagicMirror側の設定
やりたいことを実現するのに必要となる事前の設定を行います。
1個目のモデルの読み込みと設定のセーブ
VRMモデルを読み込み、ホーム画面の設定ファイルセーブボタンでスロット1にセーブします。2個目のモデルの読み込みと設定のセーブ
1.と同様にして2個目のモデルも読み込み、設定ファイルスロット2にセーブします。VMagicMirrorのオートメーションを有効化
詳細設定 - 設定ウィンドウを開くボタンをクリックし、ファイル - オートメーションを有効化ボタンをクリックします。また、この中で表示されている「ポート番号」は次の手順で使うのでメモしておきます。(私の場合は56131でした)
モデルの切り替えスクリプト作成
アバターのモデルを切り替えるスクリプト(バッチファイル)を作ります。
※PowerShellスクリプトをバッチファイルに埋め込む方法はこちらの記事を参考にしました
スクリプトの作成
以下の内容をメモ帳で作成し、changeAvatar.batという名前で保存します(拡張子がbatであれば違う名前でも良いです)。
真ん中あたりの「$port = 56131」という部分は、前の手順でメモしておいたポート番号に合わせて修正してください。
<# :
@echo off & setlocal EnableDelayedExpansion
set BATCH_ARGS=%*
for %%A in (!BATCH_ARGS!) do set "ARG=%%~A" & set "ARG=!ARG:'=''!" & set "PWSH_ARGS=!PWSH_ARGS! "'!ARG!'""
endlocal & Powershell -NoProfile -Command "$input|&([ScriptBlock]::Create((gc '%~f0'|Out-String)))" %PWSH_ARGS%
pause & exit/b
: #>
$file1 = "1.txt"
$file2 = "2.txt"
if(Test-Path $file1) {
$x = 1
Rename-Item $file1 $file2
} else {
$x = 2
Rename-Item $file2 $file1
}
$port = 56131
$tc = New-Object System.Net.Sockets.UdpClient
$tc.Connect("127.0.0.1",$port)
$a = New-Object System.Text.ASCIIEncoding
$byte = $a.GetBytes(@"
{
"command": "load_setting_file",
"args":
{
"index":
"@ + $x + @"
,
"load_character": true,
"load_non_character": false
}
}
"@)
$tc.Send($byte,$byte.Length)
$tc.Close()
動作テスト
保存したbatファイルをダブルクリックして、モデルが切り替わることを確認します。
チャンネルポイントへの組み込み
私の場合は、たぬえさ3というソフトを使って実現しています。たぬえさ3自体の使い方は解説記事もあるので、ここではモデルの切り替えに関係する部分だけ書きます。
Twitchのチャンネルポイントカスタム報酬を作成
Twitchのクリエイターダッシュボード - 視聴者向け報酬 - チャンネルポイントをクリックし、「報酬とチャレンジの管理」からアバター切り替え用の「カスタム報酬」を追加します。報酬の名前や実行時に消費するポイントはお好みで設定してください。たぬえさ3でチャンネルポイント報酬のリストを取得
たぬえさ3のメニューから、サービス - Twitchメインアカウント - チャネポ一覧取得 を実行します。チャンネルポイント報酬交換時のイベントを作成
たぬえさ3のメニューから、設定 - イベント設定 - チャネポ報酬 を選びます。
Reward Twitchイベント設定という画面のトリガー一覧に、先ほどTwitch側で設定した報酬があるので選択、抽選箱一覧は「常時実行」、抽選タグ一覧は「一意なタグ」を選択して、オペレーション一覧で追加ボタンを押します。適当に名前を付けてセットボタンを押します。イベントの内容を設定
画面下のファイル実行タブで、実行ファイルのファイル選択ボタンから先ほど作成したbatファイルを選びます。テスト実行
トリガー一覧のプレビューボタンを押します。何度か実行して、自動的にアバターが切り替わるのを確認しましょう。
やってることの解説
具体的に何をしているか解説します。特に興味ない方は飛ばしてください。
VMagicMirrorのオートメーション機能では、UDPでJSONのメッセージを受け付けると設定ファイルをロードしてくれます(公式ページの解説)。
UDPでパケットを投げるのに、特に何もインストールせず実現できるお手軽な方法ないかなあと考えた結果、PowerShellをバッチファイル内に記述する方法になりました(PowerShellスクリプトのps1ファイルはたぬえさ3では実行できないので、batファイルに埋め込み)。
PowerShellスクリプトでやってることですが、現在どちらのアバターになってるかを$file1, $file2のどちらのファイルが存在するかで判断し、$xに切り替え先のVMagicMirrorの設定のスロット番号を代入します。
合わせてファイル名をリネームしてあげることで、次に実行したときには逆のアバターに切り替わるようにしてます。雑な方法ですが、そんなに連続で実行されるわけでもないので、問題ないかなあと。
そもそもアバターが連続でコロコロ切り替わってしまうのも落ち着かないので、連続で実行できないようにTwitchの報酬の設定でクールダウンを設定しておけば大丈夫だと思います。
$file1 = "1.txt" から $port = 56131の前の行までは、このファイルの有無を判定して2種類のアバターを毎回切り替えるためのものなので、固定のアバターで良いならこれらの行を省略して$xの値(スロット番号)を決め打ちしちゃってOKです。
たぬえさ3はまだほとんど使いこなせていないのですが、ランダム抽選で実行する内容を変えたりできるようなので、アバターガチャみたいなものも作れるかもしれませんね。
おわりに
本来、モデル丸ごと切り替えるのは非効率であるというのは理解しており、モデルのネコミミON/OFFだけを表情切り替えとして実装するのがベターなんでしょうが、私の3Dモデルに関する知識・技術が全然ないのでこれで妥協です。
ただ、アバターの服装を変えたいとか、まったく別のモデルにしたい(ネコミミ超えて本当に猫にするとか)場合にも使えるかもしれませんので、他のストリーマーさんのお役に立てば幸いです。