簡単なカードゲームの作成(カイジのEカード風)。Part3.選択カード決定と対戦相手のカードセット|Unityゲーム制作

簡単なカードゲーム作成のPart3を進めていきます。今回は「選択したカードの決定して場に出す」のと「対戦相手のカードのセット」をしていきます。

はじめに

今回は第3回目です。第1回目は下記から。

Part1は仮でカードの生成を作成、Part2はカードの配布とカードをクリックして選択するのを実装しました。Part3では「カードを場に出す」、「対戦相手のカード配布」を実装していきます。

ゲーム作成開始

前回は「カードを複数枚セット」するところまで行ったので、その続きから進めていきます。まずは「選択したカードの決定」するからです。

選択カードの決定

カードゲームでは複数のカードから1枚選ぶことになります。そして、カードを選択した時の動作として「カードを場に出す」というのがあります。下図のような感じです。

選択したカードの位置を変更するのでCardScriptのChoiceCard()関数の中でlocalPositionをセットします。下記のようにスクリプトを変更します。

using UnityEngine;
using UnityEngine.UI;

public class CardScript : MonoBehaviour
{
    public void ChoiceCard()
    {
        string num = this.transform.Find("Text").GetComponent<Text>().text;
        transform.localPosition = new Vector3(-400, 250, 0);
    }
}

これで移動するようになりますが、カードを選択すると上にドンドン重なってきます。

これを回避する方法はいくつかありますが、今回はベーシックに「他のカードを選択したら、既に場に出ているカードを元の位置に戻す」を実装していきます。

カードを1枚だけ場に出す

まずは新しいスクリプトを追加します。名前を「Cards」にしてCardsオブジェクトに追加します。

新しく追加したCardsスクリプトの中は下記に変更します。場に出ているカード情報を保管します。

using UnityEngine;

public class Cards : MonoBehaviour
{
    public GameObject SelectCard;
    public Vector3 InitPosition;
}

次にCardScriptを下記のように変更します。カード選択時に「場にカードがあれば元の位置に戻す」、「選択したカード情報を場に出して変数に入れる」です。工夫も何もないべたべた書きです。

using UnityEngine;
using UnityEngine.UI;

public class CardScript : MonoBehaviour
{
    private Cards cards;

    private void Start()
    {
        cards = transform.parent.gameObject.GetComponent<Cards>();
    }
    public void ChoiceCard()
    {
        if (cards.SelectCard != null)
            cards.SelectCard.GetComponent<Transform>().localPosition = cards.InitPosition;

        cards.SelectCard = this.gameObject;
        cards.InitPosition = this.transform.localPosition;

        string num = this.transform.Find("Text").GetComponent<Text>().text;
        transform.localPosition = new Vector3(-400, 250, 0);
    }
}

実行してみて、下記のように場に1枚だけカードが出ればOKです。

相手のカード作成

次に相手(敵)のカードを作っていきます。下図の赤枠の位置が相手のカードが並ぶ場所です。

まずはEmCardsという名前でオブジェクトを作成。相手カードの親オブジェクトです。

次にOperatorが相手カードを配るので、Operatorスクリプトを変更します。

EmCardsの変数を追加してパラメータに自分か相手かのオブジェクトを追加。この辺もとりあえずベタ書き。

using UnityEngine;
using UnityEngine.UI;

public class Operator : MonoBehaviour
{
    public GameObject CardPrefab;
    public GameObject Cards;
    public GameObject EmCards;

    private float ad_y_pos = 50.0f;

    private void Start()
    {
        // Player
        dealCards(1, -500, Cards, ad_y_pos);
        dealCards(2, -250, Cards, ad_y_pos);
        dealCards(2, 0, Cards, ad_y_pos);
        dealCards(2, 250, Cards, ad_y_pos);
        dealCards(3, 500, Cards, ad_y_pos);

        // Enemy
        dealCards(1, -500, EmCards, -ad_y_pos);
        dealCards(2, -250, EmCards, -ad_y_pos);
        dealCards(2, 0, EmCards, -ad_y_pos);
        dealCards(2, 250, EmCards, -ad_y_pos);
        dealCards(3, 500, EmCards, -ad_y_pos);

    }

    void dealCards(int number,float position,GameObject parent,float adpos)
    {
        GameObject objCard = (GameObject)Instantiate(CardPrefab);
        objCard.transform.SetParent(parent.transform, false);
        objCard.transform.Find("Text").GetComponent<Text>().text = number.ToString();
        objCard.transform.localPosition = new Vector3(position, adpos, 0);
    }
}

OperatorオブジェクトのEmCards変数にEmCardsオブジェクトをセットします。

動かしてみて下記のようになればOKです。

とりあえず、これで「対戦相手(敵)のカードセット完了」です。

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