「どうぶつしょうぎ」をUnityで作成する。第3回目です。
はじめに
Part1は下記です。
今回やること
パート1では駒の初期配置、パート2では移動先候補の表示を行いました。
パート3の今回は「駒の移動」を実装していきます。
実装開始
移動先タイルの制御追加
前回、移動先の候補を表示しました。この状態だと、盤の外や自分の他の駒の場所も移動先に表示されるので、制御した後に駒の移動を実装します。
まずはGameManagerスクリプトに下記を追加します。関係する場所のみ抜き出してあるので、該当場所に追加します。boardpieceには盤内の駒オブジェクトを配列にして入れます。OnBoardCheckはパラメータの座標が盤内かチェックをします。GetBoardPieceは指定座標の駒オブジェクトを返します。
public class GameManager : MonoBehaviour { private GameObject[,] boardpiece; void Start() { boardpiece = new GameObject[Const.boardRow, Const.boardCol]; } private void CreateInitPiece(string player, string name, int x, int y) { boardpiece[x, y] = obj; } public bool OnBoardCheck(int x, int y) { if (x < 0 || y < 0 || x >= Const.boardRow || y >= Const.boardCol) return false; return true; } public GameObject GetBoardPiece(int x, int y) { return boardpiece[x, y]; } }
Pieceスクリプトには下記を追加します。ownershipに駒の所有者(森か空か)を入れます。
using UnityEngine; public class Piece : MonoBehaviour { public string ownership { get; private set; } public void InitPiece(string player, string name) { this.name = name; this.ownership = player; } }
最後にTileManagerのタイル生成処理にチェック処理を追加します。盤外にはタイルを出さない、移動先に駒がない、もしくは相手の駒ならタイルを生成します。
public class TileManager : MonoBehaviour { private void TileSpawn(int x,int y) { // 盤内かチェック if (!GameManager.instance.OnBoardCheck(x, y)) return; GameObject piece = GameManager.instance.GetBoardPiece(x, y); if (piece == null) { Instantiate(_tile, new Vector3(x, y), Quaternion.identity, this.transform); } else if (piece.GetComponent<Piece>().ownership != GameManager.instance.currentPlayer) { Instantiate(_tile, new Vector3(x, y), Quaternion.identity, this.transform); } }
実行して、右下のキリンを選択したときに、上にだけタイルが表示されたらOKです。
駒の移動
選択したタイルの位置に駒を移動します。tileプレハブにBoxCollider2DとTileスクリプトをアタッチします。
GameManagerスクリプトに下記を追加します。selectPieceに選択した駒オブジェクトを格納できるようにします。
using UnityEngine; public class GameManager : MonoBehaviour { public GameObject selectPiece { get; private set; } void Start() { selectPiece = null; } public void SetSelectPiece(GameObject piece) { selectPiece = piece; } }
Pieceスクリプトに下記を追加します。マウスを押した時に選択した駒オブジェクトを保管、MovePieceで指定した位置に駒を移動します。
using UnityEngine; public class Piece : MonoBehaviour { private void OnMouseUp() { //選択した駒 GameManager.instance.SetSelectPiece(this.gameObject); } public void MovePiece(Vector2 toPos) { transform.position = toPos; } }
Tileスクリプトを下記に変更します。マウスをクリックしたら、選択したタイルの位置に駒を移動するようにします。
using UnityEngine; public class Tile : MonoBehaviour { private void OnMouseUp() { //駒をタイルの位置に移動 GameObject obj = GameManager.instance.selectPiece; obj.GetComponent<Piece>().MovePiece(transform.position); } }
実行すると下記のように駒が移動します。
スクリプトが増えましたが、ここまでの簡単な流れとしては、初期駒を配置→駒を選択→タイルを表示→タイルを選択→駒を移動する。という感じです。