simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

VRChatアバターギミック:手で押すと音が出るオブジェクト(始め方編)

最近 Quest3 を購入しまして、試しに触るVRゲームとして
VRChat はじめたのですが、これがアバター改変とかはじめると楽しくて

今回は自分の勉強がてら、タイトルの通り
手で押すと音が出るオブジェクトを作ってみたいと思います

開発サイクル(初心者用)

VCC と略される CreatorCompanion のインストール
新規プロジェクト作成で Avatars テンプレートを選びます

パッケージ管理では
Gesture Manager と Modular Avatar をいれます

Open Project で Unity を開きましょう
Unity バージョンは固定 2019.4.31f1 で開きます

VRChat SDK の Authentication タブで認証しましょう。

Builder タブで VRChat アバターをテストビルドして試すサイクルを回します
まずは VRC AvatarDescriptor を持つアバターを作りましょう(無いとはじまらない)

booth とかで気に入ったアバターを買って置くのが良いのですが、今回はサンプルからアバター作ります

チェックマークにある通り、Name と Thumbnail の画像を登録したら
Build & Test を押して、VRChat にて Other アバターとして選択できるようになります。


Expression Menu 作成

Tutorial Robot Avatar の VRC Avata Descriptor の Expressions の Customize ボタンを押します。

VRChat Avatar の ExpressionParameters と ExpressionMenu を作ります

ExpressionMenu の Add Control で申し訳程度に何か項目を足しておきます

割り当てます

メニューの Tools > Gesture Manager Emulator を選択して、ヒエラルキーに GestureManager オブジェクトを作成
これの Editor ボタン Enter Play-Mode を押します

先ほどの Add Control したメニュー項目が Emulator によって確認できます

Modular Avatar 導入

Avatar 直下に空の GameObject を作成して MA Menu Installer を追加します

新たに ExpressionMenu を 2つ作り、Main > Sub 関係の設定をします
Main 側のメニュータイプを SubMenu として、Sub 側には Toggle を複数追加します
インストールされるメニューに、Main 側の ExpressionMenu を設定すれば

Gesture Manager の Enter Play-Mode にて

Expression Menu に追加されることが確認できます。

先ほどの MA Menu Installer のオブジェクトに MA Parameters を追加
自動で ExpressionsMenu の Toggle のパラメータが検出されて登録されます

アバターにアタッチされている Animator Controller には手を入れず
ビルド時にMenu と Animator を統合する Modular Avatar (MA)
改変機能の取り外しが容易になる仕組みです
活用していきましょう

オブジェクトの表示・非表示のギミック

MA Menu Installer, MA Parameters をアタッチしているオブジェクトに
MA Merge Animator と Animator Controller を追加し、自動検出された Parameters を
Toggle に見合った Bool 型で Animator Controller に追加します

空の Animation をオン・オフという名前となるように作り
オンオフするオブジェクトごとに Layer 分けしてレイヤーの影響値の Weight を 0 から 1 に設定するのを忘れずに行い
Bool 値の変化で遷移条件を作ります(瞬時に切り替わるように Has Exit Time のチェックを外し Transition Duration は 0 に)
ところで、このHas Exit Time のチェックを外し Transition Duration は 0 にする操作は頻出するので、自動一括設定ツール
Transition Helper を導入すると便利です。
(自分は少し改造して、選択した遷移のみ設定を変更できるようにしました
選択している遷移は次のコードで取得できました

AnimatorStateTransition[] selectedTransitions = Selection.objects.Select(x => x as AnimatorStateTransition).Where(y => y != null).ToArray();

Animation は単純に次のヒエラルキーのオブジェクトの Activate を切り替えるものとします

あとは MA Parameters の自動検出パラメータを、Animator のみのタイプから 同期する Bool に変更しておき
これで他プレイヤーとメニュー情報の Bool 値を同期します

ついでに MA Merge Animator の付属アニメーターを削除にチェックを入れておきます
(付属アニメーターは、Animation の録画用に便利なので付けてるだけ)

この状態で Gesture Manager の Emulator を起動して Expressions Menu を操作してみると
Emulator の Debug ボタンを押すと、現在の Parameter 一覧と値を確認できます
メニューの Toggle の On Of によって、各オブジェクトが
アクティブ・非アクティブとして切り替わることが確認できます

続きは次の記事へ