「簡単にスイカゲームっぽい」落ち物ゲームを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); } }
スクリプトが一気に増えましたが、オブジェクトの合体部分は下記の記事が参考になります。基本的な考え方・動きは同じです。
実行すると下記の様な感じに。次々と物体が出現して、同じ物体が触れた時に合体するようになります。
次回はスコアとゲームオーバーを作成していきます。