簡単なカードゲームの作成(カイジのEカード風)。Part4.対戦相手のカードをランダム選択|Unityゲーム制作

簡単なカードゲーム作成のPart4を進めていきます。今回は「対戦相手(敵)のカードをランダムに選択」するのを実装していきます。

はじめに

今回は第4回目です。第1回目は下記から。

Part1は「仮でカードの生成」を作成、Part2は「カードの配布とカードをクリックして選択」するのを作成、Part3では「カードを場に出す」、「対戦相手のカード配布」を作成しました。Part4では「対戦相手のカードを自動でランダムに選択」を実装していきます。

ゲーム作成開始

前回は「相手(敵)のカードをセットする」ところまで実装しました。今回は敵カードが「ランダムで選択される」のを実装していきます。

カードをランダムに選ぶ

現在の開始画面は下記のような感じです。

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

実験的に実装

まずは新規でスクリプトを追加します。名前は「Enemy」としておきます。

追加したスクリプトを下記のように変更。「敵陣地にあるカードをリスト化」、「ランダムにカードを選んで位置を変更(場に出す)」という感じですね。まずはStart内に記述します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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);
}
}
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); } }
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に変更します。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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);
}
}
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); } }
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を実行するようにします。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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();
}
}
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(); } }
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です。

タイトルとURLをコピーしました