簡単なカードゲーム作成の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です。
とりあえず、これで「対戦相手(敵)のカードセット完了」です。