マウスドラッグでドアを開閉させる方法(1-2)

投稿者: | 2019-03-28

ドアの回転する向き

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にならないからです。

ドアが、体当たりしても開かないけど、左クリックすると開くようにするともっと自然ですね。
こちらのページでは、加えて、走って突っ込むとドアが破壊されるようにもしています。

コメントを残す

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