前提・実現したいこと
unityを使い四択のクイズゲームを作成しています。
csvファイルを使って問題を管理しています。
正解のボタンを選択しても当たっていたり間違っていたりします。
正しい答えのテキストを設定し、それと同じであれば正解にしようと思っています。
自身でやっている限りは正解に設定している文字と回答ボタンの文字は同じだと思われます。
エラーが出ていないのでどこが間違っているのかわからないため質問させてもらいました。
間違っている箇所やどのように直すのかヒントをいただけると幸いです。
QuizMgr、ResultMgr、Judge1というスクリプトを作っています。
csvファイルの[0]が問題、[1]が正解、[2]~[4]が選択肢です。[5]に解説を書いていますが、ここでは関係ないと思います。
また、QuizMgrはMain Cameraにアタッチしており、インスペクターにDataNameやTitleがあるのですがここをいじったほうが良いのでしょうか?
CsvFileとAnswerTextは設定しています。
発生している問題
エラーは出ていません。
これが設定している答えです。
C#
1ニュージーランド 2UnityEngine.Debug:Log (object) 3QuizMgr:AnswerSet () (at Assets/Scripts/QuizMgr.cs:82) 4QuizMgr:Start () (at Assets/Scripts/QuizMgr.cs:47)
前後の空白を調べています。
C#
1'ニュージーランド' 2UnityEngine.Debug:Log (object) 3Judge1:Answer () (at Assets/Scripts/Judge1.cs:24) 4UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)
同じ答えを押しても正解になるときとならない時があります。
C#
1正解 2UnityEngine.Debug:Log (object) 3Judge1:Answer () (at Assets/Scripts/Judge1.cs:28) 4UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)
C#
1不正解 2UnityEngine.Debug:Log (object) 3Judge1:Answer () (at Assets/Scripts/Judge1.cs:32) 4UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)
該当のソースコード
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 public string Kaisetsubun; 20 const int size = 5; 21 22 23 void Start() 24 { 25 title = "theme_"; 26 csvFile = Resources.Load("CSV/" + title + dataName) as TextAsset; 27 StringReader reader = new StringReader(csvFile.text); 28 29 while (reader.Peek() > -1) 30 { 31 string line = reader.ReadLine(); 32 csvDatas.Add(line.Split(',')); 33 Debug.Log("reading:" + height); 34 height++; 35 } 36 37 for (i = 0; i < height; i++) 38 { 39 for (j = 0; j < size; j++) 40 { 41 Debug.Log("csvDatas[" + i + "][" + j + "]:" + csvDatas[i][j]); 42 } 43 } 44 45 QuestionLabelSet(); 46 AnswerLabelSet(); 47 AnswerSet(); 48 } 49 50 51 public void QuestionLabelSet() 52 { 53 csvDatas[k] = csvDatas[Random.Range(0, 9)]; 54 55 //特定の名前のオブジェクトを検索してアクセス 56 Text qLabel = GameObject.Find("Quiz/Image/QLabel").GetComponentInChildren<Text>(); 57 //データをセットすることで、既存情報を上書きできる 58 qLabel.text = csvDatas[k][0]; 59 } 60 61 public void AnswerLabelSet() 62 { 63 //問題文に対応した答えをそれぞれのuGUIボタンにセット 64 string[] array = new string[] { csvDatas[k][1], csvDatas[k][2], csvDatas[k][3], csvDatas[k][4] }; 65 66 //問題文をシャッフル 67 array = array.OrderBy(x => System.Guid.NewGuid()).ToArray(); 68 69 70 //ボタンが4つあるのでそれぞれ代入 71 for (int i = 1; i <= 4; i++) 72 { 73 Text ansLabel = GameObject.Find("Quiz/AnsButton" + i).GetComponentInChildren<Text>(); 74 ansLabel.text = array[i - 1]; 75 } 76 } 77 78 public void AnswerSet() 79 { 80 //答えとなるcsvデータを変数として型に代入する 81 AnswerText = csvDatas[k][1]; 82 Debug.Log (AnswerText); 83 84 Kaisetsubun = csvDatas[k][5]; 85 Debug.Log(Kaisetsubun); 86 } 87 88 void Update() { } 89}
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class ResultMgr : MonoBehaviour 7{ 8 //他のスクリプトからも参照可能な変数宣言 9 public static string g_judgeData; 10 public static int g_scoreData; 11 12 13 void Start() 14 { 15 //デフォルトは正解、不正解なら画像と文言を切り替える 16 if (g_judgeData == "不正解") 17 { 18 //現在描画している画像を取得 19 SpriteRenderer judgeImage = GameObject.Find("JudgeUI/JudgeImage").GetComponent<SpriteRenderer>(); 20 //Resourcesから指定した名前の画像データをロード 21 Sprite loadingImage = Resources.Load<Sprite>("batsu"); 22 //画像を置換 23 judgeImage.sprite = loadingImage; 24 //表示テキストを取得して置換 25 Text judgeLabel = GameObject.Find("JudgeUI/JudgeLabel").GetComponent<Text>(); 26 judgeLabel.text = "不正解"; 27 } 28 else if (g_judgeData == "正解") 29 { 30 //正解であればScoreを足す 31 g_scoreData++; 32 Debug.Log("今" + g_scoreData + "点"); 33 } 34 } 35 36 //他のスクリプトからも参照可能な関数宣言 37 public static void SetJudgeData(string judgeData) 38 { 39 g_judgeData = judgeData; 40 } 41 42 public static int GetScoreData() 43 { 44 return g_scoreData; 45 } 46 47 public static int SetScoreData(int scoreData) 48 { 49 g_scoreData = scoreData; 50 return g_scoreData; 51 } 52 53}
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using System.IO; 6 7public class Judge1 : MonoBehaviour 8{ 9 10 QuizMgr quizMgr; 11 string answerText; 12 13 void Start() 14 { 15 quizMgr = GameObject.Find("Main Camera").GetComponent<QuizMgr>(); 16 answerText = quizMgr.AnswerText; 17 } 18 19 //選択したボタンのテキストラベルと正解のテキストを比較して正誤を判定 20 public void Answer() 21 { 22 //選択したボタンのテキストを取得する 23 Text selectedBtn = this.GetComponentInChildren<Text>(); 24 Debug.Log("'" + selectedBtn.text + "'"); 25 26 if (answerText == selectedBtn.text){ 27 ResultMgr.SetJudgeData("正解"); 28 Debug.Log("正解"); 29 Application.LoadLevel("Result1"); 30 } else { 31 ResultMgr.SetJudgeData("不正解"); 32 Debug.Log("不正解"); 33 Application.LoadLevel("Result1"); 34 } 35 } 36}
補足情報
unityは2021.2.2f1です。
長ったらしい質問で申し訳ないのですが、何卒よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー