まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

バーチャルキャストで装着アイテムのアニメーションをOn/Offする

バーチャルキャストのバージョンアップに伴い、アイテムを装備(装着)できるようになりました。
そこでアイテム同士が接触した場合に、装着アイテムのアニメーションをOn/OffするVCIサンプルを作ってみました。
例が腕輪型なのは、装着した状態で接触してアニメーションを制御できないかなと思ったからでした・・・
(結論としては、装着した状態ではできませんでした。公式でもまだ「装着した」という状態を検出できない模様。タッチ検出用のアイテムを手に持ってにぎった状態ならOK)

サンプルは「ちょうちょを人差し指に止まらせて(装着すると)腕輪と接触すると、ちょうちょが羽ばたく」というものです。
動画はこちら。

アニメーションを設定する

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にドラッグ&ドロップし、親子関係にする。ここまでの階層は下記のようになる
f:id:prince9:20190617055514p:plain
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に対する設定は下記のようになる
f:id:prince9:20190617060507p:plain

アイテムの挙動を設定する

つかめるようにする・装着できるようにするなどのアイテムの挙動をコンポーネントで設定していきます。
1.「SubOBJ」をクリックし、「VCI SubItem」「Box Collider」コンポーネントを追加する。つかめる・重力無視で落下しない設定はこんな感じ
f:id:prince9:20190617061214p:plain
2.さらに「VCI Attachable」コンポーネントを追加し、「Attachable Human Body Bones」の「Size」に装着させたい人型アバターの部位(ボーン)の数を入力する。今回は左右の人差し指にちょうちょが止まって欲しかったので、こんな感じの設定にしました
f:id:prince9:20190617061520p:plain
3.装着させたい部位のボーンを設定する
4.「Attachable Distance」で装着の判定を行う範囲を決める。長さは半径m。画面上に緑色の立体で表示されるので、それを参考にする
f:id:prince9:20190617061748p:plain
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.バーチャルキャストで読み込み、再度使ってみる