【cluster】Constraintを使おう
こんにちは、Linxです。今回はclusterで凝ったギミックを作るうえで避けては通れない、Constraintについて解説します。よって、本記事は通常のワールド制作を経験済みである程度慣れていて、ギミックを作りたい人向けの記事になります。
Constraintとは?
ConstraintとはUnity標準の機能で、オブジェクトの位置や向きを他のオブジェクトに一致させたり、特定のオブジェクトに向けたりすることができる機能です。clusterでは自作のスクリプトを作ってオブジェクトを動かすことができないため、オブジェクトを他のオブジェクトに関連させて動かしたいときは主にConstraintを使うことになります。
clusterでは、Itemの子オブジェクトにItemをつけることはできません。そうなっている場合、アップロード時にエラーになります。アップロードするまで教えてくれないので、誰もが通る道です。
Itemとは、Item (Script)というコンポーネントがついているオブジェクトを指します。つけた覚えが無くてもGrabbable Itemなどを使うと勝手にアタッチされるので、注意しましょう。「Item」が名前についているトリガー・ギミック・ロジックを使う場合ほとんど、Itemコンポーネントは必須です。
一方で、Set Game Object Active GimmickやSet Animator Value GimmickなどItemを必要としないギミックもあり、これらをItemと親子関係にして使うことは可能です。Itemの子オブジェクトにこれらのギミックを使えばアイテムの一部を出す・隠す・動かすといったことができるようになり、逆にItemを子にすればアイテム自体を出す・隠す・動かすといったことができます。
しかし、Item自体が一つしかない場合は「役割の異なる複数の当たり判定を持つ」「操縦できる乗り物に乗ったまま押せるボタンがある」といったことができないので、Constraintの出番です。
Constraintの種類
今回紹介するConstraintは4種類です。
・Parent Constraint
Parent Constraintは、オブジェクトが親子関係の時と同じように位置・回転を他のオブジェクトに追従させることができます。手持ちのアイテムや乗り物にインタラクト可能なボタンをつけたりと、最もよく使われるConstraintです。二人乗りの乗り物を作ったりするときにも使われます。仕組みは単純で、椅子を新しく用意して乗り物に追従させるだけです。
・Position Constraint
位置だけを追従させます。親にあたるオブジェクトが移動するとそれに合わせて移動しますが、回転に対しては何も起きません。位置だけは追従させつつ、向きについてはAdd Continuous Torque Item Gimmickや後述のRotation Constraint等で別の制御を行いたいときに有効です。
・Rotation Constraint
向きだけを他のオブジェクトと同じにします。手持ちのアイテムを動かして遠くのオブジェクトの向きを変えたりするギミックが作れます。
Remote WarfareではRotation Constraintを使うことでミサイルの向きがランチャーに一致するようになっています。
また、Position Constraintと併用すると位置も向きも追従してParent Constraintと同じ動きになりそうな気がしますが、追従先のオブジェクトが回転しても(ワールド座標での)位置関係が変わらないという特徴があります。
・Look At Constraint
常に対象となるオブジェクトのある方向を向くようになります。特定のアイテムを追ってくる・逃げるといった動きや弾を撃ってくる敵に使うといったことが考えられます。
こちらのワールドでは、カメラを常にマイクに向けることでその周囲をスクリーンに映すモードがあります。
以上、4種類のConstraintを紹介しましたが、使うための手順は全てほぼ同じです。次に、実際にConstraintを有効にする手順を紹介します。
Constraintの使い方
・追従するオブジェクトを作成する
この例ではObject2をObject1に追従させることにします。
Object1やObject2がItemであるかどうかに一切関係なくConstraintは使えるため、例えばObject1(Item)の子オブジェクト(非Item)に対してObject2(Item)を追従させる等ももちろん可能です。
Constraintによる追従関係にあるオブジェクトは、ひとつの階層にまとめておくといいです(画像の例だとGameObject)。そうすることで、プレハブ化するときにConstraintによる関係を維持することができます。
・Constraintをアタッチする
Object2のインスペクターからAdd Componentし、Constraintを検索します。今回はParent Constraintを使います。
・Constraintをセットアップする
①右下の+をクリックして追従先を1に増やす
②追従先のオブジェクトをドラッグアンドドロップで指定する
③Activateボタンを押す
これで設定完了です。他にも設定はありますが、ほとんどこれだけ覚えれば使えます。
この状態でシーンのObject1を動かすとObject2も動くようになっているはずです。一方、Object2は動かせなくなります。
Object2を動かして位置関係を変えたいときは、一旦Is Activeのチェックを外してください。位置関係を変えた後は再びActivateボタンを押します。
また、Zeroボタンを押すと追従先との位置関係が(0,0,0)になります。
また、Is Active等いくつかのパラメーターはアニメーションを使って操作できるため、Set Animator Value Gimmickと組み合わせて「アイテムを使ったときだけアイテムと向きが一致する砲台」「標的Aと標的Bを交互に狙う敵」みたいなことも可能です。
Constraintの注意点
・当たり判定に関する注意点
通常、Grabbable ItemやRidable Itemは使用者のアバターの当たり判定と干渉しなくなります。そのため、持ったアイテムの当たり判定にぶつかって吹っ飛ばされるといったことは起きません。しかし、Constraintによって追従しているアイテムは別です。Is Triggerではないコライダーがある場合、追従するオブジェクトに押し出されて凄い速さで吹っ飛ばされるということが起こります。この場合コライダーが使用者自身に干渉しないように、離したり小さくしたりしてください。また、乗り物の二人乗りの場合も「干渉しないのはRidable Itemの使用者と乗り物の間だけ」なので、同乗者の当たり判定が乗り物に入り込んでいると、乗り物が吹っ飛ばされます。
そのため、二人乗りの乗り物を作るときは当たり判定を前後だけにしたり、座る位置がある程度高いなら床下だけにしたりしています。ちなみに車(Rigidbody)の重心はコライダー形状から自動で決定されるため、前だけにはできません。
・Create Item Gimmickに関する注意点
Create Item GimmickでConstraintを活用したアイテムを作る場合、注意が必要です。Create Item Gimmickで生成できるのは1つのアイテムであるため、Constraintで2つ以上のアイテムをひとまとめにしたものは生成できません。別々に生成するとConstraintの参照が切れてしまうので、この手は使えません。
また、Constraintがシーン上にある別のオブジェクトを参照している場合もプレハブ化して生成すると参照が切れてしまうため、やはり生成できません。Create Item Gimmickで生成されるアイテムには、基本的にConstraintを使ったテクニックは活用できません。
出たり消えたりするオブジェクトにConstraintを使いたい場合、あらかじめシーンに配置しておいてSet Game Object Active GimmickやWarp Item Gimmickで必要な時に出したり隠したりするのがおすすめです(オブジェクトプーリング)。
最後に
ConstraintはAnimationと並んで、clusterで凝ったギミックを作るときに重要な機能です。特にゲームを作る場合、Animationと組み合わせることで格段に制作の幅が広がります。
Animationの変わった使い方について詳しく知りたい方は、こちらの記事も読んでみてください。
以上となります。最後までお付き合いいただき、ありがとうございました。