Unityで3Dミニゲームを作る #6 クリア条件を作る①

投稿者: | 2019-12-05

岩だけでなくコインも流して、コインを10枚すべて取れたらクリアということにしてみます。

スタンダードアセットにちょうどよいコインのオブジェクトがあるので使います。

これをコピーしてわかりやすく他のフォルダに移して編集します。

コインを選択してインスペクタで、Open Prefabをクリックします。

リジッドボディを追加して落下しないようにUse Gravityのチェックを外します。そして、コライダーのConvexとIs Triggerにチェックを入れます。

Is Triggerをチェックすると、他のオブジェクトと衝突はしませんが、他のオブジェクトと重なったことをスクリプトで知ることができるようになります。

また、コインにスクリプトを付けます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class coinScript : MonoBehaviour
{
    public static int NumOfCoin;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (transform.position.z > 6f)
        {
            if (NumOfCoin > 9) // 10枚目で終了
            {
                SceneManager.LoadScene("flyingCube");
            }
            else {
                Destroy(gameObject);
            }
        }
    }
}

生成したコインの枚数をカウントしていって、コインがプレイヤーを通り過ぎたときに、そのコインが10枚目ならゲームを終了するようにし、9枚目までなら通り過ぎたコインを破壊します。
コインの枚数をPlayerに付けたスクリプトで操作できるように、public にしています。また、個々のコインオブジェクトとともにそれに付いているスクリプトも破壊されてしまうので、コインの枚数の合計を覚えておくために、static にしています。

さらに、Playerにコインを拾わせるときに、コインにタグが付いていると便利です。

コインのインスペクタのTagのプルダウンメニューをクリックして、Add Tag…を選択します。

新しいタグを登録するためにプラスのマークをクリックします。

タグ名を入力して Saveをクリックします。

もう一度コインを選択して、インスペクタのTagプルダウンメニューから今作ったタグを選択します。

コインを取得したときに、他の音と重ならないように音を流したいので、PlayerにもうひとつAudioSouceを追加します。

Playerのスクリプトを編集します。

using UnityEngine.UI;

//---
// 宣言
Rigidbody rb_coin;
public Rigidbody coin;
public GameObject coinParticle; // コインを拾ったときのエフェクト
int coins; // 取得したコイン
public Text text; // 取得したコインの枚数を表示するテキストオブジェクト

//---
// void Start()
StartCoroutine("Coin"); // コルーチンを開始
coinScript.NumOfCoin = 0; // 投げたコインの枚数を初期化
coins = 0; // 取得したコインの枚数を初期化
text.text = coins.ToString(); // 取得したコインの枚数を表示

//---
private IEnumerator Coin() // Ballを生成して飛ばすコルーチン
    {
        while (coinScript.NumOfCoin < 10)
        {
            yield return new WaitForSeconds(Random.Range(2f, 6f)); // 2~6秒の間を置く
            // ランダムの位置にコインオブジェクトを生成する
            rb_coin = Instantiate(coin, new Vector3(Random.Range(-9f, 9f), Random.Range(-5f, 5.5f), -30f), Quaternion.Euler(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360))) as Rigidbody;
            rb_coin.AddForce(Vector3.forward * 5f, ForceMode.Impulse); // コインをカメラに向けて飛ばす
            rb_coin.AddTorque(rb_coin.transform.right * 200f, ForceMode.Force); // コインを回転させる

            coinScript.NumOfCoin++; // 生成したコインの数に 1を足す
            
        }
    }

//---
    private void OnTriggerEnter(Collider other) // Playerが他のオブジェクトと重なったとき
    {
        if (other.CompareTag("Coin")) // 重なったオブジェクトのタグが「Coin」のとき
        {
            playerAudio[2].clip = audio[3];
            playerAudio[2].Play(); // コインを拾ったときの音を出す
            Instantiate(coinParticle, transform.position, transform.rotation); // パーティクルを出す
            Destroy(other.gameObject); // コインを破壊

            coins++; // 取得したコインの枚数に 1を足す
            text.text = coins.ToString(); // 取得したコインの枚数を表示
        }
    }

PlayerScriptにコインとパーティクルのプレハブをアタッチします。

パーティクルは、アセットストアに無料のものがたくさんあります。

では、取得したコインの枚数を表示するためのテキストオブジェクトを作ります。

取得したコインの枚数をテキスト表示

ヒエラルキーウィンドウで、Textオブジェクトを新規作成します。

親オブジェクトのCanvasも付いてきます。

Textオブジェクトを選択してインスペクタから設定を変更します。

左上の四角い図からテキストの表示位置を設定します。Pos X(Y,Z)で微調整できます。
TextコンポーネントのTextで表示する文字列を設定できますが、今回はスクリプトで操作しています。
文字列が長いときに折り返されたり隠れたりしないように、念のためHorizontal OverflowとVertical OverflowをOverflowに設定しました。

ゲームウィンドウで表示を確認できます。

TextオブジェクトもPlayerScriptにアタッチします。

少しゲームらしくなりました。

10枚目以降のコインが通り過ぎるとシーンが再ロードされます。
10枚目のコインが破壊されたときに、取得コインが10枚ならクリアにしようと思います。

コメントを残す

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