バーチャルキャスト+VCIで、ループとそうでないアニメーションを同一オブジェクトで使用する
バーチャルキャストでループアニメーションとそうでないアニメーションを同じオブジェクトに適用する場合の方法です。
複数アニメーションを設定するにあたり、VCI上の仕様でいくつか注意点があります。
今回のサンプルです。
バーチャルキャスト+VCIで複数アニメーション(ループあり/なし混合)制御、苦労した・・・VCIの仕様上、
— よーへん(生)🌒V学芸員&サイエンスコミュニケータ (@361Yohen) 2019年5月7日
・すべてのアニメーションはrootをクリックして作成
・rootに「Animator」を設定して無効化しておく
・rootに「Animation」を設定する
にする必要があった #VCI #バーチャルキャスト pic.twitter.com/Hqs4jS7TnV
VCIで複数のアニメーションをさせるときの注意点
1.アニメーションの作成の方法
アニメーションを設定するときは、まず「root」オブジェクトをクリックして、「Window」メニュー→「Animation」→「Animation」を選択→「Create」ボタンを押してアニメーションを作成する
2.「Animator」の無効化
1.を実行すると「root」に「Animator」が勝手にできているので、チェックを外して無効化しておく(アニメーションがひとつなら2.はやらなくてOK)
3.「Animation」コンポーネントをつける
複数アニメーションがある場合は、「root」に「Animation」コンポーネントをつけておき、「Animations」→「Size」を1以上にして(アニメーションの数だけ)該当する.animファイルをドラッグ&ドロップする
4.「Quaternion」にする
回転のアニメーションを含む場合は、「Animation」ウィンドウでアニメーションさせたいオブジェクトを右クリック→「Interpolation」→「Quaternion」を選択する
5.アニメーションさせるアイテムは複数オブジェクトから構成されててもOK
3Dアプリでアイテムを作成してグループ化した後にFBX化、それを使用してもOKです。
アニメーションさせるアイテムと空のオブジェクトを親子関係にして、親につかむ設定や衝突判定を設定します。
具体的には下記のような構成になります。青色部分がアニメーションさせるアイテム、その上の「AnimOBJ」がその親です。
一度アイテムをアップロードする
1.アイテムを作成後、スクリプトをつける前に、下記の方法で一度「The Seed Online」にアップロードしておく。
prince9.hatenablog.com
2.下記の「アイテムを用意して、初期位置を調整する」の1.から8.の方法で、アニメーションさせたいアイテムの親子関係を設定する
prince9.hatenablog.com
3.下記の「空のオブジェクト(ここでは「UsaAtari」オブジェクト)に対する設定」の1.から8.までの方法で、アニメーションさせたいアイテムの親に衝突判定とつかむ設定を行う
prince9.hatenablog.com
ひとつ目のアニメーションを作成する
1.下記の「アイテムを用意して、初期位置を調整する」と「アイテムをつかんだり衝突判定ができるようにする」の1.から14.まで行い、まずひとつ目のアニメーションを作成する
prince9.hatenablog.com
ふたつ目以降のアニメーションを作成する
1.「Hierarchy」の「root」をクリックした状態で、「Animation」ウィンドウを開く
2.「Preview」の下のアニメーションファイルを選択するタブをクリックし、(ここでは「ToOmoteAnim2」のところ)「Create New Clip」を選択して新しいアニメーションファイルを作成する
3.「Hierarchy」にあるアニメーションさせたいアイテムをクリックし、「Animation」ウィンドウをクリックする
4.「Animation」ウィンドウの赤い●をクリックして録画状態にする
5.「Add Property」をクリックし、「アニメーションさせたいアイテム(オブジェクト)の▶︎」→「Transformの▶︎」→「Position(またはRotationやScale)横の+」をクリックする
6.アニメーションさせたい時間のところに白い棒をドラッグし、移動・回転・拡大縮小をしてアニメーションを設定する
7.再生ボタンを押してアニメーションを確認する
8.赤い●をクリックして録画状態を解除する
9.必要であれば同様の方法で3つ目以降のアニメーションを作成する
「Animation」コンポーネントを設定する
1.すべてのアニメーションが設定できたら、「root」→「Inspector」→「Add Component」をクリックし、「Animation」コンポーネントを設定する
2.「Animations」→「Size」に使用するアニメーションの合計ファイル数を入力する(3パターンのアニメーションなら3)
3.使用する.animファイルをドラッグ&ドロップする
4.「root」→「Inspector」をみると、「Animator」コンポーネントが勝手にできているので、チェックを外して無効化しておく(removeはしないほうがいいっぽい)
VCIスクリプトを書く
1.Cドライブ→ユーザー→ユーザー名→AppData→LocalLow→infiniteloop Co,Ltd→VirtualCast→「EmbeddedScriptWorkspace」フォルダの中に「template.lua」があるので、それをコピーする
2.1.の「EmbeddedScriptWorkspace」フォルダの中に先ほどアップロードしたアイテムのフォルダがあるので、そのフォルダに1.をペーストする
3.2.のファイル名を「template.lua」から「main.lua」に変更する
4.3.をVSCodeで開く
5.下記のスクリプトを書く
下記のスクリプトでは、特定のアイテムをグリップした回数で表/裏切り替え+テクスチャ変更(UVスクロール)を行っています。
テクスチャ変更がなく単に表裏ひっくり返したいだけなら、「グリップ回数の変数%2」で奇数偶数判定してアニメーションをその度切り替えればOKです。
またアニメーションの状態を記録する変数として「state」を使用しています。これがないとループありとなしのアニメーションを切り替えることができません。現在のVCIの仕様では複数アニメーションを同時に再生することができないので、次のアニメーションが再生される前に必ず再生中のアニメーションを停止させておく必要があります。
--グリップ回数カウント用変数 local TouchCount1 = 0 local TouchCount2 = 0 --奇数偶数判定用変数 --local Hantei1 = 0 local Hantei2 = 0 --アニメーションの状態を記録する変数 local state=0 function onUse(use) --うさぎロッドをつかんだ場合 if use=="UsaRod" then TouchCount1 = TouchCount1 + 1 --Hantei1 = TouchCount1 % 2 -- うさぎロッドをグリップした(奇数)1回目、かつ状態が0 if TouchCount1==1 and state == 0 then vci.assets._ALL_PlayAnimationFromIndex(0, false) vci.assets._ALL_SetMaterialTextureOffsetFromName("FlipFrontMat",Vector2.__new(0.5,0)) state=1 print("1おもて") --うさぎロッドをグリップした(偶数)2回目、かつ状態が1 elseif TouchCount1==2 and state==1 then vci.assets._ALL_PlayAnimationFromIndex(1, false) vci.assets._ALL_SetMaterialTextureOffsetFromName("FripBackMat",Vector2.__new(0.5,0)) state=0 print("1うら") -- うさぎロッドをグリップした(奇数)3回目、かつ状態が0 elseif TouchCount1==3 and state==0 then vci.assets._ALL_PlayAnimationFromIndex(0, false) vci.assets._ALL_SetMaterialTextureOffsetFromName("FlipFrontMat",Vector2.__new(0,0.7)) state=1 print("2おもて") --うさぎロッドをグリップした(偶数)4回目、かつ状態が1 elseif TouchCount1==4 and state==1 then vci.assets._ALL_PlayAnimationFromIndex(1, false) vci.assets._ALL_SetMaterialTextureOffsetFromName("FripBackMat",Vector2.__new(0,0.7)) state=0 print("2うら") end end --球体をつかんだ場合の処理------------------------- if use=="Tama" then print("玉だよ") TouchCount2 = TouchCount2 + 1 Hantei2 = TouchCount2 % 2 -- 球体をグリップした(奇数回)、trueはループ if Hantei2==1 then vci.assets._ALL_PlayAnimationFromIndex(2, true) --球体をグリップした(偶数回) elseif Hantei2==0 then vci.assets._ALL_StopAnimation() end end end