見出し画像

トリガーギミックを使ってオブジェクトをAnimationで移動させる(簡易)

この記事はCluster Creator Kit Advent Calendar 2020の18日目の記事です。

前日の記事は、初-ui-の
【cluster】ゲームワールド杯を振り返る(ワールド作ろう!)」でした。
clusterにおけるゲームワールド制作ついてわかりやすく
解説されていました。
ゲームワールドを作りたいけどよくわからないという方は、
是非読んでみて、チャレンジしてみてください!

はじめに

おはようございます。こんにちわ。こんばんわ。
かせーといいます。
今まで書かれた方は、はすばらしい記事や経験からの制作における注意点などノウハウが書かれていて読み続けていました。

それに比べると、私の記事は初歩的なものになります。
(なので期待しないで(弱気))

では、始めて行きたいと思います。
今回は、
「トリガーギミックを使ってオブジェクトをAnimationで移動させる(簡易)」
として
自分が理解するのに時間がかかったAnimationをつかった制御の解説記事になります。
はっきり言って、簡易ですが、、、長いです。。。(すみません。)

実際作るもの

実際の動作の様子です。

このデータは下記からダウンロードできます。

※ダウンロードしたZIPを解凍して、UnityHUBに登録してもらえると
 見れると思います。
 シーン自体は、Assetsフォルダ内にあるScenesフォルダの中に
 「MinimalSample」をダブルクリックしてもらえれば開けます。
 (ClusterCreatorKitSampleを流用してます。)

では、初めて行きたいと思います。

最終的に作るものは、下記のようなものです。

・2つスイッチとなるCubeを配置し、そのスイッチに2つともCollider判定が
 あった場合隠しているCubeを表示する。
・どちらかのスイッチCubeのCollider判定がOFFになった場合、
 再度非表示になる。

構造は下記のよう形です。

動作説明

緑枠の2つのCubeの距離は今回スイッチCubeを踏むごとに下のCubeが1m上に上がるようにするので、2m離しています。

1.オブジェクトの配置について

まずはオブジェクトを下記のように配置します。

画像1

この形にしたらトリガー・ギミックを仕込んでいきます。
実際の動きは下記の通りとなります。

ヒエラルキーはこのような感じです。
※オレンジ枠の部分は、ClusterCreatorKitSampleにある
 「MinimalSample」のサイズを変えただけですので、説明を割愛します。

ヒエラルキー

2.手で持てるアイテムの作成(黄色枠)

ゲームオブジェクトの3Dオブジェクトとしてデフォルトで入っているCylinderを使用します。(色など適宜変えてください。)
オブジェクトを配置したら、インスペクターを下記のように設定します。

インスペクターCylinder

ClusterCreatorKitに含まれている、「Movable Item」、「Grabbable Item」を
Add Componentを押して追加します。
この2つを追加するとアイテムとして持てるようになります。
追加するだけで設定は不要です。
RigidbodyやItemは上記を追加すれば自動的に追加されます。
Rigidbodyのみ下記のように設定します。

Rigidbodyの設定
・「Use Gravity」にチェック
・「Angular Drag」を0.1に設定
※アイテムも持って離したとき、重力で下に落ちるようにするため。

3.スイッチ機能をCubeに割り当てる(水色枠)

次に水色枠のCubeにスイッチの機能を割り当てます。
まず、下記のように、SW_Cubeのインスペクターを見て、
Box Colliderにある「Is Trigger」チェックを入れます。
※「Is Trigger」にチェックがないとコライダーに関する
 イベントが発生しない為チェックは必須となります。
※このサンプルはPrefub化していますが、
 必ず必要というわけではないです。

画像5

次に、その上の「ANDInput1」、「ANDInput2」に対して、下記のように設定します。

画像9

Add Componentで追加するのは、
・「Rigidbody」※今回はコライダー判定に必要なため手動で追加
・「On Colliede Item Trigger」(ClusterCreatorKitに含まれている)
になります。
※Itemは、「On Colliede Item Trigger」を追加すると
 自動的に追加されます。

Rigidbodyについては、位置を固定したいため、下記のように設定します。

Rigidbodyの設定
・「Use Gravity」にチェックしない
・「Angular Drag」を0に設定

画像9

On Colliede Item Triggerについては、
・コライダ判定でOnになったら動作するトリガー情報(Enter)
・コライダ判定でOffになったら動作するトリガー情報(Exit)
2つを登録します。

画像8

コライダ判定でOnになったら動作するトリガー情報(Enter)設定
・Size:1
・Target:Global
・Key:
      ANDInput1 -> Anim.AND.Signal1
      ANDInput2 -> Anim.AND.Signal2
   ※Keyのみ値を分けます。(なぜそうするかは後述)
・Parameter Type:Bool
・Bool Value:☑(チェックする)
コライダ判定でOffになったら動作するトリガー情報(Exit)設定
・Size:1
・Target:Global
・Key:
      ANDInput1 -> Anim.AND.Signal1
      ANDInput2 -> Anim.AND.Signal2
   ※Keyのみ値を分けます。(なぜそうするかは後述)
・Parameter Type:Bool
・Bool Value:□(チェックしない)

4.両方スイッチが入ったときに表示するCubeの設定(赤点線)

両方スイッチが入ったときに表示するCubeの設定は、
・初期表示を非表示にする
・「Set Game Object Active Gimmick」をAdd Componentから追加
  (ClusterCreatorKitに含まれている)
します。
 「Set Game Object Active Gimmick」は、オブジェクトの表示/非表示を制御できるGimmickです。

画像42

5.スイッチのON/OFFにより変化するCubeとのあたり判定を行うCubeの設定(緑枠)

判定を行うCubeの設定を行います。
パラメータの違いはありますが、基本「3.スイッチ機能を割り当てる」で行ったことと同様のことを行います。
設定は以下の通りです。

TargetCubeという名前のCubeオブジェクト
・あたり判定が必要なので、にあるBox Colliderの
 「Is Target」にチェックを入れる。

Targetという名前のGameObject
・「Rigidbody」※今回もコライダー判定に必要なため手動で追加
・「On Colliede Item Trigger」(ClusterCreatorKitに含まれている)を追加
  →コライダ判定でOnになったら動作するトリガー情報(Enter)
  →コライダ判定でOffになったら動作するトリガー情報(Exit)

画像9

コライダ判定でOnになったら動作するトリガー情報(Enter)設定
・Size:1
・Target:Global
・Key:Anim.AND.Signal.Output
・Parameter Type:Bool
・Bool Value:☑(チェックする)
コライダ判定でOffになったら動作するトリガー情報(Exit)設定
・Size:1
・Target:Global
・Key:Anim.AND.Signal.Output
・Parameter Type:Bool
・Bool Value:□(チェックしない)

Rigidbodyについては、今回も位置を固定したいため、下記のように設定します。

Rigidbodyの設定
・「Use Gravity」にチェックしない
・「Angular Drag」を0に設定

6.スイッチの状態でAnimationを使って動かすCubeの設定(オレンジ枠)

最後の工程になります。
オレンジ枠のCubeの設定を行っていきます。
まずは、使用するアニメを作っていきます。
Projectのドコでも良いので、右クリックメニューを出して、
「Create」-「Animation」を選択してAnimationを作成します。

Anime作成

作成したAnimation名前を今回は、「TR」とします。
※今回は、作成したAnimationは、「Animations」フォルダで
 管理するようにしました。

画像11

プロジェクトで、「TR」が見れる状態にして、
ヒエラルキーにある「ANDInputValue1」を選択します。
次に「TR」を選択し、「ANDInputValue1」のインスペクターへドラッグします。

画像12

そうすると、「ANDInputValue1」のインスペクターに、「Animator」が追加されます。
また同時に、「ANDInputValue1」というAnimation Controllerが追加されます。※インスペークターの所には、この「ANDInputValue1」というのが登録されています。

画像13

画像14

この「ANDInputValue1」を今回は、「TRController」と名前を変更します。
※変更と同時にインスペークター側のControllerの設定は、「TRController」
 に変わります。

同じ事を「ANDInputValue2」にも行います。
ただし、
「ANDInputValue2」には、「TRController」をインスペクターへドラッグします。

画像25

そうすると、「ANDInputValue2」のインスペクターに、「Animator」が追加されControllerの設定に「TRController」が登録されます。

画像25

画像25

つぎに、TR Animationの設定を行っていきます。
TR Animationをダブルクリックするとウィンドウが立ち上がります。
その状態で、
ヒエラルキーから「ANDInputValue1」を選択てください。
すると、「Add Property」が押せるようになるので、
クリックで押してください。
メニューが出てきますので、「Transfrom」-「Position」の横にある「+」を押して、追加します。

画像22

下記のようになります。

画像22

ここまでしたら、
最後に1:00の所にある点をクリックして選択状態にしたら、「Delete」キーで削除してください。
下記のようになれば正解です。
※画像は0:00のところが青くなっていますが、選択していない場合は、
 グレーですので、「Delete」キーを押したあとで0:00が
 グレーの間までも問題ありません。

画像20

TRについては動かないアニメとして使用するため、以上で設定は終了です。

※ちなみにここで指定した値は、
 指定した場所
 (今回で言う「ANDInputValue1」 or 「ANDInputValue2」)、
 のPositionの値をX=0、Y=0、Z=0(絶対値)にするという意味です。
 ヒエラルキーの方で、TransformのPositionの値を変えても、
 再生時は、アニメーションの値に書き換わりますので注意してください。

次に動きのアニメを作るため、「TR_UP」というAnimationを作成します。
「TR」のアニメーション設定画面を開いた状態で、
「TR_UP」は下記のように作成します。

アニメーション設定画面の左上に「TR」と書かれている場所を押すと
下記の図のようにメニューが開くので、「Create New Clip...」を押します。

画像21

下記の画面が出てくるので、TR_UPと指定して「保存」を押します。

画像22

「保存」を下記のように「TR_UP」が追加されます。

画像23

追加したら、「Add Property」を押して「Transfrom」-「Position」の横にある「+」を押して、追加します。
※「Add Property」を押せない場合は、ヒエラルキーで「ANDInputValue1」
 を選択すれば押せるようになると思います。

画像24

追加する下記のようになりますので、
今回は0:00のポイントを選択して、Positionの「Position.Y」の値を「1」に
します。
1:00のポイントは、「TR」同様「Delete」キーで削除してください。
終わったら、Animation設定のウィンドウは閉じてかまいません。

画像25

次に、「TRController」の設定をしていきます。
「TRController」をダブルクリックしてください。

画像26

そうすると、下記のような画面になります。
※「Animator」タブに移動します。

画像27

ここでやることは、

「TR」、「TR_UP」をどういう値になったとき動作させるか?

を設定します。
順に設定していきます。

まず、下の図のように表示を整理して、
左上の「Parameters」タブを選択しておきます。

画像28

次に、「Any State」と書かれているモノがありますのでそこの上で右クリックをします。
そうすると、「Make Transition」というメニューが出てくるのでクリックします。

画像29

そうすると、矢印を引ける用になるので、
「TR」にマウスカーソルを合わせて、クリックします。
そうすることで、「Any State」から「TR」に矢印が描かれます。

画像30

つぎに、また同じように「Any State」を右クリックして「Make Transition」を選択し、今度は、「TR_UP」へマウスカーソルを持って行き、「TR_UP」上でクリックします。
そうすると今度は、「Any State」から「TR_UP」にも矢印が描かれます。

画像31

ここまでしたら、
次はそういう状態の時に、「TR」、「TR_UP」に状態を変化させるか設定していきます。

まず、左上の「Paramaters」の所にある「+▼」ボタンをおします。
そうするとメニューが開き、

Float
Int
Bool
Trigger

の選択画面が出てきますので、Boolを選択します。

画像32

そうすると、Boolのパラメータが追加されるので、
名前を「TRBool」とします。
チェックを付ける場所がありますが、ここはチェックしないでください。

画像33

次に、
「Any State」から「TR」に伸びている矢印までマウスカーソルを持って行き、クリックします。
そうすると、選択状態(水色になる)になります。
その状態になったら、インスペクターの表示が変わるので、
そこにある「Conditions」の項目に値を追加していきます。
(追加する前は、「List is Empty」となっていると思います。)

画像34

「+」を押すと、「TRBool」が追加されるので値を「false」に設定します。

画像35

この設定が終わったら、
今度は、
「Any State」から「TR_UP」に伸びている矢印までマウスカーソルを持って行き、クリックします。
ここも同じく、「Conditions」の項目に値を「+」を押して追加します。
「TR」で追加した値は、「false」にしましたが、こちらは「true」に設定します。

画像36

以上で「TRController」の設定は終了です。

コレを行ったとは、確認事項として下記をしてください。
・「TR」/「TR_UP」Animationをクリックして、
 インスペクターの設定で、「Loop Time」などに
 チェックがついていないか確認する。

画像37

長かったですが、最後に下記のGimmickを追加して終了です。

「ANDInputValue1」と「ANDInputValue2」に
「Set Animator Value Gimmick」(ClusterCreatorKitに含まれている)
をAdd Componentから追加します。

「Set Animator Value Gimmick」のパラメータは下記のように設定します。

「Set Animator Value Gimmick」のパラメータ設定
・Target:Global
・Key:Anim.AND.Signal1
      ANDInputValue1 -> Anim.AND.Signal1
      ANDInputValue2 -> Anim.AND.Signal2
・Parameter Type:Bool
・Animation Parameter Name:TRBool
ここまで、設定してきましたが、
その意味と流れを書くと下記の通りです。

やりとりとしては、「ANDInput1」と「ANDInputValue1」の流れ例にします。
※「ANDInput2」と「ANDInputValue2」との流れも同じなので。。。

ANDInput1(スイッチ動作するようにしたGameObject)がコライダー判定により出力する
「Anim.AND.Signal1」の値を受け取り、
それを「TRController」に設定したパラメータ「TRBool」渡す。

・TRBoolに渡す値が「true」ならANDInput1のTransformのPositionが、
 Yの値が1になるので、上に上がる。

・TRBoolに渡す値が「false」ならYの値が0になるので下に下がる。

※ちなみに、同じ値なら動かない。
 今移動は1秒かけて行っていますが、設定すれば早くすることも可能です。
 (アニメーション早すぎるとコライダー判定されないときもあるので、そこは要注意。)

非表示のGameObject(Output)の表示非表示は、
「ANDInputValue1」と「ANDInputValue2」それぞれコライダ判定で、「Enter」になり
「TR_UP」がアニメが再生されると2m上がることになります。

そうするとちょうど、「Target」のGameObjectと重なることになります。
そのため、コライダー判定が発生して、「On Colliede Item Trigger」で、
「Anim.AND.Signal.Output」の値が「true」になります。
それに伴い、「Output」の「Set Game Object Active Gimmick」が反応して、
赤いCubeが表示されます。

「Target」のコライダー判定が「Enter」の状態で、
「ANDInputValue1」と「ANDInputValue2」どちらかのコライダー判定で
「Exit」判定が出た場合は、「TR」アニメが再生されると、1m下がることになります。

そのため、「Target」のコライダー判定も「Exit」判定が出るため、
「Anim.AND.Signal.Output」の値が「false」になります。
それに伴い、「Output」の「Set Game Object Active Gimmick」が反応して、
赤いCubeが非表示になります。

画像38

画像39

画像40

画像41

以上で設定など終了になります。
お疲れ様でした。

最初は時間がかかりますが、
Triger/Gimmickをつかって、自分の思ったように動かせたら
ちょっとしたことでも面白くなってきます!
挑戦してみましょう~。

明日は、yunodaさんの
「【脱法CCK】強制Invokeでイベントを外から発火する」です。
流石に実力者、、なかなかディープな内容そうです!
ちょっと楽しみ♪

今日からClusterGAMEJAM in WINTERが開催されます。
お祭り気分で楽しんで行きましょう!

ここまで読んでいただき、ありがとうございました。
m(_ _)m

[参考]