Unity2Dで「1ラインのシンプルなスロットマシン」を作成する、第2回目です。前回の続きでリールの回転数をランダムにするのと、図柄が揃った時の処理を追加していきます。
はじめに
Unityのバージョンは2022.3.14f1です。Part1ではリールを作成しました。
今回はPart1の続きでリール回転数をランダムにするのと、同じ図柄が揃った時の処理を追加していきます。
画像の準備
簡単なスロットマシンの枠として下記の画像を利用します。

リール画像と同じドット絵の設定をInspectorで行った後に、下記のような感じに配置します。

実装開始
スペースキーでリールが回っていたのをボタンに変更。また、揃った時のポイントを表示するUIを追加します。
「UI」→「Legacy」→「Text」と「Button」を追加します。

枠に合わせてボタンとテキストの位置を変更します。

スクリプトの作成
まずはGameManagerスクリプトを下記に変更。一気に追加しましたが、難しいところは特にないです。
using UnityEngine;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public static GameManager instance { get; private set; }
public enum SlotValue { none, sword, key, shield, dia, box, ring, coin }
[SerializeField] private Reel[] reels;
[SerializeField] private Text winText;
private int winPrize;
private void Awake()
{
instance = this;
}
private void Update()
{
if (reels[0]._reelStop && reels[1]._reelStop && reels[2]._reelStop)
{
CheckResult();
winText.text = "Win: " + winPrize;
}
}
public void Spin()
{
if (reels[0]._reelStop && reels[1]._reelStop && reels[2]._reelStop)
RellStart();
}
private void RellStart()
{
int randomNum = Random.Range(40, 68);
for (int i = 0; i < reels.Length; i++)
{
if (randomNum % 4 != 0)
{
randomNum = (randomNum / 4) * 4;
}
reels[i].RellStart(randomNum);
randomNum += Random.Range(4, 28);
}
}
private void CheckResult()
{
if (reels[0]._slotValue == reels[1]._slotValue && reels[0]._slotValue == reels[2]._slotValue)
{
switch (reels[0]._slotValue)
{
case SlotValue.box:
winPrize = 100;
break;
case SlotValue.coin:
winPrize = 200;
break;
case SlotValue.dia:
winPrize = 300;
break;
case SlotValue.key:
winPrize = 400;
break;
case SlotValue.ring:
winPrize = 500;
break;
case SlotValue.shield:
winPrize = 600;
break;
case SlotValue.sword:
winPrize = 700;
break;
}
}
else
{
winPrize = 0;
}
}
}
簡単に説明すると、Update内でリールが止まっているかをチェック。全リールが止まったら同じ図柄が揃っているかをチェックしています。ボタンを押したタイミングでSpin()を呼び出し、RellStartで回転数をランダムに決めています。図柄が真ん中に止まるようにランダム数を4の倍数に調整しています。
Reelスクリプトは下記のように変更。
using System.Collections;
using UnityEngine;
public class Reel : MonoBehaviour
{
[SerializeField] private float ResetPosition;
public GameManager.SlotValue _slotValue;
public bool _reelStop;
private float ReelSpeed;
private Vector2 StartPosition;
private float reelStep = 0.25f;
private void Awake()
{
_slotValue = GameManager.SlotValue.none;
_reelStop = true;
ReelSpeed = 0.05f;
StartPosition = new Vector2(transform.position.x, 3.5f);
}
public void RellStart(int num)
{
StartCoroutine(RellRotate(num));
}
private IEnumerator RellRotate(int num)
{
_reelStop = false;
for (int i = 0; i < num; i++)
{
if (transform.position.y <= ResetPosition)
transform.position = StartPosition;
transform.position = new Vector2(transform.position.x, transform.position.y - reelStep);
yield return new WaitForSeconds(ReelSpeed);
}
Result();
_reelStop = true;
}
private void Result()
{
switch (transform.position.y)
{
case 0:
_slotValue = GameManager.SlotValue.box;
break;
case -1:
_slotValue = GameManager.SlotValue.dia;
break;
case -2:
_slotValue = GameManager.SlotValue.shield;
break;
case -3:
_slotValue = GameManager.SlotValue.key;
break;
case 3:
_slotValue = GameManager.SlotValue.sword;
break;
case 2:
_slotValue = GameManager.SlotValue.coin;
break;
case 1:
_slotValue = GameManager.SlotValue.ring;
break;
}
}
}
止まった位置によって図柄の値をセットしています。
実行すると下記のような感じになります。細かいところで結構直す部分がありますが、とりあえずそれっぽい感じに。

