🤖

[VRChat] ワールドの更新を Power Automate for Desktop で自動化する

2024/03/25に公開

追記

OneDrive のデータを Google ドライブに移動させた際、
%HOMEPATH%\OneDrive\アプリ\Power Automate Desktop For Windows
も移動させた後、Power Automate for Desktop を起動したらリセットになったのか、このフォルダを戻してもフローが戻りませんでした。終わりです。

コレを試しても何か間違えているのか、治らなかったのでおしまいです。
https://www.ka-net.org/blog/?p=15229

苦しいところは、iwaSync が Youtube プレイリストを読むのが遅いことなので、Youtubeのプレイリストを iwaSync で読める .json に変換してくれる Python スクリプトを Gemini に作成してもらったので、コレを使って手動で更新していきます…

プレイリストの更新ぐらい自動化したいなあ……… VRCSDK を CI で回している人がいたら教えてください………

はじめに

さて、皆さんぶいちゃでワールド作ってますか?

自分でワールドを作ると、ワールドの動画プレイヤーで使う YouTube のプレイリストを自分の好きなようにできて、流したい動画をずっと流せるのがすごく良いですよね。
寝る時に好きなプレイリストでMVを流し続けるのが好きです。

ただ、ワールド内動画プレイヤーである、iwaSync3 のプレイリスト管理は大変ですよね。

YouTube 側でプレイリストを更新するだけではだめで、Unity Editor を起動して対象プレイリストの Inspector にある iwaSync3 のメニューから 「プレイリスト(Youtube)から自動取得」 の Run ボタンを押して更新しないといけません。

さらにワールドアップロードには VRChat SDK のタブにある 「Build and Upload」 のボタンを押す必要があります。

というのもですね、今回、宇多田ヒカルがベストアルバムのリリースに伴って、キャンペーンで過去のミュージックビデオの4Kアップコンバート版を、なんと22作品。毎日一つずつ公開するという形式をとっています。

公式から今回のプレイリストが公開されているのですが、プレミア公開のものが含まれています。
iwaSync3 では、プレイリストに公開前の動画が入っているとエラーで止まってしまうため、公開された動画だけが入ったプレイリストを作って、それを読み込ませるという手順を取ったのですが、毎日公開ですよ!!毎日公開!!!

一日の中で、毎日これをやる時間をとって、Unity Editor に向き合って、ビルドして ワールドアップロードをする時間を取るのがちゃくちゃ面倒くさくて。

そのため、MVが公開されたらプレイリストに追加して、実行すればあとは自動で処理をしてほしいという動機で行いました。

あと私はプログラミングができないので、Unity側をなんとかするという手法は取りませんでした。

本来であれば、すべてコマンドで完了するようにしてしまって、Jenkins であったり、GitHub Actions で CI を回していきたいですが、 GUI操作があるためそうはいきません。

この部分をなんとかするために、今回は Microsoft の RPAツール である、 Power Automate for Desktop を使用して、なんとか Unity Editor の操作を自動化したいと考えています。
(Power Automate for Desktop の準備などは別の記事で検索してください。)

はい、それではやっていこうと思います。

動作例

先に、作成したフローを実行している様子を動画にしたのでご確認ください。
こんな感じで動いていきます。勝手にPCが動くのは面白いですね。
(画質は4K、速度は2倍にするといいかもです。)

https://youtu.be/fAq0aamfwIw

各フローについて

Main

私のワールドは Windows版 と Mobile版 (Quest & Android) に対応しているので…

  • プレイリストを更新し、Windows 版のビルド
  • Build Target を Android に切り替えてビルド
  • Build Target を Win64 に戻す
  • Git にコミット&プッシュする

という流れを取ってます。

各工程はサブフローにして、そちらを Power Automate for Desktop にて実装するという形です。
(こうすると、Android 版のない別ワールドで使うときは Android 部分のサブフローのみ無効化する。などで対応できます。)

また、ワールドの Unity シーンファイルや Gitで操作したいディレクトリ、編集したいプレイリストの名前を変数に割り当てています。

Unity_Platform_windows_x64



1:アプリケーションの実行

1:アプリケーションの実行

Unity は Editor 実行時にコマンドライン引数を渡すことで、起動時の状態を指定出来ます。
今回は開く Unity のシーンファイルとビルドターゲットを指定します。
%変数名% で変数を使用できます。

アプリケーションパスは Unity Editor の EXE を。(ここも変数にすれば良かったかも。)
コマンドライン引数は -openfile "%Unity_Scene_Path%" -buildTarget "Win64" で指定。

2: プロセスを待機する

Unity が起動した事を検知できるかな…と思って入れたのですが、プロセス自体はすぐ立ち上がるが Editor の画面になっているか、までは判別できる物ではありませんでした。
とはいえ、起動しなかったときにタイムアウトエラーにするという部分を入れているのでまあこれはこれでいいかな…

3:ウィンドウにフォーカスする

ウィンドウにフォーカスする
エラー発生時

UI 要素を指定して、ウィンドウを前面にし、キー操作ができるようにするの部分ですが、この部分で Editor のウィンドウが出てくるまで待ちます。
そのため、再試行ポリシーを5回15秒感覚で設定しています。

4:ウィンドウの状態の設定

UI要素を認識してクリックしていけたらかっこいいな…って思ったんですが、上手くいかなかったので、できる限り Tab キーや Space キーなどで操作していくつもり…
だったんですが、 iwaSync3 のプレイリスト取得の RUN ボタンなどはマウスでないと押せなさそうだったので、マウスを移動させてクリックさせることにしました。

そのため、ウィンドウの位置を統一したいためこの段階でウィンドウを最大化させます。
(モニタ解像度が変わると後工程のマウスの移動とか狂いそうですね。)

5~32:キーの送信、Wait、マウスの移動、マウスクリックの送信 などなど…

あんまりマウス操作はしたくなかったので、できるだけキー操作で画面を遷移させます。
Inspector を選択し、 Hierarchy に移動し、 Hierarchy の検索に入り、プレイリストの名前にある”宇多田”を入力し対象のプレイリストのみ Hierarchy 上で表示させ、下キーで移動し、マウスを移動させ、プレイリスト取得の RUN ボタンを押下。
プレイリスト取得するまでは Wait で待ち、 VRChat SDK の画面に移動してワールドの Build & Publish を行う。

という感じです。

プレイリスト取得のWaitは、動画の件数が増えるたびに秒数を増やした方が良いかも知れません。
( あと、 Wait の所は画面状態を取得して、完了次第次へ進む。と、できたらかっこいいんですが思いつかなかった… 良い方法あったら教えてください。)

要注意ポイント:入力の遅延の遅延

キー入力が早すぎて入力されないままフローが進んでしまう事があり、フロー編集画面の下の所にある実行遅延を500ミリ秒にしていたのですが、これはフロー編集画面だけの数値でした。
そのため、フロー一覧の所でタスクを実行すると0秒で進んでしまうらしく、意図通り実行されないことがありました。

こちらに対しては、キー送信やマウスクリック時の遅延を500ミリ秒とすることで対応しました。


要注意ポイント:Unity Editor のレイアウトが変わる

画像は iwaSync3 のプレイリスト画面なのですが、このようにバージョン更新のお知らせなどでUIの配置間隔が変わり、意図した部分をクリックしてくれないという事が発生します。
この場合、都度修正します。

本来は特定のボタンを認識してクリック、とかできると良いんですが、、、このあたりは要改修かもしれません。

Unity_Platform_Android

Windows 版とほぼやっている事は変わらないのですが、起動時の -buildtarget "Android" 指定や、プレイリスト取得はWin版で済んでおり、行う必要が無いので、その部分を飛ばしています。

Unity_Platform_ChangeOnly_Win64

プレイリスト以外の部分で改修したい時、すぐ編集が出来る様にするため、Android 版ビルドが終わった後に Build Target を Win64 に戻すだけの項目です。

Git_Commit+Push

編集した Unity Project を git で管理しているため、編集が終わった Unity Project をコミットしてプッシュするという工程です。


もう単純に、作業フォルダで git commit -a -m "Playlist renew by Power Autemate. Change Playlist: %Unity_Choice_Job%" & git push を叩くという感じです。

実行後はこんな感じでコミットが残ります。かっこい~~~

さいごに

自動化を行ってみた感想なんですが、YouTube 側で プレイリストさえ作って編集してしまえば、あとは勝手にやってもらえるので、ものすごく楽になりました。
(詰めればもっと時間短縮できるかもですが…)フローの実行に10分くらいかかるのはしょうがないとして、その間に掃除とか料理を作るなど、ほかのことをすることができます。

プログラミングができない自分の中では一番良い落とし所だったかなと思います。
なかなかニッチだと思うので、皆さんがこれを使うということはあまりないのかもしれませんが、参考になりますように。

GitHubで編集を提案

Discussion