UnityのHinge Jointの使い方

投稿者: | 2019-03-27

UnityのHinge Jointでドアを作る

紫色の壁に薄い色のドアがあります。

ドアのほうに「Hinge Joint」をつけると、このように Rigidbody と Hinge Joint コンポーネントが付きます。

デフォルトでは、ドアの上部と壁の境目に、右向きの矢印が作られます。
見えにくいかもしれませんが、これが Hinge Joint を表しています。

Hinge Joint をインスペクタで見るとこうなっています。
Anchor は Hinge Joint の位置で、Axis は矢印の向きですね。
Hinge Joint を何か動くものに取り付けない場合は、「Connected Body」に何かアタッチする必要はありません。

Xが1になっているので、Xの正の方向に向いています。

方向はあまり関係なく、この黄色い線のところに軸(Axis)が通っていて、ここを中心にしてドアが回転します。

ドアにボールをぶつけてみましょう。

ボールにつけたスクリプトにこの一行を書きます。

横に回ってほしいですね。

Axis をX方向ではなく、 Y(上)方向にします。

Hinge joint の矢印が上を向きます。

真ん中で回っています。

Hinge Joint の位置(Anchor)を変えると良いですね。
横方向に動かします。Anchor の値は、ゲーム空間の座標とは関係なく、このドアのオブジェクトのPivot(ふつうは真ん中)の位置を(0, 0, 0)とした値になっています。

少し上の「Edit Joint Anguler …」ボタンの押すと、Hinge Joint がどこにあるのか表示されます。
少し遠いですね。

±0.5 にするとちょうどよいところに来ます。

位置と向きはよいですが、壁に衝突してすぐに閉じてしまいますね。
壁とドアの衝突を調整してみます。

Hinge Joint の衝突判定

壁との衝突に扉の動きが左右されます。

このように、壁の方の Collider コンポーネントの Is Trigger にチェックを入れれば、壁は何に対しても衝突しなくなるのでよさそうですが、プレイヤーとも衝突しなくなります。

なので、「壁」と「ドア」だけお互いに衝突判定をしないようにしたいですね。

そのためにはまず、壁とドアにレイヤーを設定します。

Add Layer … を押して

空いてるところに新しいレイヤーを設定します。

壁とドア両方にそのレイヤーを設定します。

ここで、壁もドアも同じレイヤーにしてもかまいません。

メニューバーの Edit > Project Settings > Physics の下の方で

レイヤー同士の衝突判定のオンオフができます。

チェックを外すと衝突しなくなります。
ドアが壁に対して、壁がドアに対して衝突しないように設定できますし

両方とも「Door」というレイヤーにしたなら、「Door」同士を衝突させないようにもできます。

衝突しないので、くるくる回り続けますね。

プレイヤーとは衝突しますが、壁とドアは衝突しません。
これでは変なので、ドアがどこからどこまで回転するか、を設定します。

Hinge Joint の回転の範囲

ドアのインスペクタのHinge Joint コンポーネントの「Use Limits」にチェックを入れて、Min と Max を変更します。
デフォルトの位置が 0 で、プラスの値だと、画面の手前側にドアが開き、マイナスの値だと奥へドアが開きます。

向う側へ130 くらいまで回転して、こちら側へは回転しないようにすると、外側へ開くドアができます。

それ以上開かないのはよいですが、ぴたっと止まるのは不自然です。

Bounciness を上げると、限界まで回転したあとに、はずんで戻ってきます。

自然になりました。

プレイヤーが押してもこちら側へは開きません。

コメントを残す

メールアドレスが公開されることはありません。