ユニティーを使用して作成したスイカゲーム風のパズルゲームの作り方のメモです。ゲーム制作の参考にしていただければ嬉しいです。トグルボタンをクリックすると記事が表示されます。小さくて見ずらい画像はクリックで拡大できます。
スイカゲームについて
「スイカゲーム」は、フルーツを使用した「落ち物ゲーム」です。プレイヤーは箱の中にフルーツを落としていきます。数種類のフルーツが用意されていて、同じ種類のフルーツがぶつかると、それが結合してより大きな別のフルーツに変化します。最終的な目標は大きなスイカを作り出すことです。ただし、箱からフルーツがあふれ出してしまうとゲームオーバーとなります。
使用するアセット
必要なアセットは特にありませんが、私はフォルダなどを見やすくするRainbowfolderというアセットを入れています。
壁の配置
2Dobject→Sprite→Squareを生成してコの字型に壁を配置しました。

全ての壁にBoxColider2Dをアタッチしました。

空のオブジェクトを作成して全ての壁を子オブジェクトにまとめました。

フルーツの配置
2Dobject→Sprite→Circleで球体を生成しました。
球体にRigidbody2DとcircleColider2Dをアタッチしました。

Assets→Create→2D→PhysicsMaterial2Dを作成しました。

PhysicsMaterial2Dの設定はこんな感じにしました。

球体のRigidbodyにPhysicsMaterial2Dを設定する項目があるのでアタッチしました。
PhysicsMaterial2Dを設定すると球体がバウンドするようになります。

Fruitsタグを作成して設定しました。

新しくC#スクリプトを作成してprefabにしたフルーツにアタッチします。
using UnityEngine;
public class Fruits : MonoBehaviour
{
public enum TYPE
{
Suika,
Mikan,
Lime,
Grape,
Ringo,
Momo,
}
public TYPE type = TYPE.Suika;
//進化先のフルーツを設定する
[SerializeField] GameObject nextFruits;
public int fruitsNum;
}
inspector画面でフルーツの種類と進化先のフルーツのprefabを設定をします。

private void OnCollisionEnter2D(Collision2D collision)
{
//フルーツにぶつかったとき
if (collision.gameObject.tag == "Fruits")
{
TYPE colType = collision.gameObject.GetComponent<Fruits>().type;
int colNum = collision.gameObject.GetComponent<Fruits>().fruitsNum;
Debug.Log("フルーツ同士がぶつかりました");
if (type == colType)
{
Debug.Log("フルーツのタイプが一致しました");
//最大レベルのフルーツの処理
if (type == TYPE.Suika)
{
Destroy(collision.gameObject);
Destroy(gameObject);
}
//フルーツ番号を比較して大きいほうが処理をする
if (fruitsNum > colNum)
{
//フルーツを消去して、進化したフルーツを生成する
GameObject fruits = Instantiate(nextFruits, transform.position, transform.rotation);
//フルーツの重力の設定
fruits.GetComponent<Rigidbody2D>().gravityScale = 1;
fruits.GetComponent<Fruits>().fruitsNum = fruitsNum;
//消滅する
Destroy(collision.gameObject);
Destroy(gameObject);
}
}
}
}
プレイヤーの配置
2Dobject→Sprite→Squareを生成しました。名前はPlayerにしました。
子オブジェクトに空のオブジェクトを作成名前はSpawnObjectにしました。
ここから球体が生成されるようにします。

inspector画面からSpawnObjectにアイコンを設定するとシーン画面で見えるようになるのでプレイヤーの少し下に配置しました。


//プレイヤーを左右に移動できるようにする
using UnityEngine;
public class Player : MonoBehaviour
{
//移動用変数
float x;
//移動速度
public float speed = 3;
void Update()
{
Move();
}
void Move()
{
x = Input.GetAxisRaw("Horizontal");
if (x > 0)
{
//右に移動
transform.position += new Vector3(speed, 0, 0) * Time.deltaTime;
}
else if (x < 0)
{
//左に移動
transform.position += new Vector3(-speed, 0, 0) * Time.deltaTime;
}
}
}
//フルーツを格納する
[SerializeField] GameObject[] fruits;
//スポーンポイントを格納する
[SerializeField] Transform spownPoint;
//生成したフルーツを一時的に格納する
GameObject fruitsObj;
//連打防止に使用する変数
bool isfall;
//フルーツの番号
int num = 0;
void Start()
{
//1個目のフルーツを生成する
fruitsObj = Instantiate(fruits[0],spownPoint.position,Quaternion.identity,this.transform);
//フルーツに番号を付ける
fruitsObj.GetComponent<Fruits>().fruitsNum = num;
num++;
}
void Update()
{
//スペースキーでフルーツを落とす
if (Input.GetKeyDown(KeyCode.Space))
{
if (!isfall)
{
isfall = true;
StartCoroutine(DropFruits());
}
}
}
IEnumerator DropFruits()
{
fruitsObj.GetComponent<Rigidbody2D>().gravityScale = 1;
//プレイヤーの子オブジェクトから外す
fruitsObj.transform.SetParent(null);
//少し時間を置く
yield return new WaitForSeconds(1);
//次のフルーツをセットする
int f = Random.Range(0, fruits.Length);
fruitsObj = Instantiate(fruits[f], spownPoint.position, Quaternion.identity, this.transform);
//フルーツに番号を付ける
fruitsObj.GetComponent<Fruits>().fruitsNum = num;
num++;
isfall= false;
}