ドアの回転する向き
Part1 はこちら。
ドアと重なるような平面によって、3D空間を二分し、プレイヤーが紫の範囲にいる時は、マウスをドラッグしながら前に押すと、ドアは反時計回りに、オレンジでは時計回りに回ると良いですね。
3D空間を二分する平面はまさにUnityの「Plane」です。Plane は Cube などの普通の3Dゲームオブジェクトではなく、プレイヤーには見えませんが、その平面からの距離や、平面のどちら側にいるか、というのを簡単に取得できて便利です。
Plane を作る方法はいくつかあります。今回は、「Planeが通る点」と 「Plane の面に垂直で、表側への向き」の2つを指定しています。
ドアの真横への向きと、ドアのワールド座標を指定すればいいだけですね。
そして、GetSide() は、渡した点(ここではプレイヤーの座標 transform.position)が平面の表側にあれば true 、裏側なら false になります。
この ForceDirection を 前回の 「-1」 と入れていたところへ置き換えましょう。 プレイヤーが扉の向こう側にいるときは、-1 でなく 1 になって、力の向きが逆になりますね。
自然なドアの動き
あとは、ドアが元の位置に戻った時に、バウンドしないで止まるようにしましょう。より自然なドアの動きになります。
Door オブジェクトに、新規の DoorScript を付けます。
hj = GetComponent<HingeJoint>(); で ドアについている HingeJoint コンポーネントを取得しています。
ドアが閉まった時に 速度をゼロにします。これだけだとすこし反発して開いてしまうので、回転し続けるものを作るときに使う Motor を使います。
これは Hinge Joint コンポーネントの中で設定できるもので、useMotor にチェックを入れるとオブジェクトが回転し続けます。
インスペクタであらかじめ、回転の力の方向をマイナス方向(ドアが閉まる方向)にしています。
transform.rotation.eulerAngles.y でドアの回転を得ていますが、 8未満のとき、としたのは、この値にノイズがあって、ピッタリ0にならないからです。
→ドアが、体当たりしても開かないけど、左クリックすると開くようにするともっと自然ですね。
こちらのページでは、加えて、走って突っ込むとドアが破壊されるようにもしています。