前提・実現したいこと
- Unityでクイズゲームを作る。
過去にこのWebページを参考にJavaでクイズゲームを作成したので、Unityで作成しなおし、ブラッシュアップしたい。
0. 問題はCSV管理する。
0. 問題はランダムに10問出題する。←ここで詰まっています。
発生している問題・エラーメッセージ
1問目はランダム出題されるのですが、1問目を回答し、2問目の出題を行う際に停止してしまいます。
- 空のオブジェクトにQuizMgrスクリプトをアタッチし、1問目を出題します。
- 配列Order1を作成し、OからCSVの行数分数字を入れます。
- Order2でOrder1をシャッフルします。
- Order2の前から2番目の問題を出題します。
- 4つの回答ボタンにJudgeスクリプトをアタッチし、
正解の回答ボタンをクリックするとScoreが10点加算されるところまではできています。
しかし、Judgeクラスから、QuizMgrクラスのNextQuizSetメソッドを呼ぶところで、以下のエラーコードが表示されます。
JudgeクラスからNextQuizSetメソッドを呼んだ場合は、Order2の要素が元から入っていないと判断されているのはなんとなくわかるのですが、QuizMgrクラスのStartメソッドが実行された時点で、Order2の要素は固定することはできないのでしょうか。
大変わかりにくい説明となっていしまいましたが、ご教示いただけると幸いです。
エラーコード NullReferenceException: Object reference not set to an instance of an object QuizMgr.QuizSet () (at Assets/QuizMgr.cs:58) QuizMgr.NextQuizSet () (at Assets/QuizMgr.cs:77) Judge.CapText () (at Assets/Judge.cs:26) UnityEngine.Events.InvokableCall.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:166) UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58) UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45) UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50) UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261) UnityEngine.EventSystems.EventSystem:Update()
C#
1using UnityEngine; 2using System.Collections; 3using System.Collections.Generic;// 追記 4using UnityEngine.UI;//UI利用時必須 5using System.Linq;//配列に必要 6using System;//これがないとGuidクラスは使えない 7 8public class QuizMgr: MonoBehaviour { 9 public TextAsset csvFile; // GUIでcsvファイルを割当 10 List<string[]> csvDatas = new List<string[]>(); //ここは参考ブログとは違う 11 public static string AnswerStr;//問題の答え 12 int[] Order1 = null; //出題数を管理するメンバ変数 13 public int[] Order2; //出題をランダムにするメンバ変数 14 public static int Count = 1; //今何問目か 15 public int Score = 0; //得点 16 17 //スタート時、CSVファイルを読み込む 18 public void Start() { 19 // 格納 20 string[] lines = csvFile.text.Replace("\r\n", "\n").Split("\n"[0]); 21 foreach (var line in lines) { 22 if (line == "") { continue; } 23 csvDatas.Add(line.Split(',')); // string[]を追加している 24 } 25 26 Order1 = new int[csvDatas.Count]; //配列の要素数をCSVの行数分にする 27 //配列に順番に数字を入れる 28 for(int i = 0; i < csvDatas.Count-1; i++) { 29 Order1[i] = i; 30 } 31 //配列の数字をランダムに入れ替えた配列を作成 32 Order2 = Order1.OrderBy(i => Guid.NewGuid()).ToArray(); 33 34 //問題をセットするメソッドを呼び出す 35 QuizSet(); 36 } 37 //問題をセットするメソッド 38 void QuizSet() { 39 40 //1から4の配列(ary1)を作成 41 int[] ary1 = new int[] {1, 2, 3, 4}; 42 //ary1をランダムに並び替えたary2を作成 43 int[] ary2 = ary1.OrderBy(i => Guid.NewGuid()).ToArray(); 44 45 //for (int i =0; i < csvDatas.Count; i++) { 46 47 //答えをセット 48 AnswerStr = csvDatas[Order2[Count]][1]; 49 //特定の名前のオブジェクトを検索してアクセス 50 Text question = GameObject.Find("Quiz/Question").GetComponentInChildren<Text>(); 51 Text button1 = GameObject.Find("Quiz/Button1").GetComponentInChildren<Text>(); 52 Text button2 = GameObject.Find("Quiz/Button2").GetComponentInChildren<Text>(); 53 Text button3 = GameObject.Find("Quiz/Button3").GetComponentInChildren<Text>(); 54 Text button4 = GameObject.Find("Quiz/Button4").GetComponentInChildren<Text>(); 55 //データをセットすることで、既存情報を上書きできる 56 question.text = csvDatas[Order2[Count]][0];//問題文セット 57 button1.text = csvDatas[Order2[Count]][ary2[0]];//ary2の1番目に入っている数字の項目をボタン1にセット 58 button2.text = csvDatas[Order2[Count]][ary2[1]];//ary2の2番目に入っている数字の項目をボタン2にセット 59 button3.text = csvDatas[Order2[Count]][ary2[2]];//ary2の3番目に入っている数字の項目をボタン3にセット 60 button4.text = csvDatas[Order2[Count]][ary2[3]];//ary2の4番目に入っている数字の項目をボタン4にセット 61 //} 62 } 63 public void NextQuizSet() { 64 Count++; 65 Debug.Log(Count); 66 if(Count == 11) { 67 } else {QuizSet();} 68 } 69}
C#
1using UnityEngine; 2using UnityEngine.UI; 3 4public class Judge : MonoBehaviour { 5 6 public static Text selectedBtn; 7 8 //選択したボタンのテキストラベルと正解のテキストを比較して正誤を判定 9 public void CapText() { 10 11 QuizMgr quizMgr = new QuizMgr();//他のクラスのメソッドを使用するためにはオブジェクト作成が必要 12 13 //選択したボタンのテキストラベルを取得する 14 Text selectedBtn = this.GetComponentInChildren<Text>(); 15 16 //選択したボタンのテキストラベルと問題の答えを比較 17 if (selectedBtn.text == QuizMgr.AnswerStr) { 18 quizMgr.Score += 10; 19 } 20 quizMgr.NextQuizSet();//上記で作成したオブジェクトを使用する 21 } 22}
試したこと
Judgeクラスに配列Order3を作成し、Order2の要素を渡す方法等も考えましたが、うまくいきませんでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/25 03:35
2019/03/25 13:10