簡単なカードゲーム作成の第4回目を進めていきます。今回は「対戦相手(敵)のカードをランダムに選択」するのを進めていきます。
はじめに
今回は第4回目です。第1回目は下記から。
ゲーム作成開始
前回は「相手(敵)のカードをセットする」ところまで実装しました。今回は敵カードが「ランダムで選択される」のを実装していきます。
カードをランダムに選ぶ
現在の開始画面は下記のような感じです。

「OPEN」の位置をもっと右にずらすので、位置Xを800に変更しておきます。

今回、実装するイメージとしては上に配置された敵カードから「ランダムに1枚選択して場に出す」というものです。

実験的にスタートで実装
まずは敵カードを一括で管理する「Emcardsオブジェクト」に新規でスクリプトを追加します。名前は「Enemy」としておきます。

追加したスクリプトを下記のように変更。「敵陣地にあるカードをリスト化」、「ランダムでカードを選んで位置を変更(場に出す)」という感じですね。まずはStart内に実装します。
using System.Collections; 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(400, -400, 0); } }
これで一度実行。ランダムにカードが選ばれて、場に出ていればOK。
補足:スクリプトの実行順序
今回のように動作確認でStartで実行してみると、うまく動かないことがあります。
理由は簡単で、敵カードを「別スクリプトのStartで生成」しているからです。この場合、「カード生成のスクリプト」を実行した後に、「カード選択のスクリプト」を実行するように順番を指定してあげる必要があります。
「編集」から「プロジェクトの設定」を選びます。

「スクリプト実行順序」を選択。「+」からスクリプトを追加します。数値が低い方から実行されるので、「カード生成」→「カード選択」となるようにセットしておきます。

これで実行してみて「カードがランダムに自動で選択」されていたらOK。
ボタンを押したらに変更
次に、この「ランダムにカードが選ばれる」というのを、Startではなく、ボタンを押してから動くように変更します。StartをEnemyCardSelectに変更。中身はそのまま。

「Operator」のスクリプトに「OpenCard」という新規の関数を追加。この中でEnemyCardSelectを実行するようにします。

この「OpenCard」は「OPENオブジェクト」のクリック時の動作に追加。

これで一回実行してみます。OPENボタンを押した時に「敵のカードが自動で選択され、場に提出」されればOK。