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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Unity

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

Q&A

解決済

2回答

4267閲覧

4択クイズ作成の考え方について

domekano

総合スコア2

Unity

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

0グッド

0クリップ

投稿2020/09/21 01:48

編集2020/09/21 17:10

前提・実現したいこと

ランダムに出題され、重複しない4択クイズを作成したいと考えています。
sceneは、「タイトル画面」「ゲーム画面」「リザルト画面」「結果画面」の4つで構成しています。
「ゲーム画面」では4択問題が出題され、押したボタンに対応する「リザルト画面」に移動し、
指定した回数を終えるまでは、「ゲーム画面」「リザルト画面」が交互に入れ替わります。

問題内容は、csvファイルから読み込むようにしており、
StartメソッドにGuid.NewGuid()を利用して、ランダムなリストを作成し、それをテキストに反映しています。
しかし、「ゲーム画面」「リザルト画面」を移動すると再度リストが作成されてしまう為、問題が重複してしまう状態です。

startメソッドに書いているから、
移動の度に再度リスト作成されてしまっているのが原因なのはわかってはいるのですが、
他の方法を思いつかず悩んでいます。

sceneを移動させているのがそもそも間違いでしょうか?
それともこの4つのシーンでも実現する方法がありますでしょうか?

考え方のご教授をいただければ幸いです。
よろしくお願いいたします。

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

Windows 10
Unity 2020.1.6f1 (64-bit)

追記

i_zna様の回答を参考に試行錯誤してみましたが、未だに行き詰ってしまっています。
教えていただいた通り、/問題生成処理/部分を挟むことでシーンが切り替わっても再度リストを作成しなくはなりましたが、テキストの変更部分まで実行されなくなった為、現在は問題表示の部分で悩んでいます。
ソースがない為、アドバイスしてくれようにも分からないと思いましたので、下記にソースも載せます。
また、sceneを移動するのではなくSubsceneとして「Result」画面を表示することで解決出来ないかと考えているのですが。
考え方として推奨出来るものでしょうか。
独学でやっている為、こういったプログラムの場合、一般的にどの様に作成するものなのかも可能であればお聞きしたいです。

C#

1using System.Collections.Generic; 2using UnityEngine; 3using System.IO; 4using UnityEngine.UI; 5using System.Collections; 6using System; 7using System.Linq; 8 9public class CSVReader : MonoBehaviour 10{ 11 public TextAsset csvFile;// CSVファイル 12 public Text QuizText;//クイズを表示するテキスト 13 public Text Choices1Text;//選択肢1を表示するテキスト 14 public Text Choices2Text;//選択肢2を表示するテキスト 15 public Text Choices3Text;//選択肢3を表示するテキスト 16 public Text Choices4Text;//選択肢4を表示するテキスト 17 public Text AnserText;//自分の答えを表示するテキスト 18 public Text correctText;//正解を表示するテキスト 19 20 21 public static int s = 0; 22 List<string[]> csvDatas = new List<string[]>(); // CSVの中身を入れるリスト; 23 static bool seiseizumi = false; 24 void Start() 25 { 26 //Random(); 27 if (seiseizumi) return; 28 29//-----------------↓csvファイルを読み込む---------------------------- 30 StringReader reader = new StringReader(csvFile.text); 31 while (reader.Peek() != -1) // reader.Peaekが-1になるまで 32 { 33 string line = reader.ReadLine(); // 一行ずつ読み込み 34 csvDatas.Add(line.Split(',')); // , 区切りでリストに追加 35 } 36//-----------------↑csvファイルを読み込む---------------------------- 37//-----------------↓ランダムで重複しないリスト作成---------------------------- 38 List<int> List1 = Enumerable.Range(0, csvDatas.Count) 39 40 .OrderBy(x => System.Guid.NewGuid()) //ランダムで並び替え 41 42 .Take(csvDatas.Count) 43 44 .ToList(); 45//-----------------↑ランダムで重複しないリスト作成---------------------------- 46 47//-----------------↓UIテキストに反映---------------------------- 48 QuizText.text = csvDatas[List1[s]][0]; 49 Choices1Text.text = csvDatas[List1[s]][1]; 50 Choices2Text.text = csvDatas[List1[s]][2]; 51 Choices3Text.text = csvDatas[List1[s]][3]; 52 Choices4Text.text = csvDatas[List1[s]][4]; 53 correctText.text = csvDatas[List1[s]][5]; 54//-----------------↑UIテキストに反映---------------------------- 55   seiseizumi = true; 56 57 } 58}

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

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

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

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

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

guest

回答2

0

ベストアンサー

static変数ならシーンが推移しても消えないので下のようにできます。
あるいはシングルトンで検索して頂いてDontDestroyOnLoadすればシーンを跨いで存在するオブジェクトを作れますので、そちらに問題生成処理をさせることもできます。

C#

1static bool seiseizumi = false; 2 3void Start(){ 4 if (seiseizumi) return; 5 6 /*問題生成処理*/ 7 8 seiseizumi = true; 9} 10```---追記--- 11 12ソースを拝見しました。出題のたびにリストを生成するのでは結局確率で問題が重複してしまうと思いましたので、1ゲームの出題数ごとにリストを生成するように修正してみました。 13 14私もUnityは素人なのでどういう風に書くのが正解かというのは解りません。ただ、シーン管理についてはメモリの問題やヒエラルキーが込み入るのを防ぐものでしょうから、個人制作のクイズアプリの規模であれば楽だと思う方法で構わないのではないでしょうか。 15 16(ただ個人的には、「ゲーム画面」「リザルト画面」は統合したほうがやりやすいのではないかと思います。) 17```C# 18using System.Collections.Generic; 19using UnityEngine; 20using System.IO; 21using UnityEngine.UI; 22using System.Collections; 23using System; 24using System.Linq; 25using UnityEditor; 26 27public class CSVReader : MonoBehaviour 28{ 29 public int takeQuizCount = 5; //出題数 30 31 public TextAsset csvFile;// CSVファイル 32 public Text QuizText;//クイズを表示するテキスト 33 public Text Choices1Text;//選択肢1を表示するテキスト 34 public Text Choices2Text;//選択肢2を表示するテキスト 35 public Text Choices3Text;//選択肢3を表示するテキスト 36 public Text Choices4Text;//選択肢4を表示するテキスト 37 public Text AnserText;//自分の答えを表示するテキスト 38 public Text correctText;//正解を表示するテキスト 39 40 static List<string[]> csvDatas = null; //CSVの中身を入れるリスト 41 static List<int> quizIndexList = null; //クイズ番号のリスト 42 static int currentQuizIndexIndex = 0; //次に出題するクイズ番号のインデックス 43 44 void Start(){ 45 46 //csvデータが空の場合読み込む (一度だけ実行されます) 47 if (csvDatas == null){ 48 LoadCSVDatas(); 49 } 50 51 //リストがないとき、出題数をオーバーしたときにリストを生成 52 if(quizIndexList == null || currentQuizIndexIndex >= takeQuizCount){ 53 MakeQuizIndexList(); 54 currentQuizIndexIndex = 0; 55 } 56 57 if(takeQuizCount > csvDatas.Count){ 58 Debug.LogError("出題数が問題数より多いようです。"); 59 } 60 61 //クイズをUIに表示 62 ShowQuiz(currentQuizIndexIndex); 63 currentQuizIndexIndex ++; 64 } 65 66 void LoadCSVDatas(){ 67 csvDatas = new List<string[]>(); 68 StringReader reader = new StringReader(csvFile.text); 69 while (reader.Peek() != -1) 70 { 71 string line = reader.ReadLine(); 72 csvDatas.Add(line.Split(',')); 73 } 74 } 75 76 void MakeQuizIndexList(){ 77 quizIndexList = Enumerable.Range(0, csvDatas.Count) 78 .OrderBy(x => System.Guid.NewGuid()) 79 .Take(csvDatas.Count) 80 .ToList(); 81 } 82 83 void ShowQuiz(int index){ 84 QuizText.text = csvDatas[quizIndexList[index]][0]; 85 Choices1Text.text = csvDatas[quizIndexList[index]][1]; 86 Choices2Text.text = csvDatas[quizIndexList[index]][2]; 87 Choices3Text.text = csvDatas[quizIndexList[index]][3]; 88 Choices4Text.text = csvDatas[quizIndexList[index]][4]; 89 correctText.text = csvDatas[quizIndexList[index]][5]; 90 } 91}

投稿2020/09/21 02:20

編集2020/09/22 04:42
i_zna

総合スコア198

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

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

domekano

2020/09/21 17:16

i_zna様 まず回答ありがとうございます。 丁寧に説明してくださってると感じますが、無能の私はご教授していただいた内容を半日以上試行錯誤しても未だに一つ進むと違う箇所でまた躓いてしまい、結果現在もランダムで重複しない問題作成することができていません。 質問欄に追記で記載いたしましたのでもし可能であれば閲覧してくださると幸いです。
domekano

2020/09/22 05:43

i_zna様 追記ありがとうございました。 上記で求めていたことが出来ましたのでベストアンサーに致しました。 記述方法などとても勉強になりました。 本当にありがとうございました。
guest

0

思いつくのは出題済みの問題のリストを別に準備して、画面描画時に突合することでしょうか。
保存の方法は、画面描画のスピードをどれだけ早くしたいかだと思います。
遅くても良ければ、csvでいいでしょうし、早くしたければメモリでしょうし。

投稿2020/09/22 04:45

Kaiser

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問