「並び替えの簡単なパズルゲーム(ソートゲーム)」をUnityで作成してみます。
ミニゲーム的なチュートリアルで、基本的なゲーム部分だけを作成してみます。できるだけ簡単に実装していきます。
はじめに
今回作成するのは、「瓶の中にボールが入っている」、「ボールを動かして同じ色でそろえる」簡単なパズルゲームです。GooglePlayで検索すると下記のように沢山ヒットするゲームです。動作や見た目などはそれぞれ違いますが、基本的なゲーム部分を作成していきます。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211000e.png)
Unityのバージョン
「Unity 2022.3.14f1」バージョンで作成しています。
UnityHubから「新しいプロジェクト」を選択、テンプレートは「2D」を選択、プロジェクト名は「SortGame」としています。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211001.png)
作成開始
第1回目は「ボールの生成」と「仮で動かす(位置の変更)」まで実装していきます。
瓶とボールを作成
Hierarchyで右クリック、「CreateEmpty」を追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211002.png)
名前をBottleに変更し、配下に「2DObject」→「Sprites」→「Square」を追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211003.png)
名前を「BottleColor」に変更して、ScaleとColorを変更。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211004.png)
さらに「CreateEmpty」で空オブジェクトを追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211005.png)
名前をBallsにして、Balls配下に「2DObject」→「Sprites」→「Circle」を追加。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211006.png)
名前をBallに変更してPositionを変更、Layerを変更して前に表示されるようにします。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211007.png)
Ballをプレハブ化して名前をBall_REDに変更。色を変更して、Tagを作成してREDにします。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211008.png)
スクリプトの作成
ボールを生成するスクリプトを作成します。スクリプト名はBottleとし、Instantiateでボールを生成。
using UnityEngine; public class Bottle : MonoBehaviour { [SerializeField] private GameObject ballPrefab; [SerializeField] private Transform balls; void Start() { GameObject ball = Instantiate(ballPrefab, balls); ball.transform.position = new Vector3(0, -1.5f); } }
Bottleにアタッチして、パラメータをセット。実行するとBallsの配下にボールが生成されます。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211010.png)
下記のようにスクリプトを変更すると複数個ボールの生成ができます。(縦に並びます)
using UnityEngine; public class Bottle : MonoBehaviour { [SerializeField] private GameObject[] ballPrefab; [SerializeField] private Transform balls; void Start() { for (int i = 0; i < ballPrefab.Length; i++) { GameObject ball = Instantiate(ballPrefab[i], balls); ball.transform.position = new Vector3(0, -1.5f + i); } } }
3つボールを生成する場合は下記のような感じ。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211012.png)
ボールの生成は仮でこんな感じ。
ボールの移動
次にボールを移動してみます。まずはBottleを配下ごとコピーして瓶を2本にします。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211013.png)
2本目の瓶はPositionを変更し、Ballは無しにします。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211014.png)
動作確認のため、スクリプトを仮で下記に変更します。Bottle内のボールをBottle(1)に移動します。
using UnityEngine; public class Bottle : MonoBehaviour { [SerializeField] private GameObject[] ballPrefab; [SerializeField] private Transform balls; [Header("--Debug--")] [SerializeField] Bottle bottleRef; [Header("--Debug--")] [SerializeField] private bool isBottle; private GameObject ball; void Start() { for (int i = 0; i < ballPrefab.Length; i++) { ball = Instantiate(ballPrefab[i], balls); ball.transform.position = new Vector3(0, -1.5f + i); } } void Update() { if (Input.GetKeyUp(KeyCode.Space) && isBottle == true) { ball.transform.parent = bottleRef.balls; ball.transform.position = new Vector3(2.0f, -1.5f); } } }
各パラメータは下記のようにします。移動元のBottleにはボールを1個だけセット、isBottleにチェックを入れいます。移動先のBottle(1)はボール無し、isBottleのチェックは無しとします。
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211016.png)
実行して、スペースキーを押したら下記のように隣の瓶にボールが移動すればOK
![](https://nosystemnolife.com/wp-content/uploads/2023/12/20231211026.gif)
第1回目はここまで。ボールを生成、ボールの移動を行いましたが、まだ動作確認の仮段階です。次回の2回目で整理していきます。