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

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


