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 を上げると、限界まで回転したあとに、はずんで戻ってきます。
自然になりました。
プレイヤーが押してもこちら側へは開きません。