この記事はアドベントカレンダー「【VCI】テーマパークを作ろう 」の7日目の記事です。
今回の内容
今回はメリーゴーラウンドを作成しながら以下のことを学びます
- アニメーションの設定方法
- ボタンを押して何かを動かすスクリプトの書き方
アニメーションとは
アニメーションとは作成したオブジェクトに動きをつけることのできるUnityのコンポーネントとなります。
ここで作成したアニメーションをVCIで実行することで、複雑な動きもほぼスクリプトを書かずに実行できます。
VCIでは使えるアニメーションが限られてたりします。詳細は以下参照
・VCIのアニメーションページ一覧(https://virtualcast.jp/wiki/doku.php?id=vci:sample:animation)
Unityでのアニメーションの設定
今回はメリーゴーラウンドにラウンドに回転のアニメーションを付けていこうと思います。
作成したモデルは以下のように回転する部分(RotateObject)とそうでない部分(Static)に分けておきました。
このRotateObjectを回す設定を作成していきます
まず、オブジェクトを選択し、animationウィンドウでcreateを押してアニメーションクリップを作成します。この際にanimatorコンポーネントがオブジェクトに自動で付きます。
[注意] このanimatorをつける部分は動かしたいオブジェクト(今回ではRotateObject)より1つ以上上の階層である必要があります。動かしたいオブジェクトそのものにanimatorをつけると正常にエクスポートできません
次にanimationウィンドウでanimationを設定します。今回は5秒後から約1分回るような設定を入れました。
回転アニメーションはこのままではVキャスでは動かないため、Rotationの右側のひし形>Interpolation>EulerAngles(Quaternion)を選択してください。(よく把握できてないが回転の計算方法の切り替えをやっている?)
ボタンの作成
次に回転のアニメーションを実行するためのボタンを用意します。
とはいってもボタンオブジェクトのようなものはないため、CubeObjectにグリップで反応できるようにSubItemコンポーネントを使用して実現していきます。
設定方法
まず空オブジェクトを作成し子にCubeオブジェクトを作成します。
空オブジェクトにはSubItemコンポーネントを追加します。
今回はCubeをどっかにもっていかれると困るため、RigitBodyのConstraintsの設定を行います。
Constraintsはどの軸の移動・回転をさせないようにするかを設定できます。今回はいずれの軸も移動も回転もさせたくないため全部チェックを入れます。
Unityでの設定は以上です。
完了したらエクスポートしてseedOnlineに取り込んでください。
スクリプトの作成
ここからはVキャス及びエディタでの作業となります。
今回はアニメーションを設定したいため、以下のページを参考にコードを書いていきます
・ vci.assets(ExportAnimation)
上記ページを参考に作成したコードが以下のようになります。
-- アニメーションの設定の作成。
local table = { wrap_mode="once", speed=1 }
local carouselAnimeSetting = json.serialize(table)
---[SubItemの所有権&Use状態]アイテムをグラッブしてグリップボタンを押すと呼ばれる。
---@param use string @押されたアイテムのSubItem名
function onUse(use)
--今回作成したボタン「Start_Carousel」が押されたときのみ実行される
if use == "Start_Carousel" then
--Carouselに紐付いたアニメーションを取得する。
local anime = vci.assets.GetTransform("Carousel").GetAnimation()
--RotateCarousel(作成したアニメーション)を作成した設定で再生する。
anime._ALL_PlayWithState("RotateCarousel", carouselAnimeSetting)
-- 速度変更しないのであれば以下の記載でもOK(第2引数はloopするかどうかのフラグ)。この関数の場合設定の作成は不要。
-- anime._ALL_PlayFromName("RotateCarousel",false)
end
end
onUseを関数ですが、こちらはサブアイテムのオブジェクト(またはその配下のオブジェクト)がグリップされたときに実行される関数です。
引数のuseにはグリップしたSubItem名が入ります。コライダーが入ってるオブジェクト名ではないので注意してください。
また、onUseの関数はグリップした本人のみ処理が走ります。そのため_ALL_なしでアニメーションを再生するとグリップしたひとのみしか動かないため、_ALL_付きの関数を呼び出すことで全員再生されるようにしています。
実際にCubeをグリップして動きだせば完了です。
(Vキャスには座る機能がないため立ったまま回ってます。Vキャスに座る機能が来るのを気長に待ちましょう。)
終わりに
いかがでしたでしょうか?
今回は回転だけでしたが、もちろん馬を上下させるアニメーションを設定することも可能です。
次回はスポーンポイントの設定を書こうと思います。