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

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

バーチャルキャスト+VCIで、ループとそうでないアニメーションを同一オブジェクトで使用する

バーチャルキャストでループアニメーションとそうでないアニメーションを同じオブジェクトに適用する場合の方法です。
複数アニメーションを設定するにあたり、VCI上の仕様でいくつか注意点があります。

今回のサンプルです。

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」がその親です。
f:id:prince9:20190508142923p:plain

一度アイテムをアップロードする

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」を選択して新しいアニメーションファイルを作成する
f:id:prince9:20190508043652p:plain
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