バーチャルキャストで装着アイテムのアニメーションをOn/Offする
バーチャルキャストのバージョンアップに伴い、アイテムを装備(装着)できるようになりました。
そこでアイテム同士が接触した場合に、装着アイテムのアニメーションをOn/OffするVCIサンプルを作ってみました。
例が腕輪型なのは、装着した状態で接触してアニメーションを制御できないかなと思ったからでした・・・
(結論としては、装着した状態ではできませんでした。公式でもまだ「装着した」という状態を検出できない模様。タッチ検出用のアイテムを手に持ってにぎった状態ならOK)
サンプルは「ちょうちょを人差し指に止まらせて(装着すると)腕輪と接触すると、ちょうちょが羽ばたく」というものです。
動画はこちら。
「バーチャルキャストでアニメーションつきのアイテムを装着して制御する」をメモしました。ちょうちょに腕輪が接触すると、アニメーションがOn/Offします。腕輪を装着した状態でのコントロールはできなかった https://t.co/GNmvSo08m9 #VCI #バーチャルキャスト #VirtualCast pic.twitter.com/Yh7rDCJz1U
— よーへん(生)🌒V学芸員&サイエンスコミュニケータ (@361Yohen) June 16, 2019
アニメーションを設定する
1.VCIとVRMの最新バージョンをダウンロード&Unityに読み込む
2.必要なオブジェクトをUnityに読み込む
3.空のオブジェクトを作り、「root」など名前を変える。rootオブジェクトに対して、「VCIObject」コンポーネントを適用する。このときrootの位置が必ず0,0,0であること
4.空のオブジェクトを作り、適当な名前をつける(ここでは「SubOBJ」)
5.アニメーションさせたいオブジェクトをHierarchyにドラッグ&ドロップする。このとき位置は0,0,0にしておく
6.さらに5.を4.の「SubOBJ」にドラッグ&ドロップして親子関係にし、「SubOBJ」を好きな位置に移動させる。あまり下の方だとつかみにくいため
7.「SubOBJ」をrootにドラッグ&ドロップし、親子関係にする
8.アニメーションのトリガーとなるアイテム(オブジェクト、ここでは「Udewa」)をHierarchyにドラッグ&ドロップする
9.8.「Udewa」の位置を調整する
10.「Udewa」をrootにドラッグ&ドロップし、親子関係にする。ここまでの階層は下記のようになる
11.rootをクリックし、下記の「アイテムをつかんだり衝突判定ができるようにする→rootオブジェクトに対する設定」の1.~18.を参考にアニメーションを作成する。
prince9.hatenablog.com
今回は「Ageha_Blue」オブジェクトのアニメーションを設定する。
このとき下記の点の注意が必要。
・「VCI SubItem」「Box Collider」「VCI Attachable」といったアイテムの挙動の設定は「SubOBJ(空のオブジェクト)」に対して行う
・アニメーションは「root」に対してつける
12.rootに「Animation」コンポーネントを適用する。さらにインスペクタの「Animations」の「Size」を1にした上で、「Element 0」に11.でできた「.anim」形式のアニメーションをドラッグ&ドロップする
13.rootに対する設定は下記のようになる
アイテムの挙動を設定する
つかめるようにする・装着できるようにするなどのアイテムの挙動をコンポーネントで設定していきます。
1.「SubOBJ」をクリックし、「VCI SubItem」「Box Collider」コンポーネントを追加する。つかめる・重力無視で落下しない設定はこんな感じ
2.さらに「VCI Attachable」コンポーネントを追加し、「Attachable Human Body Bones」の「Size」に装着させたい人型アバターの部位(ボーン)の数を入力する。今回は左右の人差し指にちょうちょが止まって欲しかったので、こんな感じの設定にしました
3.装着させたい部位のボーンを設定する
4.「Attachable Distance」で装着の判定を行う範囲を決める。長さは半径m。画面上に緑色の立体で表示されるので、それを参考にする
5.一度「The Seed Online」にアップロードし、バーチャルキャストで一度呼び出してみる。この時点ではそれぞれのアイテムはつかめるが、アニメーションは再生されない
タッチしたらアニメーションが再生されるスクリプト
一度でもバーチャルキャストで呼び出したアイテムは隠しファイルの「AppData→LocalLow→infiniteloop Co,Ltd→VirtualCast→EmbeddedScriptWorkspace」にアイテム名のフォルダができているので、そこにスクリプトを保存します。
1.「AppData→LocalLow→infiniteloop Co,Ltd→VirtualCast→EmbeddedScriptWorkspace」にある「template.lua」をコピーする
2.1.を該当するアイテム名のフォルダにペーストする
3.ペーストした「template.lua」を「main.lua」に名前を変更する
4.「main.lua」をVSCodeで開き、スクリプトを入力する
5.4.を保存して、スクリプト全体をコピーする。スクリプトはこんな感じ
---アニメーションの状態を示す変数 local state = 0 ---[SubItemの所有権]アイテムにCollider(not Trigger)が接触したときに呼ばれる。 ---@param item string @SubItem名 ---@param hit string @Collider名 ---SubOBJ(アニメーションさせるオブジェクトが入った空のオブジェクト)と検出用アイテムが接触して、かつアニメーションの状態が0のとき(trueはループ再生) function onCollisionEnter(item, hit) if (item == "SubOBJ" and hit == "Udewa") and state == 0 then vci.assets._ALL_PlayAnimationFromName("HaneAnim",true) print("アニメ開始") ---アニメーションの再生が始まったら、状態を1にしてアニメーションを停止する準備をする state = 1 ---SubOBJ(アニメーションさせるオブジェクトが入った空のオブジェクト)と検出用アイテムが接触して、かつアニメーションの状態が1のとき elseif (item == "SubOBJ" and hit == "Udewa") and state == 1 then vci.assets._ALL_StopAnimation() print("アニメ停止") ---アニメーションの再生が止まったら、状態を0にしてアニメーションを再生する準備をする state = 0 end end
VCIスクリプトをオブジェクトに適用してアップロード
1.rootオブジェクトをクリックし「Inspector」→「Scripts」に下記を入力する
・Size → 1にする
・Name →「main.lua」と入力
・Source →「 タッチしたらアニメーションが再生されるスクリプト」項目の5.でコピーしたものをペーストする。必要なコード全体をここにコピペする形です
2.「Hierarchy」の「root」をクリックし、「VCI」メニュー→「UniVCI-バージョン」→「Export VCI」を選択する
3.ウィンドウが開くので、「新しいフォルダー」をクリックし、英語で名前をつける
4.3.で作ったフォルダを選択し、英語でファイル名をつけて「保存」を押す
5.「アイテムの挙動を設定する」5.でアップロードしたアイテムを選択して、「別のファイルを再アップロードする」をクリックする
6.4.で書き出した「.vci」ファイルを選択してアップロードする
7.バーチャルキャストで読み込み、再度使ってみる