Configurable Jointでスライド運動を作る【Unity】

UnityのRigidbodyのConfigurable Jointは設定できるパラメーターが多く、他のジョイントではできない特殊な動きも作ることができます。
中でもConfigurable Jointでなければ作れないのが「1つの軸に沿ってスライドするオブジェクト」です。
今回はスライドするオブジェクトの作り方を覚えたのでまとめてみました。

スライドするオブジェクト

まず、Rigidbodyのオブジェクトをスライド移動させるにはいくつかの方法が考えられるかと思います。

  • オブジェクトをIsKinematicにしてMovePositionで移動させる方法
  • オブジェクトのFreeze Positionを2軸に指定してからAddForceで移動させる方法
  • Configurable Jointを使う方法

IsKinematicのものはプレイヤーキャラやMobが押して動かすことができません。
Freeze Positionのものはワールド座標でのxyz軸のどれかにしか合わせられないのが難点です。
Configurable Jointのものにはいくつか利点があります。

  • 軸の角度を自由に設定できる
  • 端に停止用のオブジェクトを置かなくても制限範囲を作ることができる
  • 端に着いた時に跳ね返る挙動なども作れる

設定は複雑そうに見えますが、使ってみるととても便利です!

パラメーターの設定

Configurable Jointの設定は以下のような感じです。
今回はx軸(左右)に動くオブジェクトとして作ってみましたが、適宜仕様によって変更してください。
また他のオブジェクトに接続せずステージ内に直置きするようにしています。

Anchor

この値がどこに影響するのか色々試してみたのですが、他のオブジェクトに接続せずステージに直置きするスライドオブジェクトに関してはAnchorはどこでもいいのかもしれません…(?)。
オブジェクトの位置からずらした座標に接続することもできますが、分かりやすくするならとりあえずオブジェクトの中心にしておけば良いかなと思います。

Axis

今回はx軸移動の例なのでx軸にしました。
Configurable Jointのパラメーターでxyz軸がたくさん出てきますが、これらはすべてローカル軸となります。
ローカル軸はAxisとSecondary Axisで指定します。

試しにAxisを傾けてみました。オブジェクトの中心あたりに小さい座標軸の矢印があるのが分かるでしょうか…。傾いているのがローカル軸です。

Auto Configure Connected Anchor

Connected Anchorがスライドの制限範囲の中心になります。
特に接続先のオブジェクトを指定しなければAnchorからの相対的なオブジェクトの座標になりますが、オフにして自分で設定することもできます。
「開始時にオブジェクトをスライドできる範囲の端に置いておきたい」という場合はこれをずらして設定すればOKです。

Motion

X MotionだけLimitedにし、他は全部Lockedにします。

Linear Limit Spring

「オブジェクトが制限範囲の端まで来た時にバネで繋いでいるような感じで制限範囲を超過して動かすかどうか」という値です。
色んな設定値が絡んでくるので一概には言えないと思いますが、相当値を大きくしないとバネ感が出ない気がします…。
またバネ感が出るようにすると本来指定している制限範囲ぴったりでは止まらなくなったりして、なかなか扱いが難しいです。
0であれば制限範囲内でピタッと止まります。

Linear Limit

スライドする制限範囲(左右に移動可能な距離)です。
これはオブジェクトのConnected Anchorを中央にした範囲のようです。Connected Anchorが1mの位置にあってLinear Limitが5だったら-4m~6mの範囲をスライドできるようになります。

Bounciness

スライドさせて端に達した時にバウンドさせるかどうかです。

Rigidbodyの設定

MassとDragがオブジェクトの動きに関わるので好みの値になるように調整します。

ここまでの動き

こんな感じです!どうでしょうか?

自動でスライド移動させるには

自動で動かすにはスクリプトからAddForceするのがとりあえずは簡単なのかな…と思っています。

パラメーター設定で自動で動かす方法について色々調べたのですが、公式のリファレンスでもしっかりした方法がまとめられている箇所がなくて海外のフォーラムなどから拾った断片的な情報の寄せ集めになりますのでご了承ください…。

自動スライドが難解

パラメーターの下の方に「Target Position」とか「Target Velocity」とか「X Drive」とかのパラメーターがあり、これらの値を設定することで自動スライドにも使えるのですがちょっと難しいです。

まずTarget PositionとTarget Velocityは X Drive / Y Drive / Z Drive のために指定する項目で、これだけで動くものではないっぽいです。
そしてXYZのDriveについてですが、これはバネのような動き(Spring)を作るものであってレールの上をスタートからゴールまで等速に走るようなものではないようです。
Springの値が指定されていなければオブジェクトは動きません。
またSpringの動きとはConnected Anchorから反発して外側に向かう動きのようです。

そして更にややこしいですが、Target Positionはオブジェクトから見てConnected Anchorがある方向になるようです。
つまりSpringの伸びる動きが向かう方向はTarget Positionの反対側になる…みたいです。

※この箇所については僕も合っているかどうか自信がないので、正しい情報や設定方法があれば教えていただけると嬉しいです…!

押しても必ず左側に戻るオブジェクトを作ってみました。Connected Anchorは右側にあって、左側に向かってSpringの力が働いています。

まとめ

スライドするオブジェクトを作って、指定した座標に近づいたら力のかかる向きを逆にして往復運動するようにすれば「動く床」が作れそうです。
プレイヤーキャラが乗ってボタンなどを押した時に動くようにすればプレイヤーキャラを運ぶリフトが作れそうです。

ちょっとしたアクションゲームの要素としていろいろ使えると思うので活用していきたいです!

Rigidbodyとジョイント全般に関する記事はこちら↓

Hinge Jointの使い方の記事はこちら↓

シェアする

「Unity」の記事

もっと読む>>

最新記事

もっと読む>>