マウスドラッグ上下でカーテンを開け閉めします。カーテンを開けると、後ろの窓も同じように開閉できます。
前のページでご紹介した、マウスドラッグで窓やドアを開け閉めする方法を使います。
まずは、普通に Planeオブジェクトで作ったカーテンを、シリンダーオブジェクトのカーテンレールにくっつけて、マテリアルを割り当てます。
Plane の transform のポジションと Scale を、調節すると、カーテンがしまった感じになります。
アニメーションさせるといい感じです。
これがデフォルトの値で
マウスドラッグによって、この値の範囲を行ったり来たりさせると開閉できますね。
カーテンの近くで左クリックしたときのカーソルの座標(FPSなので常に真ん中)と、その後のカーソルの座標を使って、上にドラッグしたらその分の正の値、下なら負の値がでるようにしているので、それを使って、カーテンを動かします。
scale も全く同じように動かします。
// 宣言
public GameObject leftCurtain;
Vector3 leftCurtainPosition;
Vector3 leftCurtainPosition_Default;
Vector3 leftCurtainScale;
Vector3 leftCurtainScale_Default;
//------------------
// void Start() 内
leftCurtainPosition = leftCurtain.transform.position;
leftCurtainPosition_Default = leftCurtain.transform.position;
leftCurtainScale = leftCurtain.transform.localScale;
leftCurtainScale_Default = leftCurtain.transform.localScale;
//------------------
// void Update() 内で、Raycast でタグを取得して、switch分で場合分けしています
case "LeftCurtain":
curtainMove = true;
break;
//------------------
//カーテンを動かしているとき
if (curtainMove && Input.GetMouseButton(0))
{
//カーソルのロック解除
sc_player.mouseLook.SetCursorLock(false);
//プレイヤーの動きをロック
sc_player.playerLock = true;
//クリックしたところと、今のカーソルがあるところの差を取って表示
deltaPosition = Input.mousePosition - clickPosition;
text.text = deltaPosition.y.ToString();
// position x は 4.825(デフォルト)~5.9、scale xは 0.2261336(デフォルト)~0.03 の範囲で動かす
leftCurtainPosition.x += deltaPosition.y / 2000;
// ポジションが5.9f より小さくなったら 5.9f にする
if (leftCurtainPosition.x > 5.9f)
{
leftCurtainPosition.x = 5.9f;
}
// デフォルトより大きければデフォルトにする
else if (leftCurtainPosition.x < leftCurtainPosition_Default.x)
{
leftCurtainPosition.x = leftCurtainPosition_Default.x;
}
leftCurtainScale.x -= deltaPosition.y / 10000;
// position と同じ
if (leftCurtainScale.x > leftCurtainScale_Default.x)
{
leftCurtainScale.x = leftCurtainScale_Default.x;
}
else if (leftCurtainScale.x < 0.03f)
{
leftCurtainScale.x = 0.03f;
}
leftCurtain.transform.localScale = leftCurtainScale;
leftCurtain.transform.position = leftCurtainPosition;
}
カーソルロック等の詳細はこちら
一度、今のtransform.position を leftCurtainPosition などの変数に入れて、これを変更してから戻す、ということをしています。
このようにしないと変更できないようになっています。