「どうぶつしょうぎ」を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);
    }
}
実行すると下記のように駒が移動します。

スクリプトが増えましたが、ここまでの簡単な流れとしては、初期駒を配置→駒を選択→タイルを表示→タイルを選択→駒を移動する。という感じです。
 
  
  
  
  