top of page

ファイブボックス Unityカリキュラムのご紹介 Step05「クイズアプリ」

ファイブボックスではUntiyの初心者から上級者まで、会員様の習得度に応じたカリキュラムをご用意しています。

前回の記事では「フィッシングゲーム」の作り方のカリキュラムをご紹介しました。今回は「クイズアプリ」の作り方のカリキュラム。GooglePlayStore や AppStore に登録済みですので、もしよければご参考にしてください。(AppStoreは World Quiz Master で検索してください)


ファイブボックスのクイズアプリ

ではこのアプリ作成カリキュラムの「フェーズ2」の学習資料をちょっとだけご紹介いたします。


ファイブボックス UnityカリキュラムStep6「クイズアプリの作り方」

フェーズ2「問題と答えの配列作成」


このフェーズでは事前に用意した出題用のテキストを取り込み、配列に格納、さらに問題を用意するまでの一連の流れを作成します。


2-1,素材の準備

2-1-1,素材の取り込み

事前に用意したテキストファイル、及び国旗とマップの画像ファイルを取り込みます。Unityメニューの Assets > import Package > Custom Package から指定された素材を取り込みます。

取り込んだAssetを以下のフォルダに配置します。Flagフォルダ、mapフォルダ ⇒ 04_Images フォルダCountry.txt ⇒ Resources フォルダを新たに作成しその中に格納

Resoucesフォルダに素材を格納

2-2,質問と答え

2-1-1,素材の確認

[2-1-1] で取り込んだ Country.txt を確認します。下のように、1行ごとに世界の国々の国名、クイズ、クイズの答え、ダミーの答えなどが記載されたデータとなります。

列数

内容

1列目

国名

2列目

首都名

3列目

首都当てクイズのダミーの答え1

4列目

首都当てクイズのダミーの答え2

5列目

首都当てクイズのダミーの答え3

6列目

国当てクイズのダミーの答え1

7列目

国当てクイズのダミーの答え2

8列目

国当てクイズのダミーの答え3

9列目

似ている国旗の国No(国旗クイズ選択肢に活用)

10列目

国の所在エリア(Mapクイズに活用)

11列目

設問1(雑学問題に活用)

12列目

設問2(雑学問題に活用)

取り込んだデータのイメージ画像

取り込んだ素材は Aseets 内に用意した 「Resources」という名前のフォルダに格納しました。Unityからテキストファイルを読み込んで使用するためには、この名前のフォルダが必須となります。

素材データの配置

1つ目のクイズのテーマは国旗あてクイズです。国旗あてクイズで使用する画像素材が、取得した 「flag」 フォルダにあることを確認します。

国旗画像の配置
2-1-2,テキストデータ読込

このフェーズでは用意したテキストデータを取り込んで、配列として保管します。まずは、Aseets 内に用意した 「02_Scripts」 というフォルダ内に [GameManager] というスクリプトファイルを作成します。

GameManagarクラスを作成

作成した [GameManager] は、「MainCamera」にアタッチしておきます。ここで行う処理の流れは以下の通りです。

❶ [Country.txt] 内の全テキストデータを全部取り込む ❷ 取り込んだテキスト1行1行を1次配列として取り込む ⇒ 193個の要素を含む1次配列 ❸ テキストの行数と列数を取得して最終的に入れ込む2次配列のサイズを指定 ❹ ❷で取り込んだ1行1行を、for文を使ってタブ区切りで2次配列に変換する

ここで使用する変数を確認します。

変数名

アクセス

説明

rowLen

int

static public

テキスト内の行数を取得する変数

colLen

int

static public

テキスト内の列数を取得する変数

続いて使用する配列を確認します。

配列名

アクセス

説明

textSauce[ ]

string

private

テキストの加工前の一行を入れる変数

country[ , ]

string

static public

加工後のデータを複数入れる2次元配列

上で確認した変数、配列を宣言します。


GameManager.cs

static public int rowLen;                   //country の行数を取得する変数
static public int colLen;                   //country の列数を取得する変数
string[] textSauce;           //テキストの加工前の一行を入れる変数
static public string[,] country;     //加工後のデータを複数入れる2次元配列 

ここからデータ取り込みの関数 Initialization() を作成していきます。この関数は、「継承」という機能を活用し、別のクラスから発動させますので、アクセス修飾子に public を指定しておきます。

GameManager.cs

public void Initialization()
{
	//Resourcesフォルダから対象のテキストファイルを取得
    TextAsset textasset = Resources.Load("Country", typeof(TextAsset)) as TextAsset;
    //string型の変数を用意して、上で取得したテキスト全体を入れる
    string TextLines = textasset.text;
    // Splitで一行づつを代入した1次配列を作成(改行で分けるので1行の文字列)
    textSauce = TextLines.Split('\n');
    //行数と列数を取得
    colLen = textSauce[0].Split('\t').Length; //タブ区切りで分けられたブロック数⇒9
    rowLen = textSauce.Length;    //データ数⇒193    
    country = new string[rowLen, colLen];  //2次配列を定義 [193,9]
    //以下の処理を行数分(国数分)だけ繰り返す
    for (int i = 0; i < rowLen; i++)
    {
        //textMessageをタブごとに分けたものを一時的にtempに代入
        //temp[0]⇒国名、temp[1]⇒首都・・・
        string[] temp = textSauce[i].Split('\t');   
        //以下の処理を列数分(項目数)だけ繰り返す
        for (int n = 0; n < colLen; n++)
        {
            //2次配列countryにタブごとに分けたtempを代入していく
            country[i, n] = temp[n];
        }
    }
}

作成した関数を Start関数 内で起動させます。

GameManager.cs

void Start()
{
    Initialization();
}

実際に起動させてみましょう。エラーが無く起動すれば正しく読み込まれているはずですが、結果が見えないとわかりにくいですよね。


2-1-3,配列のデータ確認

続いて配列に登録されたデータを確認してみたいと思います。読み込んだときと同じように for()文 のネストで、全要素を出力することが出来るのですが、ここでは foreach()文 を使って要素を取得してみます。新たな Public関数、ArrayCheck() を作成し、配列 textSauce[ ] のデータを取得します。

GameManager.cs

public void ArrayCheck()
{
    foreach (string a in textSauce)
    {
        Debug.Log(a);
    }
}

作成した関数を Start() 関数内で発動します。

GameManager.cs

void Start()
{
    Initialization();   //記述済み
    ArrayCheck();       //配列内の要素取得
}

以下のように、配列:textSource[] 内の要素がすべて表示されればOKです。

foreach()

foreach()for()文 と似た繰り返し文ですが、配列Listなどの要素にアクセスする場合に使うことができて、for文と比べて簡潔に記述することができますforeach() 文 の記述方法は以下の通りです。
foreach()文の使い方

foreach( 型名 変数名 in 配列(リスト)) {
    処理文
}
foreach文 では for文 のように、インデックス番号を指定する int型変数 i を定義 したり、それをループごとに インクリメント(i++) する必要はありません。また、配列やリストの要素数を取得する必要もありません。ですので、簡潔に記述することができて便利です。

問題1

作成した関数:ArrayCheck() を編集して、2次元配列 country[ , ] の全要素を出力するコードをつくって、コンソールに表示させてください。


2-3,出題の順番

一旦すべてのデータを配列に取り込むことができましたので、この問題を出題する順番を決めます。

2-3-1, ランダムな出題順を作成

問題と答えが入った 配列:country[] 自体をランダムで並び替えることもできるのですが、後にセットする国旗の順番と一致させるために、country[] の順番はこのままにしておきます。このサンプルでは0~192番までの番号をランダムに並び替え、並び替えられた番号順に出題するというフローで進んでいきます。

ここでは以下の方法で、配列に0~192までの数字をランダムで配置します。

➊ 0~192 までの順番をランダムで配置する配列 questOrder[] を宣言、及び初期化 ➋ 順不同の乱数を入れるリスト quest<> を宣言 ➌ 0~192までの乱数が、quest<> になければ追加、quest<> の長さが193になるまで繰り返す

新たに使用する配列、リストを確認します。

配列、リスト名

アクセス

説明

questOrder[ ]

int

public

出題順を管理する配列

quest<>

int

private

0~192の番号を重ならないように入れるリスト(一時的に使用)

まずは配列の宣言です。

GameManager.cs

//➊全問題の出題順をランダムで並て保管するリストを宣言
 static public List<int> questOrder;      

新たな関数 CreateOrder() を作成します。

GameManager.cs

public void CreateOrder()
{
    questOrder = new List<int>();   //順不同の乱数を入れるリストを宣言
    while (questOrder.Count < rowLen)  //リストの長さが193になるまで繰り返す
    {
        int n = Random.Range(0, rowLen);   //0~192 の乱数nを取得
        if (!questOrder.Contains(n))       //questに n が含まれていなければ
        {
            questOrder.Add(n);               //quest に n を追加                     
        }
    }
}

作成した関数:CreateOrder()は Start関数で呼び出します。

GameManager.cs

void Start()
{
    Initialization(); //記述済み
    CreateOrder();    //追加
}

これで配列:questOrder[] には0番から192番までの乱数が入力されました。


問題2

作成ずみの関数:ArrayCheck() を編集して、上で作成した配列:questOrder[] の全要素を、およびその国番号に対応する国名を下のように順番に表示させてみましょう。

Consoleに表示されたリスト

これで、素材の取り込みと順番の作成が完成しました。


フェーズ2の内容はここまでになりますが、このカリキュラムはフェーズ16まで続きます。最終的にはしっかりとしたアプリになりますので、もしよければぜひチャレンジしてみてください!


ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

Comments


bottom of page