Unityゲーム開発スタジオ スタジオしまづ

初心者向けUnity講座・ 統計・機械学習関係についてつらつらと

Unity制パズルゲーム「Shima-zu Zero」の作り方:クリックで十字反転【スタジオしまづ】

アプリ

play.google.com

Shima-zu Zero(しまーづゼロ)

Shima-zu Zero(しまーづゼロ)

  • Tsunehiko Shimazu
  • Games
  • Free
apps.apple.com

解説動画

これからとる

全体の流れ

  • タイルの作成
  • Textデータを2次元配列配列に変換
  • StageManagerでタイル配置
  • クリックで十字反転(この記事)
  • ゲームクリアの実装
  • コードの整理とまとめ
  • 複数ステージの実装

クリックで十字反転

  • クリックしたらStageManagerの関数を実行できるようにする
  • StageManagerが全てのタイルを管理する変数を作る
  • クリックしたタイルの位置を使って十字に反転させる

ソースコード

(動画より先に書いたやつなので多少ズレがあります:不具合あればコメントいただけると助かります)

using UnityEngine;


public enum TileType
{
    DEATH,
    ALIVE,
}

public class TileManager : MonoBehaviour
{
    public TileType type;
    public Sprite deathSprite;
    public Sprite aliveSprite;

    SpriteRenderer spriteRenderer;

    StageManager stageManager;
    Vector2Int intPosition;

    void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();

    }

    public void Init(TileType tileType, Vector2Int position, StageManager stageManager)
    {
        intPosition = position;
        this.stageManager = stageManager;
        SetType(tileType);
    }

    void SetType(TileType tileType)
    {
        type = tileType;
        SetImage(tileType);
    }

    void SetImage(TileType tileType)
    {
        if (type == TileType.DEATH)
        {
            spriteRenderer.sprite = deathSprite;
        }
        else if (type == TileType.ALIVE)
        {
            spriteRenderer.sprite = aliveSprite;
        }
    }

    public void OnTile()
    {
        RecerseTile();
        stageManager.ClickedTile(intPosition);
    }

    public void RecerseTile()
    {

        if (type == TileType.DEATH)
        {
            SetType(TileType.ALIVE);
        }
        else if (type == TileType.ALIVE)
        {
            SetType(TileType.DEATH);
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class StageManager : MonoBehaviour
{
    public TextAsset stageFile;
    TileType[,] tileTable;
    TileManager[,] tileTableObj;

    public TileManager tilePrefab;
    void Start()
    {
        LoadStageFromText();
        DebugTable();
        // Instantiate(tilePrefab);
        CreateStage();
    }

    void CreateStage()
    {
        Vector2 halfSize;
        float tileSize = tilePrefab.GetComponent<SpriteRenderer>().bounds.size.x;
        halfSize.x = tileSize * (tileTable.GetLength(0) / 2);
        halfSize.y = tileSize * (tileTable.GetLength(1) / 2);

        for (int y = 0; y < tileTable.GetLength(1); y++)
        {
            for (int x = 0; x < tileTable.GetLength(0); x++)
            {
                Vector2Int position = new Vector2Int(x, y);
                TileManager tile = Instantiate(tilePrefab);
                tile.Init(tileTable[x,y], position, this);
                Vector2 setPosition = (Vector2)position * tileSize - halfSize;
                setPosition.y *= -1;
                tile.transform.position = setPosition;
                tileTableObj[x, y] = tile;
            }
        }
    }

    void LoadStageFromText()
    {
        string[] lines = stageFile.text.Split(new[] {'\n','\r'}, System.StringSplitOptions.RemoveEmptyEntries);
        int columns = 5;
        int rows = 5;
        tileTable = new TileType[columns, rows];
        tileTableObj = new TileManager[columns, rows];
        for (int y = 0; y<rows; y++)
        {
            string[] values = lines[y].Split(new[] {','});
            for (int x = 0; x < columns; x++)
            {
                if (values[x] == "0")
                {
                    tileTable[x, y] = TileType.DEATH;
                }
                if (values[x] == "1")
                {
                    tileTable[x, y] = TileType.ALIVE;
                }
            }
        }
    }

    public void ClickedTile(Vector2Int center)
    {
        Debug.Log("ClickedTile");
        ReverseTiles(center);
    }

    void ReverseTiles(Vector2Int center)
    {
        Vector2Int[] around =
        {
            center + Vector2Int.up,
            center + Vector2Int.down,
            center + Vector2Int.right,
            center + Vector2Int.left,
        };

        foreach (Vector2Int position in around)
        {
            if (position.x < 0 || tileTableObj.GetLength(0) <= position.x)
            {
                continue;
            }
            if (position.y < 0 || tileTableObj.GetLength(1) <= position.y)
            {
                continue;
            }
            tileTableObj[position.x, position.y].RecerseTile();
        }

    }

    void DebugTable()
    {
        for (int y = 0; y < 5; y++)
        {
            string debugText = "";
            for (int x = 0; x < 5; x++)
            {
                debugText += tileTable[x, y] + ",";
            }
            Debug.Log(debugText);
        }
    }
}

スタジオしまづの関連動画

d35e.uscreen.io