簡単なカードゲーム作成の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です。とりあえずこれで一連の流れは完成。もちろん、このままでは数字なので画像に変えないとダメですし、バグが沢山ある状態です。
