この記事はアドベントカレンダー「【VCI】テーマパーク を作ろう 」の11日目の記事です。
今回の内容
今回は以前作成した観覧車を回るようにしていきながら以下の学んでいきたいと思います。
・Unityでオブジェクトに連番を付ける方法
・連番付きオブジェクトを取得する方法
Unityでの観覧車作成
アニメーション作成
まず以前作成した観覧車に回転アニメーションを付けます。詳細な手順は以前投稿した以下の記事を参照下さい
・7日目:メリーゴーラウンドで学ぶアニメーションをボタンで実行する方法
ただし、この状態だと以下の画像のようにゴンドラまで回転してしてしまい、常に外向きになってしまいます。
そのため、ゴンドラは回さないように調整する必要があります。
色々方法はありますが、今回はゴンドラをアニメーションで逆回転させることで回転を打ち消させ、以下のように常に入り口が下のように向きうようにしました。
オブジェクトのコピー
アニメーションの作成が完了したので作成したゴンドラを複製していきます。
まずは作成したゴンドラを複製して配置します。
特に新しいことはしれないですがゴンドラを円形に配置するのは以下の手順でやると楽だと思います。
1. 空オブジェクトを作成し、中央を観覧車の中央に合わせる。
2. 空オブジェクトの中にゴンドラを入れる
3. 空オブジェクトを作りたいゴンドラの数分だけ複製する。
4. 複製した空オブジェクトを少しずつ角度を増やして回転させる。(この時点ではゴンドラはまだ外向きになっている)
5. 空オブジェクトからゴンドラを取り出し、観覧車の回転対象のモデルの下に置く
6. ゴンドラを全部選択し、角度を0にする(これで常に下向きになります)
以下が完成後の図です。
オブジェクトの連番付け
オブジェクトの複製までおこなってきましたが、現時点ではゴンドラの名前が全て同じになっているかと思います。
しかし、このままではアニメーションを実行の際のオブジェクト取得処理でオブジェクトを見分けることができず、正常に取得することができません。(おそらく最初の1つのみしか取得できません。)
そのため、ゴンドラに連番を振っていきます。
今回くらいの数なら1つ1つ手作業でなおずこともできますが、数が多いと大変になってくるのでUnityの拡張機能を使用します。
種類は色々あるみたいですが、今回はEzRenameというものを使っていきます。
以前はアセットストアから入れることができましたが現在はできないようです。以下からダウンロードはできるみたいです。
・https://github.com/betodeoliveira/ez-rename
上記の拡張機能を追加すると右クリックに「Ez Rename」項目が追加されます。ここからEzRename用の設定を表示できます。
早速ゴンドラを選択して右クリック>EzRename>OpenWindowを選択します。すると以下のウィンドウが表示されます。
今回は「Gondorla_1」「Gondorla_2」・・・の様な形式にしたいため以下のように設定を変更しました。
・NewNameに「Gondola_」を入れる
・Enumerateにチェックを入れる
・InitialNumber(何番から始まるか)に1を設定する
最後にHierarchyを押すと以下のように名前が変更されます
以上でUnityでの設定は完了です。
コード作成
ここからはVキャス及びエディタでの作業となります。
※今回はコード簡略化のために同期に関しては考慮しておりません。
今回作成するコードでは他の方と位置の同期が取れませんのでご了承下さい。
作成したコードは以下のとおりです。
ゴンドラの部分はゴンドラオブジェクトが連番になっていることを活かし、「Gondola_1」から1つずつ取得じてアニメーションを実行します
もしオブジェクトが取れなかったらループから抜けて再生処理を終わります。
書き方を間違えると無限ループになるのでご注意下さい。
--観覧車・ゴンドラ共通の再生設定の作成
local wheelSetting = json.serialize( { wrap_mode="loop",speed=0.5} )
--観覧差者全体の回転
animeObj2._ALL_PlayWithState("WheelRotate1", wheelSetting)
---------------
---ゴンドラを逆回転させる処理
---------------
local no = 1
-- 内部でループ抜ける処理が走るまでずっとループ
while(true) do
--ゴンドラオブジェクト取得
local wheel = vci.assets.GetTransform("Gondola_"..no)
--オブジェクトが取得できればアニメーション再生
if wheel then
local animeObj = wheel.GetAnimation()
animeObj._ALL_PlayWithState("GondolaRotate", wheelSetting)
--なかったらループから抜ける
else
break
end
no = no + 1
end
終わりに
いかがでしたでしょうか?
コード作成の部分にも書きましたがこのコードでは他の方との同期が取れていない状態です。
同期をとるには少し複雑な設定をする必要があるためこのアドカレとは別でまた記事を書こうと思ってます。書いたら追記します。
次回は観覧車を回していきたいと思います。