Unity制パズルゲーム「Shima-zu Zero」の作り方: StageManagerでタイル配置 【スタジオしまづ】
アプリ
apps.apple.com解説動画
これからとる
画像ファイル
全体の流れ
- タイルの作成
- Textデータを2次元配列配列に変換
- StageManagerでタイル配置(この記事)
- クリックで十字反転
- ゲームクリアの実装
- コードの整理とまとめ
- 複数ステージの実装
StageManagerでタイル配置
- Textデータから取得した2次元配列を使ってTileオブジェクトを配置
- Tileオブジェクトに情報を渡しておく
- 画面サイズの中央になるように調節
ソースコード
(動画より先に書いたやつなので多少ズレがあります:不具合あればコメントいただけると助かります)
using UnityEngine; public enum TileType { DEATH, ALIVE, } public class TileManager : MonoBehaviour { public TileType type; public Sprite deathSprite; public Sprite aliveSprite; SpriteRenderer spriteRenderer; void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); } public 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(); } 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; 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++) { TileManager tile = Instantiate(tilePrefab); tile.SetType(tileTable[x,y]); Vector2Int position = new Vector2Int(x, y); Vector2 setPosition = (Vector2)position * tileSize - halfSize; setPosition.y *= -1; tile.transform.position = setPosition; } } } void LoadStageFromText() { string[] lines = stageFile.text.Split(new[] {'\n','\r'}, System.StringSplitOptions.RemoveEmptyEntries); int columns = 5; int rows = 5; tileTable = new TileType[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; } } } } 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); } } }