VirtualCastのVCIファイルを作って傘を持たせて雨を降らせてみた

こんにちは。
VRコミュニケーションツールに興味のある人です。
今回はVCIファイルを作成してみたので、その大まかな流れを共有します。

VCIとは

VCI(Virtual Cast Interactive)とはVirtualCast(公式)内で利用できる背景・道具データの拡張子

VirtualCastとはVRライブ・コミュニケーションサービスの一つで、自身の好きなアバターを使って動画配信を行うことや、ほかのユーザとVR空間上でコミュニケーションを行うことができます。
VirtualCast内では自身のアバター以外にも道具や背景を呼び出す機能があり、アバターだけではなく道具も自作をして、VirtualCast内に持ち込むことができます(図1)※。
※自作アバターや道具はTHE SEED ONLINEにファイルをアップしてアカウント連携する必要があります。

図1.デフォルトのピコピコハンマーを呼び出す様子

道具はアバターでつかんで振り回すだけではなく設定により様々な挙動をさせることができます。例えば....

  • アバターの頭等、決まった箇所にくっつける
  • コントローラの使うボタンで道具固有の挙動を開始させる
  • 衝突判定を検知して挙動を変える
  • 両手でつかんで道具のサイズを変える
  • etc...

VCIファイル作成にはUnityと必要なパッケージを利用します。
簡単な挙動であれば、コンソール上で用意されたスクリプトをオブジェクトに取り付けて必要な設定をつけるだけで作ることもでき、 ボタンを使った挙動等少し複雑な挙動をさせたい場合は、Luaで処理を書くことができます。

大まかな実作成の流れ

最初に何を作るか考えます。
今回は傘を作りたいと思います。

図2.傘を作るために作成したモデル

計画した挙動は

  • つかんだ状態で、1回使うことで傘を開く
  • もう一回使うことで、雨のエフェクトを再生
  • もう一回使うことで、傘を閉じる

大体のことは本家wikiに書いてあり、ほとんど困らなかったです。(wiki)
用意されたチュートリアルに沿って環境の整備とプロジェクトの作成を行いました。

環境準備

  1. THE SEED ONLINEのアカウントを用意しておく
  2. Unityを準備
  3. UnityにVCI作成用パッケージのDL
  4. Luaの書けるエディタを用意(本家wikiに習ってVisual Studio Codeを導入)
  5. Effekseer※のDL(インストール作業はない)

※VCIにはUnityのパーティクルシステムを入れることができなく、パーティクルシステムのようなエフェクトを表現したい場合は外部ツールEffekseerを利用してエフェクトを作る必要があります。

作成の流れ

  1. 傘のモデルを作る
    • モデリング
    • 傘の開閉のモーフを設定
    • UV展開を行い傘のテクスチャを描く
  2. Effekseerを使って雨のエフェクトファイルを用意する(図3)
    • 今回用意する雨エフェクトの設定概要
    • パーティクルに雨粒の画像を設定
    • パーティクルは一定以上の高さのランダム座標に生成し、落下移動させる
  3. Unity上で専用のプロジェクトを用意
    • VCI作成用パッケージを入れる
  4. 必要なオブジェクトに必要なスクリプトをつけて一旦VCIを出力する
    • 空Objectをrootにして、子要素に3Dモデルを配置
    • rootにはVCI Objectスクリプトを設定しておく(図4)
  5. 出力したVCIファイルをTHE SEED ONLINEにアップロード
  6. 開発PCでVirtualCastを開き作成したVCIを呼び出す
  7. ローカルフォルダにVCIスクリプトのテンプレートLuaファイルが用意されるのでスクリプト作成時に使用
    • 最初からテンプレートなしにLuaコードを作れるなら4~7の操作は必要ないのかもしれない
  8. 作成したエフェクトをroot以下に子要素として設置する
    • EffekseerのエフェクトファイルはオブジェクトにEffekseer Emitterスクリプトを張り付けてEffectAssetの項目に作成したエフェクトファイルを設定することで利用できる
  9. Unity上で接触判定をつけたいオブジェクトと、スクリプトから座標を変えたいオブジェクトにはVCI Sub Itemスクリプトをつける
    • 今回は傘を握れるように、雨エフェクトの座標をスクリプトから操作したかったのでどちらにもスクリプトをつける
  10. Luaスクリプトを作成する
    • 今回は以下の機能のためにスクリプトを利用
    • 使うトリガーを押した回数のカウント
    • カウントに応じて傘につけた開閉アニメーションの再生と雨のエフェクトの再生
    • 雨のエフェクトが傘の真上で発生するように傘の座標変化に合わせてエフェクトの座標の更新
  11. VCI ObjectスクリプトにLuaスクリプトをコピー&ペーストできる箇所があるため張り付ける
  12. VCI Objectスクリプトに必要な情報(物の名前、制作者、ライセンス等)を入力して、VCIを再出力することで完成(図5)

うまく動かないときは、Script Enable Debuggingのチェックを入れた状態でVCIファイルの出力することで、VirtualCast上で開けるデバッグコンソールからエラー等を確認することができるのでそれを利用してデバッグを行いました。

図3.Effekseerでできた雨エフェクト

図4.Unity上のオブジェクトの構成

作業に詰まった箇所と解決方法

問題1:
ローカル環境にluaのテンプレートファイル・ファイルを格納されているはずのフォルダが生成されていない。
解決方法:
ローカル環境に生成されるluaのテンプレートファイルおよび関連フォルダは、そのPCでVirtualCastにログインして、一度THE SEED ONLINEと連携を行いアイテムを読み込まないと生成されませんでした。 一度スクリプトを設定せずにVCIファイルの出力を行い、VirtualCast上でVCIの呼び出しを行えば解決できました。

問題2:
Effekseer上でループ再生を有効にしても必ずループの切れ目で初期状態から再生されてしまう。
解決方法:
Effekseer上で確認できなかったのですが、ノードの生存時間を調整して生成数限界に到達しないように調節しておけば、Unityに持っていき、ループ再生の設定を入れることで途切れずに再生できました。

問題3:
VCI Sub ItemにつけたAnimator animationを再生させようとして、エラーになってしまった。
解決方法:
チュートリアルのサンプルコード※をそのまま利用すると、Unity上でrootオブジェクト以外につけたanimatiorのアニメはスクリプトから参照ができないようでした。
rootオブジェクトにアニメーションの設定を行うことで参照することができました。

※サンプルコードをそのまま持ってきたようなコードの書き方

-- 引数1.アニメーション名 引数2.loopさせるか
vci.assets._ALL_PlayAnimationFromName("close", false)

その他

特に何もしないアニメーションへ初期遷移させる状態でVCI出力するとTHE SEED ONLINEのプレビュー上で「エラーが発生しました」と表示されてモデルが確認できずに不安になりますが、VirtualCast上でVCIの呼び出しは行うことができます。
プレビュー上でモデルの確認はしたかったので、初期遷移をアニメーションするものに変更することでエラー表示は回避できました。

図5.傘を使用する様子

感想

VCIの作成そのものは普段のゲーム制作と感覚が近かったが、自分が動かすアバターでその道具を扱ったり身に着けることができるという体験が、ゲーム制作とは異なる新しい体験と感じることができて、自分の好きなアバターに似合いそうな道具を想像できると楽しいです。

傘を使用してみて、現実との比較でいつもはあるものがないと手に取ってみた時に違和感を感じました。例えば、傘を開くときに音がならなかったり、傘を開いて顔の横に持ってきたときの圧迫感が無かったりすると違和感があります。
このあたりを意識して道具を作れれば、没入感を高くできそうだったので次回に生かそうと思います。

皆様よりよいVRライフを~

このブログについて

KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。

関連記事

このブログについて

KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。