簡単なカードゲーム作成のPart4を進めていきます。今回は「対戦相手(敵)のカードをランダムに選択」するのを実装していきます。
はじめに
今回は第4回目です。第1回目は下記から。
Part1は「仮でカードの生成」を作成、Part2は「カードの配布とカードをクリックして選択」するのを作成、Part3では「カードを場に出す」、「対戦相手のカード配布」を作成しました。Part4では「対戦相手のカードを自動でランダムに選択」を実装していきます。
ゲーム作成開始
前回は「相手(敵)のカードをセットする」ところまで実装しました。今回は敵カードが「ランダムで選択される」のを実装していきます。
カードをランダムに選ぶ
現在の開始画面は下記のような感じです。
今回、実装するのは上に配置された敵カードから「ランダムに1枚選択して場に出す」というものです。
実験的に実装
まずは新規でスクリプトを追加します。名前は「Enemy」としておきます。
追加したスクリプトを下記のように変更。「敵陣地にあるカードをリスト化」、「ランダムにカードを選んで位置を変更(場に出す)」という感じですね。まずはStart内に記述します。
using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { List<GameObject> EmCardlist = new List<GameObject>(); void Start() { foreach (Transform child in transform) { EmCardlist.Add(child.gameObject); } int r = Random.Range(0, EmCardlist.Count - 1); EmCardlist[r].transform.localPosition = new Vector3(70, -250, 0); } }
EmCardsに追加して実行してみます。
ランダムにカードが選ばれて、場に出ていればOK。
補足:スクリプトの実行順序
今回のように動作確認のためStartで実行した場合、うまく動かないことがあります。
理由は簡単で、EnemyスクリプトのStartで「別スクリプトのStartで生成」したものを利用しているからです。この場合、「カードを生成」した後に、「カードを選択」を実行するように順番を指定する必要があります。
「Edit」から「Project Settings…」を選択します。
「Script Execution Order」を選択。「+」からスクリプトを追加します。数値が低い方から実行されるので、「カード生成(Operator)」→「カード選択(Enemy)」となるようにセットしておきます。
実行してみて「カードがランダムに自動で選択」されていたらOKです。
ボタンを押したらに変更
次に、この「ランダムにカードが選ばれる」というのを、Startではなく、ボタンを押してから動くように変更します。StartをEnemyCardSelectに変更します。
using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { 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, -250, 0); } }
「Operator」スクリプトに「OpenCard」を追加します。この中でEnemyCardSelectを実行するようにします。
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 Enemy enemyobj; private void Start() { // Player // 省略 // Enemy // 省略 enemyobj = EmCards.GetComponent<Enemy>(); } void dealCards(int number,float position,GameObject parent,float adpos) { // 省略 } public void OpenCard() { enemyobj.EnemyCardSelect(); } }
「OpenCard」はOPENボタンのクリック時の動作に追加します。
これで一回実行してみます。OPENボタンを押した時に「敵のカードが自動で選択され、場に提出」されればOKです。