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

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

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

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

Unity

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

Q&A

解決済

1回答

1385閲覧

unityクイズゲームで正解になったりならなかったりするのを直したい

taaiii

総合スコア6

C#

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

Unity

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

0グッド

1クリップ

投稿2021/11/26 06:04

前提・実現したいこと

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です。

長ったらしい質問で申し訳ないのですが、何卒よろしくお願いします。

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

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

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

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

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

tsuki01

2021/11/26 15:09

>自身でやっている限りは正解に設定している文字と回答ボタンの文字は同じだと思われます。 「public void Answer()」メソッドの中に、answerText と selectedBtn.text の中身をログ出しした時はどうなっているのでしょうか? 不正解の時は、実際にテキストの中身が異なる文字列が入っているのでしょうか。
taaiii

2021/11/27 01:16

返信ありがとうございます。 今unityを触れないので月曜日に確認してまたコメントします。
taaiii

2021/11/29 01:29

public void Answer()の中に Debug.Log("セレクト'" + selectedBtn.text + "'"); Debug.Log("アンサー'" + answerText + "'"); を追加して実行したところ不正解の時 セレクト'0' UnityEngine.Debug:Log (object) Judge1:Answer () (at Assets/Scripts/Judge1.cs:24) UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501) アンサー'csvDatas[k][1]' UnityEngine.Debug:Log (object) Judge1:Answer () (at Assets/Scripts/Judge1.cs:25) UnityEngine.EventSystems.EventSystem:Update () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501) と表示されました。 ですがQuizMgrのpublic void AnswerSet()のログは正しく表示されています。 QuizMgrからJudge1へうまく代入できていないのでしょうか?
tsuki01

2021/11/29 07:03

>QuizMgrからJudge1へうまく代入できていないのでしょうか? その可能性はあるかもです。 「Start」メソッド内で答えを変数に代入していますが、「Start」メソッドはシーン開始後1回だけ呼ばれるものなので。 ※提示されてるスクリプトやメソッドの流れを全て見ておらず、把握しきれてないので的外れなアドバイスだったら申し訳ないです。 Judge1の「Answer()」メソッド内で、直接「quizMgr.AnswerText」を参照したら何かログ内容とか変わったりしますでしょうか?
taaiii

2021/12/01 01:20

返信が遅くなりすみません。 教えていただいた通りAnswer()メソッド内に answerText = quizMgr.AnswerText; を移動させたら正解の選択肢で間違いになることはなくなりました! ありがとうございます! 助かりました!
guest

回答1

0

自己解決

Answer()メソッド内で
quizMgr.AnswerText
を参照したところ正しく動作しました。

教えていただきありがとうございます!

投稿2021/12/01 01:21

taaiii

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問