質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

6051閲覧

Unityクイズゲーム制作、選択肢を毎回並び替えたい

Ranom

総合スコア10

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/06/29 14:38

前提・実現したいこと

1.Unityで四択のクイズゲームを作る(7◯3✖️式を検討中)
2.問題はCSVで管理する
3.csvで取得したデータをuGUIテキスト、uGUIボタンに代入する
(ボタンは縦に4つ並んでいます)

csvの内容は

"問題文, 正しい答え, 選択肢1, 選択肢2, 選択肢3”
という形のものが複数あり、問題は追加できることを前提としています。
(下記のソースコードではとりあえずの数値を代入しています)

csvDatas[0]が問題文
csvDatas[1]が正しい答え
csvDatas[2][3][4]が間違った選択肢、となるようにしていて、
のちに実装する予定の「正誤判定」で「[1]を選んだ場合正解」というようにするつもりです。

発生している問題・エラーメッセージ

<問題・やりたいこと>
今のソースコードだと、一番上の選択肢が必ず正解になってしまいます。
なので、問題ごとに選択肢の表示場所をランダムに入れ替わるようにしたいです。
「こういった考え方があるよ」「このメソッドを使うといいよ」等あれば
教えていただけると嬉しいです。

<補足>
下記のソースコードにはエラーメッセージは出ていません。
多くのサイト様等を参考に組んだものなので、変なところがあるかもしれません。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System.IO; 6 7public class QuizMgr : MonoBehaviour 8{ 9 public string dataName; 10 private string title; 11 private TextAsset csvFile; 12 private List<string[]> csvDatas = new List<string[]>(); 13 private int height = 0; 14 private int i, j = 0; 15 private int k = 0; 16 const int size = 5; 17 18 // Start is called before the first frame update 19 void Start() { 20 //CSVファイルを取得する 21 title = "theme_"; 22 csvFile = Resources.Load("CSV/" + title + dataName) as TextAsset; 23 StringReader reader = new StringReader(csvFile.text); 24 25 while(reader.Peek() > -1){ 26 string line = reader.ReadLine(); 27 csvDatas.Add(line.Split(',')); 28 Debug.Log("reading:" + height); 29 height++; 30 } 31     //Consoleに取得したCSVファイルを表示する 32 for(i=0; i < height; i++) 33 { 34 for(j = 0; j < size; j++){ 35 Debug.Log("csvDatas[" + i + "][" + j + "]:" + csvDatas[i][j]); 36 } 37 } 38 39 QuestionLabelSet(); 40 AnswerLabelSet(); 41 } 42 43//ここから問題の箇所 44 45 private void QuestionLabelSet(){ 46     //問題文一つをuGUIテキストにランダムで表示させる 47 csvDatas[k] = csvDatas[Random.Range(0, 4)]; 48 Text qLabel = GameObject.Find("Quiz/QLabel").GetComponentInChildren<Text>(); 49 qLabel.text = csvDatas[k][0]; 50 } 51 52 53 private void AnswerLabelSet(){ 54 //問題文に対応した選択肢と答えをそれぞれuGUIボタンに表示 55 string[] array = new string[]{ csvDatas[k][1], csvDatas[k][2], csvDatas[k][3], csvDatas[k][4]}; 56 57 for(int i=1; i<=4; i++){ 58 Text ansLabel = GameObject.Find("Quiz/AnsButton" + i).GetComponentInChildren<Text>(); 59 ansLabel.text = array[i - 1]; 60 } 61 }

試したこと

AnswerLabelSetメソッドのcsvDatasを、csvDatas[k][l]にして、
csvDatas[l] = csvDatas[Random.Range(0, 5)
としてやってみましたが、全て同じ数値(選択肢)になってしまうのでダメでした。

補足情報(FW/ツールのバージョンなど)

Unityは2019 1.2です。
自分はプログラミングもUnityも経験が浅く、この質問がうまく伝えられていないかもしれません。
ですが、どうしても完成させたいので、お力を貸していただけると嬉しいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

配列をシャッフルするだけでいけそうです。

C#

1private void AnswerLabelSet() 2{ 3 //問題文に対応した選択肢と答えをそれぞれuGUIボタンに表示 4 string[] array = new string[] { csvDatas[k][1], csvDatas[k][2], csvDatas[k][3], csvDatas[k][4] }; 5 6 //問題文をシャッフル 7 array = array.OrderBy(x => System.Guid.NewGuid()).ToArray(); 8 9 for (int i = 1; i <= 4; i++) 10 { 11 Text ansLabel = GameObject.Find("Quiz/AnsButton" + i).GetComponentInChildren<Text>(); 12 ansLabel.text = array[i - 1]; 13 } 14}

参考:

配列をランダムに置き換えたい
https://teratail.com/questions/105164

Listの中身をランダムに並べ替え
https://teratail.com/questions/122041

投稿2019/06/29 23:46

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ranom

2019/06/30 01:17

nskydivingさん、ご回答いただきありがとうございます! Sytem.Linqの名前空間を定義して、提示していただいたソースコードを用いたところ解決できました! OrderByを使えば配列のシャッフルが可能なのですね。勉強になりました! 完成目指して頑張ります! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問