スイカゲームっぽい落ち物ゲーを作ってみる。Part2.物体を合体する【Unityゲーム作成】

「簡単にスイカゲームっぽい」落ち物ゲームをUnityで作成する。第2回目です。

はじめに

Part1は下記です。

今回やること

パート1では簡単な画面(枠)を作成し物体を落とすところまで作成しました。

今回は落ちる物体が次々と出現するのと、種類を増やして同じ種類が重なった場合は合体(マージ)するようにしていきます。

実装開始

Project内のAssetsフォルダ内にPrefabsフォルダを作成。前回作成したseedをその中に入れてプレハブ化します。Hierarchy内の元のseedは削除。

Hierarchyで右クリックして「CreateEmpty」を選択し、空オブジェクトを2つ追加します。

オブジェクト名は「GameManager」と「SeedPosition」とします。

スクリプトの作成

まずはGameManagerのスクリプトを下記の様に作成します。Instantiateで物体を生成しています。

using UnityEngine;

public class GameManager : MonoBehaviour
{
    [SerializeField] private GameObject seedPrefab;
    [SerializeField] private Transform seedPosition;

    void Start()
    {
        CreateSeed();
    }

    private void CreateSeed()
    {
        Instantiate(seedPrefab, seedPosition);
    }
}

GameManagerにスクリプトをアタッチして、SeedPrefabとSeedPositionのパラメータをセットします。

SeedPositonの位置を物体の生成位置に変更。

GameManagerスクリプトを下記の様に変更。

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public bool isNext { get; set; }

    [SerializeField] private GameObject seedPrefab;
    [SerializeField] private Transform seedPosition;

    void Start()
    {
        Instance = this;
        isNext = false;
        CreateSeed();
    }
    void Update()
    {
        if (isNext)
        {
            isNext = false;
            Invoke("CreateSeed", 2f);
        }
    }
    private void CreateSeed()
    {
        Instantiate(seedPrefab, seedPosition);
    }
}

スクリプトの簡単な解説

  • isNextがtrueの時、2秒後に物体を生成します。

動作確認

前回作成したseedスクリプトのDrop部分を下記の様に変更。「GameManager.Instance.isNext = true;」を追加しただけです。物体を落としたら2秒後に物体を生成します。

    private void Drop()
    {
        isDrop = true;
        _rb.simulated = true;
        GameManager.Instance.isNext = true;
    }

実行すると下記の様に次々と物体が出現します。

物体の種類を増やす

プレハブ化したseedをseed0に名前を変更して複製。スケールと色を変更します。

同じ手順でスケールと色を変更したものを複数用意します。スケールや色はお好みで。

ランダムに物体を選択

GameManagerスクリプトを下記に変更。「Start部分」と「Update部分」は変わらないので省略してあります。

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public bool isNext { get; set; }

    [SerializeField] private GameObject[] seedPrefab;
    [SerializeField] private Transform seedPosition;

    private void CreateSeed()
    {
        int i = Random.Range(0, seedPrefab.Length - 2);
        Instantiate(seedPrefab[i], seedPosition);
    }
}

パラメータにプレハブをセット

これでランダムに物体が出現します。

物体の合体

全てのプレハブのアクティブ状態のチェックを外し、タグに「seed」をセットします。

seedスクリプトを下記に変更。「Start」、「Update」、「Drop」は変更ないので省略。

using UnityEngine;

public class seed : MonoBehaviour
{
    private Rigidbody2D _rb;

    public bool isMergeFlag = false;
    public bool isDrop = false;
    public int seedNo;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GameObject colobj = collision.gameObject;

        if (colobj.CompareTag("seed"))
        {
            seed colseed = collision.gameObject.GetComponent<seed>();
            if (seedNo == colseed.seedNo && 
                !isMergeFlag && 
                !colseed.isMergeFlag && 
                seedNo < GameManager.Instance.MaxSeedNo - 1) 
            {
                isMergeFlag = true;
                colseed.isMergeFlag = true;
                GameManager.Instance.MergeNext(transform.position, seedNo);
                Destroy(gameObject);
                Destroy(colseed.gameObject);
            }
        }
    }
}

GameManagerスクリプトは下記に変更します。

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }
    public bool isNext { get; set; }
    public int MaxSeedNo { get; private set; }

    [SerializeField] private seed[] seedPrefab;
    [SerializeField] private Transform seedPosition;

    void Start()
    {
        Instance = this;
        isNext = false;
        MaxSeedNo = seedPrefab.Length;
        CreateSeed();
    }
    void Update()
    {
        //省略
    }
    private void CreateSeed()
    {
        int i = Random.Range(0, MaxSeedNo - 2);
        seed seedIns = Instantiate(seedPrefab[i], seedPosition);
        seedIns.seedNo = i;
        seedIns.gameObject.SetActive(true);
    }

    public void MergeNext(Vector3 target,int seedNo)
    {
        seed seedIns = Instantiate(seedPrefab[seedNo + 1], target, Quaternion.identity, seedPosition);
        seedIns.seedNo = seedNo + 1;
        seedIns.isDrop = true;
        seedIns.GetComponent<Rigidbody2D>().simulated = true;
        seedIns.gameObject.SetActive(true);
    }
}

スクリプトが一気に増えましたが、オブジェクトの合体部分は下記の記事が参考になります。基本的な考え方・動きは同じです。

実行すると下記の様な感じに。次々と物体が出現して、同じ物体が触れた時に合体するようになります。

次回はスコアとゲームオーバーを作成していきます。

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