Unity|どうぶつ将棋の作り方。Part3.駒を移動する

「どうぶつしょうぎ」を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);
    }
}

実行すると下記のように駒が移動します。

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

タイトルとURLをコピーしました