【unity】3D脱出ゲーム作成_その18

3D脱出ゲーム

好きな位置から球を落とす

前回作成したプレイ画面からGOボタンを押したら紫の球が落ちるようにしましょう。この紫の球は別途絵を描いて作成した円形のimageオブジェクトなので、CircleColider2Dを追加して円形に当たり範囲を指定しましょう。またRigidbody2Dを追加してBodyTypeをKinematicに設定、AudioSourceも追加しておきます。ここまでできたらBallManagerクラスに以下追加します。

public bool isBallMoving;//別スクリプトから参照する為public
public GameObject moveBall;//紫の球
void Start()
{
isBallMoving = false;
}
public void PushGoButton()
{
Rigidbody2D rd = moveBall.GetComponent<Rigidbody2D>();
rd.isKinematic = false;
retryButton.SetActive(true);
goButton.SetActive(false);
isBallMoving = true;
}

GoButtonメソッドを同ボタンのイベントに設定しましょう。Rigidbody2DのKinematicにチェック(true)=重力無効なので、ボタンを押すと紫の球が落ちる処理になります。これだけだと面白味がないので次に紫の球自身に以下新規スクリプトを設定します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveBall : MonoBehaviour
{
private GameObject canvas;//BallManagerクラスを設定したオブジェクト
private Vector3 pos;//マウス位置座標用
private Vector3 WorldPointPos;//ワールド座標用
AudioSource audioSource;
void Start()
{
canvas = GameObject.Find("Canvas");
audioSource = gameObject.GetComponent<AudioSource>();//今回無関係だがSE用
}
void OnMouseDrag()
{
   if (canvas.GetComponent<BallManager>().isBallMoving == false)
   {
       pos = Input.mousePosition;//マウス位置を取得
       WorldPointPos = Camera.main.ScreenToWorldPoint(pos);//マウス位置座標をスクリーン座標からワールド座標に変換
       if (WorldPointPos.x <= 97.5f)
       {
           WorldPointPos.x = 97.5f;
       }
       else if (WorldPointPos.x >= 102.5f)
       {
           WorldPointPos.x = 102.5f;
       }
       WorldPointPos.y = 4.0f;
       WorldPointPos.z = 100.0f;
       gameObject.transform.position = WorldPointPos;//ワールド座標をPlayer位置へ変換
   }
}
}

OnMouseDragは親クラス(MonoBehaviour)から承継したメソッドで、レイヤーが Ignore Raycast である場合を除きマウスを押している間毎フレーム呼び出されます。紫の球にはCircleColider2Dがついてますのでこの範囲でマウスを押している間はマウスに追従して紫の球が移動する処理になるのですが、マウス位置はスクリーン座標、紫の球はワールド座標にありますので、ずれない為に変換しています。画面からはみ出して無限に移動させる訳にはいかないので、左端x=97.5 右端x=102.5に限定。y,z座標は所定の位置から固定するようにしています。

BallManagerクラスのisBallMovingとリンクさせ落下中は動かせないようにする処理も忘れずに。

リスタートでプレハブ生成

これで落とし球ゲームはプレイ可能になりましたが、このままだと1回落としたらそれで終わりになってしまいますのでリスタートできるようにしましょう。準備としてまず紫の球が落ちる先プレイ画面の最下方に空オブジェクトを配置し、地面のように細長い形のBoxColider2Dを追加。紫の球にmoveBall、空オブジェクトにoutAreaのタグ付けをします。又プレイ画面からボールがはみ出てはいけないので両サイドにただの壁としてBoxColider2Dを設置しておきます。

次に紫の球をAssetフォルダにドラッグ&ドロップしPrefabとして保存します。ここまでできたらBallManagerクラスとMoveBallクラスに以下追加しましょう。

//BallManagerクラス
public GameObject moveBallPrefab;//紫の球のPrefab
public void PushRetryButton()
{
    Destroy(moveBall);//紫の球を削除
    moveBall = (GameObject)Instantiate(moveBallPrefab);//紫の球としてPrefabを生成
    retryButton.SetActive(false);
    goButton.SetActive(true);
    isBallMoving = false;
}
//MoveBallクラス
void OnCollisionEnter2D(Collision2D col)//衝突
{
    if (col.gameObject.tag == "outarea")
    {
        canvas.GetComponent<BallManager>().PushRetryButton();
    }
}

RetryButtonメソッドを同ボタンのイベントに設定しましょう。このRetryButtonはGoButtonを押した後有効になるのですが、これを押すと落ちている紫の球を削除→紫の球のPrefabを生成することができます。生成されたPrefabは紫の球として設定されるので、繰り返しGoButtonで紫の球を落とす事ができます。

又プレイ画面をはみ出て落ち続ける中RetryButtonを押すのは機能的ではないので、MoveBallクラスでは紫の球がoutAreaタグにぶつかった瞬間RetryButtonを押す処理を行ってます。以下デモ

その他

必須ではないのですが紫の球のPrefabを作成した後、紫の球を削除してPrefabを再配置した方が後々整理しやすくなると思います。又今回Prefabの生成座標は指定していないので、紫の球とPrefab自体のワールド座標は同じにしておきましょう。

次回はギミックを設置します。

コメント

タイトルとURLをコピーしました