前提・実現したいこと
Unityで4択のクイズゲームを制作しています。
csvファイルを用いて問題と答えを作っています。
上のソースコード(スクリプト)で定めた「問題の正解」を
下のソースコードでも使い、正誤判定しようとしています。
しかし、下のソースコードで参照した際、「問題の正解」に代入した変数がなくなってしまいます。
原因と解決方法を教えていただけると嬉しいです。
発生している問題・エラーメッセージ
上の説明だとわかりづらいと思うので、下にある二つのソースコードと併せて、再度実現したいことを説明させていただきます。
上のソースコードの最後で、正しい答えとなるcsvデータ(csvDatas[k][1])をAnswerTextというString型に入れています。
★AnswerText内に代入したテキスト(csvデータ)を別スクリプトのanswerTextにさらに代入したい、という感じです。
<補足>
エラーコードは出ていません。
上のソースコードのAnswerSetメソッド内にあるDebug.Logでは正しく答えのテキストが表示されます。
しかし、下のソースコードのStartメソッド内にあるDebug.Logでは何も表示されず、Answerメソッド内のDebug.Logではnullが表示されます。
uGUIボタンを押すと、下のソースコード内のAnswerメソッドが行われるように設定してあります。
下のソースコードの最後にあるDebug.Log(正解)(不正解)は全て不正解と表示されます。(代入がうまくいっていないため)
該当のソースコード
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System.IO; 6using System.Linq; 7 8public class QuizMgr : MonoBehaviour 9{ 10 public string dataName; 11 public string title; 12 public TextAsset csvFile; 13 public List<string[]> csvDatas = new List<string[]>(); 14 public int height = 0; 15 public int i, j = 0; 16 public int k = 0; 17 internal Text ansLabel; 18 public string AnswerText; 19 const int size = 5; 20 21 // Start is called before the first frame update 22 void Start() { 23 24 title = "theme_"; 25 csvFile = Resources.Load("CSV/" + title + dataName) as TextAsset; 26 StringReader reader = new StringReader(csvFile.text); 27 28 while(reader.Peek() > -1){ 29 string line = reader.ReadLine(); 30 csvDatas.Add(line.Split(',')); 31 Debug.Log("reading:" + height); 32 height++; 33 } 34 35 for(i=0; i < height; i++) 36 { 37 for(j = 0; j < size; j++){ 38 Debug.Log("csvDatas[" + i + "][" + j + "]:" + csvDatas[i][j]); 39 } 40 } 41 42 QuestionLabelSet(); 43 AnswerLabelSet(); 44 AnswerSet(); 45 } 46 47 48 public void QuestionLabelSet(){ 49 csvDatas[k] = csvDatas[Random.Range(0, 4)]; 50 //特定の名前のオブジェクトを検索してアクセス 51 Text qLabel = GameObject.Find("Quiz/QLabel").GetComponentInChildren<Text>(); 52 //データをセットすることで、既存情報を上書きできる 53 qLabel.text = csvDatas[k][0]; 54 } 55 56 57 public void AnswerLabelSet(){ 58 //問題文に対応した答えをそれぞれのuGUIボタンにセット 59 string[] array = new string[]{ csvDatas[k][1], csvDatas[k][2], csvDatas[k][3], csvDatas[k][4]}; 60 61 //問題文をシャッフル 62 array = array.OrderBy(x => System.Guid.NewGuid()).ToArray(); 63 64 //ボタンが4つあるのでそれぞれ代入 65 for(int i=1; i<=4; i++){ 66 Text ansLabel = GameObject.Find("Quiz/AnsButton" + i).GetComponentInChildren<Text>(); 67 ansLabel.text = array[i - 1]; 68 } 69 } 70 //問題の箇所① 71 public void AnswerSet(){ 72 //答えとなるcsvデータを変数として型に代入する 73 string AnswerText = csvDatas[k][1]; 74 Debug.Log(AnswerText); 75 } 76 77 // Update is called once per frame 78 void Update() 79 { 80 81 } 82} 83
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System.IO; 6 7public class Judge : MonoBehaviour 8{ 9 10 QuizMgr quizMgr; 11 string answerText; 12 13 void Start() 14 { 15 //問題の箇所② 16 quizMgr = GameObject.Find("Script").GetComponent<QuizMgr>(); 17 //QuizMgrスクリプトからAnswerTextを持ってくる 18 string answerText = quizMgr.AnswerText; 19 //中身の表示 20 Debug.Log(answerText); 21 22 } 23 24 //選択したボタンのテキストラベルと正解のテキストを比較して正誤を判定 25 public void Answer() 26 { 27 //選択したボタンのテキストを取得する 28 Text selectedBtn = this.GetComponentInChildren<Text>(); 29 30 if (selectedBtn.text == answerText){ 31 Debug.Log("正解"); 32 } else { 33 Debug.Log("不正解"); 34 } 35 36 } 37} 38
試したこと
最初は取り込んだcsvDatasを読み込んで正誤判定しようとしていました。
(選んだボタンのテキストがcsvDatas[k][1]なら正解)
しかし、IndexWasOutOfRangeのエラーがでてしまい、解決できなかったため
今の方法にチェンジしました。(やり方としてはどちらも間違っていないはず?)
補足情報(FW/ツールのバージョンなど)
Unityは2019 1.2fです。
ヒントや推測でもいただけると嬉しいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/01 04:01
2019/07/01 06:41 編集
2019/07/02 02:53