見出し画像

【cluster】Animation活用術

こんにちは、Linxです。この記事はcluster1月のお題企画、「記事求ム!クリエイターキットライターズ」 の投稿記事になります。

ClusterCreatorKit(以下、CCK)を使う場合、Unity標準のコンポーネントであってもCCKの機能からではパラメーターを変更できない場合が多くあります。
そんな時にAnimation及びAnimatorと、Set Animator Value Gimmickを活用することで本来変更できないパラメーターにアクセスできるようになり、ギミック制作の幅が広がることがあります。

今回は、私が今までAnimationを活用して実現してきたギミックを例に挙げ、その活用方法を紹介していきたいと思います。

1. 表示テキストや画像、3Dオブジェクトの切り替え

Animatorを用いて、表示物の切り替えを行う活用法です。

https://cluster.mu/w/aeac6d61-0de2-488f-862f-034acbb50318

こちらのワールド「冒険者ギルド【ブレイブソード】クラスター本店」には、種族やステータスをボタンで切り替えて自由にステータス画面を作成できるフォトスポットがあります。

画像1

数字はSet Text GimmickにIntegerやFloatを送ればいいですが、文字列はCCKでは扱えないので、種族とクラスは簡単には作れません。そこで登場するのがAnimationです。

画像2

Animationは基本的に、Animatorコンポーネントがついているオブジェクトより下の階層にアクセスできるため、各テキストのオブジェクトをRace以下に配置します。テキストのオブジェクトは、デフォルトで全部非表示になっています。

画像3

RaceにアタッチされたAnimatorのコントローラーは上の画像のようになっていて、それぞれのAnimationにはテキストのうち1つが表示された状態となっているAnimationを用意。これでSet Animator Value Gimmickによって自由に表示状態を切り替えられるようになります。

今回の例ではGameObjectそのものを有効/無効にしていますが、Animationを使えばコンポーネント毎に有効/無効を切り替えられるので、ImageやMesh Rendererを有効/無効にしても良いでしょう。

これに関しては表示の種類が少ない場合はSet Game Object Active Gimmickを用いてもいいのですが、多い場合はBool型のメッセージが増えまくって面倒なことになると思います。

2. 効果音やパーティクルの再生

効果音を再生する時に使うAudioSourceにはPlay On Awakeという項目があります。これが有効になっていると、AudioSourceが有効になった時に効果音が再生されるようになります。
また、Particle Systemの中には有効になってから指定した時間でエミッションするように指定できる、Emission/Burstsの項目があります。

Animationに連動して効果音やパーティクルを再生したい場合、Play Audio Source GimmickやCreate Item Gimmickを使うよりもAnimation内で有効/無効の切り替えを行った方がタイミング同期がとりやすく、簡単に実装できます。

試合開始前のカウントダウン等がその一例。

https://cluster.mu/w/b7db7a90-9e61-4ab9-b50e-b83053b3a303

3. BGMクロスフェード

BGMのボリュームをAnimationから操作することで、BGMをシームレスに切り替えることができます。

https://cluster.mu/w/67891db6-c08b-460a-b3db-42567857587f

モンストラリウスでは、Wave10クリア後にBGMが変化。

画像4

片方のBGMだけボリュームが0になっているAnimationを用意し、わざと遷移に時間がかかるようにTransition Duration(s)を長めに設定しています。

4. 当たり判定の有効/無効

各Collider系コンポーネントの有効/無効やIsTriggerをアニメーションから切り替えることで、当たり判定の出し入れを行う。攻撃する時だけ当たり判定が欲しいとか、結構いろんな使い道があります。

https://cluster.mu/w/01a74819-f737-4e8c-9a95-f937a436d190

スライムシューターでは、
・スライムがぶつかってから完全にブロックになるまではTriggerなので乗れないが、すぐにCollisionになって乗れる。IsKinematicを有効にしてその場に固定する。
・5秒経つとブロックが小さくなって見えなくなり、同時にIsTriggerになって乗れなくなる
・AnimationからRigidbodyのUseGravityをオンにし、IsKinematicをオフにすることで落下させてDespawnHeightまで落とし、オブジェクトを消して重くならないようにする
と、ほとんどAnimationで成立している状態。当時Timerは無かったので、一定時間で消えるには特殊な仕組みが必要でした。

また、On Collide Item TriggerではTriggerとCollisionで異なるメッセージが送信できるため、同じアイテムに
・物理を担当するCollision(IsTriggerでない)
・攻撃判定を担当するCollision(IsTrigger)
を共存させる等も可能です。

ゲーム系のワールドではありませんが、「冒険者ギルド【ブレイブソード】クラスター本店」では、持っているアイテムで他人を押し出せるのが嫌だったのですべてのアイテムが持っている間はIsTriggerになります。むしろこの仕様がデフォルトの方が良かった…。

5. 物理レーダー

前方に伸びる長いIsTriggerなコリジョンをAnimationで回転させ、特定のアイテムがある方向に向き直るレーダー。

大まかな仕組みとしては、上のツイートでのほほさんが解説されている通りです。

https://d-guardians.booth.pm/items/2259051

また、この仕組みで作られた敵のテンプレートを配布しております。

ただし、目標となるアイテムが最初から決まっているならLook at Constraintを使った方が確実だと思います。Animationがどの程度同期してくれるかも怪しいし…。

6. アイテムを移動させる

通常、AnimationでTransformのPositionを変更すると元々の座標に固定されてしまい、何度も前進するといったことはできません。
しかし、AnimatorコンポーネントのApply Root Motionを有効にすることでこれが可能になります。

https://cluster.mu/w/67e72329-ca43-4851-bb05-10f5186914c8

ブレイブソードアドベンチャーでは、5.のレーダーと組み合わせて敵が近付いてくるようになっています。

最後に

これらのAnimationを活用したギミックは、CCKが登場した初期の頃にはロジック・タイマー等が存在しなかったために私の中で研究が進んだところが大きかったりします。今では必要ない技術ですが、Tank Battle!では
・拠点が3回攻撃されると壊れるが、Animatorで何回当たったかの状態を持っていた
・戦車が被弾すると10秒動けなくなるが、AnimationでRigidbodyのIsKinematicをオンにして動けなくしたうえに、砲の前にCollisionを出して塞ぐことで発射不能にした
等、結構変なことをやっていた記憶があります。
とはいえ、改めて振り返ってみると今でも通用する活用術が多数を占めていることがわかりました。
Animationは仕様が複雑で初心者にはわかりにくいかもしれませんが、高度なギミックを作るうえで避けては通れないので、是非活用していきましょう。

この記事が気に入ったらサポートをしてみませんか?