読者です 読者をやめる 読者になる 読者になる

スマゲ

スマートなゲームづくりを目指して日々精進

Unityでパズドラ風3Matchパズルを作る_その4_演出編3

今回は選択されているピースがわかりやすいように演出を追加してみます。

■前回の内容
Unityでパズドラ風3Matchパズルを作る_その3_演出編2 - スマゲ

■本編の完成メージ
f:id:sanukin39:20170430004839g:plain

■コード確認用リポジトリ
github.com

■環境
Mac OS Sierra 10.12.4
Unity 5.6.0 f3
言語 C#

■実装
ここからはその3の続きです。

■選択されたピースを半透明にする
[Piece.cs]をエディタで開いて、以下のメソッドを追加します

    // ピースの透過を設定する
    public void SetPieceAlpha(float alpha)
    {
        var col = thisImage.color;
        col.a = alpha;
        thisImage.color = col;
    }

その後、[GameManager.cs]を開いて定数を追加とメソッドの編集を行います
・定数の追加

private const float SelectedPieceAlpha = 0.5f;

・メソッドの編集

    // プレイヤーの入力を検知し、ピースを選択状態にする
    private void Idle()
    {
        if (Input.GetMouseButtonDown(0))
        {
            selectedPiece = board.GetNearestPiece(Input.mousePosition);
            selectedPiece.SetPieceAlpha(SelectedPieceAlpha);
            currentState = GameState.PieceMove;
        }
    }

    // プレイヤーがピースを選択しているときの処理、入力終了を検知したら盤面のチェックの状態に移行する
    private void PieceMove()
    {
        if (Input.GetMouseButton(0))
        {
            var piece = board.GetNearestPiece(Input.mousePosition);
            if (piece != selectedPiece)
            {
                board.SwitchPiece(selectedPiece, piece);
            }
        }
        else if (Input.GetMouseButtonUp(0)) {
            selectedPiece.SetPieceAlpha(1f);
            currentState = GameState.MatchCheck;
        }
    }

■選択されたピースを大きく表示する/b>
選択されているピースをわかりやすくするように、ピースの選択時に新しいピースのゲームオブエジェクトを生成し、サイズを調整、指に追随するようにします。
[Board.cs]を開いて以下のように変更する
・pieceWidthのアクセッサを変える

    // public
    public int pieceWidth;

・プレハブのインスタンス生成部分を切り出す

    // ピースのオブジェクトを生成する
    public Piece InstantiatePiece(Vector3 createPos)
    {
        var piece = Instantiate(piecePrefab, createPos, Quaternion.identity).GetComponent<Piece>();
        piece.transform.SetParent(transform);
        return piece;
    }
    // 特定の位置にピースを作成する
    private void CreatePiece(Vector2 position)
    {
        // ピースの位置を求める
        var piecePos = GetPieceWorldPos(position);

        // ピースの生成位置を求める
        var createPos = new Vector2(position.x, height);
        while (pieceCreatePos.Contains(createPos))
        {
            createPos += Vector2.up;
        }

        pieceCreatePos.Add(createPos);
        var pieceCreateWorldPos = GetPieceWorldPos(createPos);

        // ピースを生成、ボードの子オブジェクトにする
        var piece = InstantiatePiece(pieceCreateWorldPos);
        piece.SetSize(pieceWidth);

        // 生成するピースの種類をランダムに決める
        var kind = (PieceKind)UnityEngine.Random.Range(0, Enum.GetNames(typeof(PieceKind)).Length);
        piece.SetKind(kind);

        // 盤面にピースの情報をセットする
        board[(int)position.x, (int)position.y] = piece;

        // アニメーションのセット
        fillPieceAnim.Add(new AnimData(piece.gameObject, piecePos, FillPieceDuration));
    }

[GameManager.cs]を開いて以下のように変更する
・変数の追加

private GameObject selectedPieceObject;

・メソッドの追加

    // ピースを選択する処理
    private void SelectPiece()
    {
        selectedPiece = board.GetNearestPiece(Input.mousePosition);
        var piece = board.InstantiatePiece(Input.mousePosition);
        piece.SetKind(selectedPiece.GetKind());
        piece.SetSize((int)(board.pieceWidth * 1.2f));
        piece.SetPieceAlpha(SelectedPieceAlpha);
        selectedPieceObject = piece.gameObject;

        selectedPiece.SetPieceAlpha(SelectedPieceAlpha);
        currentState = GameState.PieceMove;
    }

・呼び出し部分の編集

    // プレイヤーの入力を検知し、ピースを選択状態にする
    private void Idle()
    {
        if (Input.GetMouseButtonDown(0))
        {
            SelectPiece();
        }
    }

    // プレイヤーがピースを選択しているときの処理、入力終了を検知したら盤面のチェックの状態に移行する
    private void PieceMove()
    {
        if (Input.GetMouseButton(0))
        {
            var piece = board.GetNearestPiece(Input.mousePosition);
            if (piece != selectedPiece)
            {
                board.SwitchPiece(selectedPiece, piece);
            }
            selectedPieceObject.transform.position = Input.mousePosition + Vector3.up * 10;
        }
        else if (Input.GetMouseButtonUp(0)) {
            selectedPiece.SetPieceAlpha(1f);
            Destroy(selectedPieceObject);
            currentState = GameState.MatchCheck;
        }
    }

■実行
f:id:sanukin39:20170430004839g:plain

■その5_演出編
次回はマッチングしているピースが消える演出をつけようと思います。
Unityでパズドラ風3Matchパズルを作る_その5_演出編4 - スマゲ

github.com

■関連リンク
Unityでパズドラ風3Matchパズルを作る_その1_ロジック編 - スマゲ
Unityでパズドラ風3Matchパズルを作る_その2_演出編1 - スマゲ
Unityでパズドラ風3Matchパズルを作る_その3_演出編2 - スマゲ
Unityでパズドラ風3Matchパズルを作る_その5_演出編4 - スマゲ
Unityでパズドラ風3Matchパズルを作る_その6_ステータス表示編 - スマゲ