Unityで一部がガラスの窓の作り方

投稿者: | 2019-03-28

ProBuilderで窓の形を作る

窓のために開けた穴に、ガラスよりすこし厚めのオブジェクトをはめました。

ProBuilder で、一つの辺を選択して、Insert Edge Loop をすると、その辺と垂直にぐるっと辺ができるので、それをいくつか作って枠の形を作ります。

真ん中の面を選択して、ここだけ薄くします。

普通に動かすと、枠が斜めになるので、シフトを押しながら動かします。

ここだけ色を変えたいので、面を選択して Material Editor を開きます。

前のページで作った窓ガラス用のマテリアルを割り当てます。このページでは、窓枠を作って、この右側に窓ガラスをはめました。

裏側もやります。

良い感じですね。

窓を開閉させる

さて、この窓は開閉させられるようにしたいです。

マウスドラッグでドアを開閉させる方法(1-1)」をそのまま使います。
窓の近くで左クリックをすると、プレイヤーの向きや移動が固定して、カーソルロックが解除されます。そして、マウスを上にドラッグすると開いて、下にドラッグすると閉まります。

今回は窓とプレイヤーの間に空のオブジェクトをつくり

Box Collider を付けます。このコライダーと Ray が近くで当たった時に開閉操作をしました。近づかないと開閉操作ができないので、窓の Collider を使ってしまうと、窓が開ききった時には操作しにくくなりそうですね。

コライダーは窓でなく、もともとの壁よりも少し前に置いています。こうしないと、壁のコライダーに穴が開いていないので 空のオブジェクトのコライダーに当たらないみたいです。

スクリプトは同じですが、力を加える方向を変えました。

transform.forward の方向はデフォルトの位置で Z軸方向ですが、オブジェクトの回転についていきますね。
この窓のように、X軸に沿ってつけたものは transform.forward 方向へ、 ドアは transform.right 方向へ力を加えると回転しますね。
transform.left などはないので、逆方向へは、これらに -1 をかければ回転します。


// タグ名で場合分け 動かしたいオブジェクトとそのRigidbody と、動かす方向を決める
switch (hit.collider.tag) {
   case "Door":
      TargetGameObject = door;
      TargetRigidbody = rb_door;
      RotateDirection = TargetGameObject.transform.right;
      break;
   case "Window_Emp":
      TargetGameObject = window;
      TargetRigidbody = rb_window;
      RotateDirection = TargetGameObject.transform.forward;
      break;
   default:
      break;
}

//-----------------------------------------//

// 左クリックを押した瞬間
// クリックしたときのカーソルの位置や、オブジェクトを動かす方向などを決める

// クリックしたときのカーソルの座標(Vector3)
clickPosition = Input.mousePosition;

//ドアに重なるような Plane を作る。表への垂直方向と、Plane が通る点を指定すると作れます
Plane1 = new Plane(RotateDirection, TargetGameObject.transform.position);

// transform.positionにいるプレイヤーがドアのどちら側にいるかによって力の向きを変える。
// ドアのこちら側にいるときは、マウスを上にドラッグでドアを押すように動かして、
// ドアのあちら側にいるときも同様にしたい
if (Plane1.GetSide(transform.position))
{

   ForceDirection = -1;

}
else
{

   ForceDirection = 1;

}

//-----------------------------------------//

// 左クリックを押している最中

// カーソルのロック解除
sc_player.mouseLook.SetCursorLock(false);

//プレイヤーの動きを止める
sc_player.playerLock = true;

//クリックしたところと、今のカーソルがあるところの差を取って表示
deltaPosition = Input.mousePosition - clickPosition;
text.text = deltaPosition.y.ToString();

//ドアに力を加える。
TargetRigidbody.AddForce(RotateDirection * ForceDirection * deltaPosition.y / 2000, ForceMode.Impulse);

詳しくはこちらのページを見てください

Hinge Joint コンポーネントで、向う側に(Min)-100 まで回転するようにしています。こちら側へは(Max) 0 です。
Bounciness を 0にすると、反発して戻ることがなく、限界まで開閉すれば止まります。

窓の重さなどを変える

窓の Rigidbody の Mass(質量、密度)や Drag(空気抵抗)を大きくすると窓がゆっくり開閉するようになります。

コメントを残す

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