簡単なカードゲーム作成のPart5を進めていきます。今回は「勝敗の判定」をしていきます。ここまでくると一応ゲームっぽさが出てきます。
はじめに
今回はPart5です。Part1は下記から。
Part1は「仮でカードの生成」を作成、Part2は「カードの配布とカードをクリックして選択」するのを作成、Part3では「カードを場に出す」、「対戦相手のカード配布」を作成、Part4では「対戦相手のカードを自動でランダムに選択」を作成しました。
Part5では「カードの勝敗判定」を実装していきます。
ゲーム作成開始
今回は「自分が選んだカード」と「自動選択された敵のカード」の勝敗判定を実装していきます。
結果表示UI
判定結果(勝ち負け)を真ん中に表示するため、「UI」→「Legacy」→「Text」を追加。
名前はResultにしておきます。サイズや幅を調整し、テキストサイズなども変更して、テキストの中身は消しておきます。
カードの勝敗判定
「Cards」オブジェクトの配下には「自分のカード」、「EmCards」オブジェクトの配下には「敵カード」がある状態です。
「選択カードを比較する」ため、選択したカードの値を保有します。
それぞれのスクリプトに「選択しているカード番号を保管する」変数を追加します。まずは「Cards」を下記のように変更。「intCardNumber」に数値を保管します。
using UnityEngine; public class Cards : MonoBehaviour { public GameObject SelectCard; public Vector3 InitPosition; public int intCardNumber; }
カードを選択するごとに数値を書き換えるため、「CardScript」の「ChoiceCard」を下記のように変更します。
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; int num = int.Parse(this.transform.Find("Text").GetComponent<Text>().text); cards.intCardNumber = num; transform.localPosition = new Vector3(-400, 350, 0); } }
次に、敵の自動で選択したカード番号も保管するよう「Enemy」スクリプトを下記のように変更します。
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Enemy : MonoBehaviour { public int intEnemyCardNumber; List<GameObject> EmCardlist = new List<GameObject>(); public void EnemyCardSelect() { foreach (Transform child in transform) { EmCardlist.Add(child.gameObject); } int r = Random.Range(0, EmCardlist.Count - 1); EmCardlist[r].transform.localPosition = new Vector3(70, -350, 0); intEnemyCardNumber = int.Parse(EmCardlist[r].transform.Find("Text").GetComponent<Text>().text); } }
自分が選択したカード番号は「intCardNumber」、敵のカード番号は「intEnemyCardNumber」に格納されるので、この数値を比較して勝敗の判定をします。
「Operator」を下記に変更。「OpenCard」に敵のカードを自動選択した後に「JudgeCard」という判定処理を追加します。
using UnityEngine; using UnityEngine.UI; public class Operator : MonoBehaviour { public GameObject CardPrefab; public GameObject Cards; public GameObject EmCards; public GameObject Result; private float ad_y_pos = 50.0f; private Enemy enemyobj; private void Start() { // 省略 } void dealCards(int number,float position,GameObject parent,float adpos) { // 省略 } public void OpenCard() { enemyobj.EnemyCardSelect(); JudgeCard(); } private void JudgeCard() { int myCardNm = Cards.GetComponent<Cards>().intCardNumber; int enCardNm = EmCards.GetComponent<Enemy>().intEnemyCardNumber; Text txtResult = Result.GetComponent<Text>(); //1がグー、2がチョキ、3がパー if ((myCardNm - enCardNm + 3) % 3 == 0) { //引き分け txtResult.text = "DRAW"; } else if ((myCardNm - enCardNm + 3) % 3 == 1) { //負け txtResult.text = "LOSE"; } else { //勝ち txtResult.text = "WIN"; } } }
「自分が選択したカード番号」と「敵のカード番号」を取得。判定結果に応じてテキストの内容を変えています。判定方法はじゃんけん(三すくみ)でおなじみの方法です。一つ一つ場合分けする方法もあります。
Operatorスクリプトのパラメータをセットします。
試しに、実行してみます。
自分の場から1枚カード選択、OPENボタンを押す、敵カードが自動で選択されて、結果が表示される。
このように動作すればOKです。とりあえずこれで一連の流れは完成。もちろん、このままでは数字なので画像に変えないとダメですし、バグが沢山ある状態です。