Unity制パズルゲーム「Shima-zu Zero」の作り方:クリックで十字反転【スタジオしまづ】
アプリ
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); } } }