15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityのSpring Jointを使う

Last updated at Posted at 2016-09-14

はじめに

Unityで、バネを使ったミニゲームっぽいものを学生さんと作りたいので、その基礎となるSpring Jointの勉強をしてます。このトピック、日本語のサイトで詳細な説明のあるものが少ないので、自分でまとめてみました。私自身、それほど良く理解してないので、間違いがあるかもしれません。何かありましたら、ご指摘頂ければ嬉しいです。

Spring Jointの設定の仕方

とりあえず、Cubeを上下に二つ作る。

image

上のCubeのPositionは(0,0,0)、下のCubeのPositionは(0,-5,0)に設定する。

image

image

どちらのCubeにもRigidbodyコンポーネントをつける。

上のキューブは固定したいので、Use Gravityをオフにして、Constraintsを全てチェックする。

image

下のキューブはMassを0.001にする(要するに、出来るだけ軽くする)

image

下のキューブにSpring Jointコンポーネントをつける。Connected bodyには上のキューブ("Cube")を設定。

image

ここで、下のキューブの上の面を見ると、茶色いポチがある。これがAnchor

image

Spring Jointコンポーネントで「Anchor X 0 Y 0.5 Z 0」というのは、Anchorが、Spring Jointコンポーネントがアタッチされているゲームオブジェクトの中心から、Y 0.5だけ上方向に離れている、ということ(ゲームコンポーネントのScaleが1以外の時は、それを掛け算する)。

その下のConnected Anchorは、ばねのもう一方(今回なら、上のキューブ)が繋がる場所。Auto Configure Connectedで設定することも可能だが、今回はこのチェックを外して Y -0.5を入力する。

image

すると、上のキューブの底面にアンカーがくっついている。これがConnected Anchor。 Y -0.5というのは、上のキューブの中心から0.5下ということ(ゲームコンポーネントのScaleが1以外の時は、それを掛け算する)。

重りをバネにぶら下げてみると

この状態で実行すると、下のキューブが上のキューブにくっついてしまう。

image

これは、Spring JointコンポーネントのMax Distanceを調整していないため。Max Distanceを3にすると、下のキューブは Y -4のあたりで止まる。

image

これは、アンカー同士の距離でいうと3にあたる(上のキューブのアンカーは、中心より0.5下、下のキューブのアンカーは中心より0.5上であったことを思い出す)。このように、Max Distanceで重りに重さがない時にばねをぶら下げた場合の距離を調整できる

重りをバネの上に置いた場合

それでは、今度は下ではなく上のキューブを動かす。下のキューブはRigidbodyのConstraintを設定して全く動かないようにし、Use Gravityもオフにする。

image

逆に、上のキューブはmass 0.001, Use Gravityをチェック、ConstraintsのFreeze Position Yだけをアンチェックする。

image

この状態で、先ほどと同じようにSpring JointコンポーネントのMax Distanceを3にして実行すると、上のキューブは下につきぬけて Y = -7で止まる。

image

キューブ間の距離は2だが、はじめに上にあったキューブのアンカーは、中心より0.5下、下にあったキューブのアンカーは中心より0.5上であったことを思い出すと、アンカー間の距離は3。つまり、先ほどと同じように、アンカーの距離はmax distanceの設定と同じになっている。

突き抜けないようにする

突き抜けるのは困るので、それを防ぐためにSpring Jointのmin distanceも設定する。たとえば、min distanceを1にすれば、

image

実行した時、上のキューブは、下のキューブの上で止まる。

image

上のキューブの位置はY -3、つまりキューブ間の距離は2だが、アンカー間の距離はmin distanceで決めた1になっている。

このように、Spring Jointコンポーネントのmin distanceは、ばねが縮む方向に力がかかる時の長さを決めるのに使える。

つづき

長くなったので、こちらの記事に続きを書きました。min distanceが変わると、ばねの性質がどう変わるかを詳しく検証しています。よろしければ、こちらもご覧ください。

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?