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

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

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

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

Unity

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

Q&A

解決済

1回答

3600閲覧

unityクイズゲームで正解数を正しく表示させたい

taaiii

総合スコア6

C#

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

Unity

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

0グッド

0クリップ

投稿2021/11/24 01:51

編集2021/11/29 01:57

前提、実現したいこと

unityを使い4択のクイズゲームを作成しています。

クイズの正解数をカウントし最後に何問正解したかを表示したいです。
ですが、得点が2点づつカウントされてしまいます。
これを1点づつ増やしたいです。

なぜこうなるのか、解決のヒントなどを教えてくださると幸いです。

https://engineer.blog.lancers.jp/ios/ugui_quiz_unity/
こちらのサイトを参考に作っていました。

エラーなどは出ていないです。

発生している問題

C#

11 2UnityEngine.Debug:Log (object) 3ResultMgr:Start () (at Assets/Scripts/ResultMgr.cs:33)

C#

12 2UnityEngine.Debug:Log (object) 3ResultMgr:Start () (at Assets/Scripts/ResultMgr.cs:33)

1問正解するごとに2回出てきます。

該当のソースコード

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}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Score : MonoBehaviour 7{ 8 // Use this for initialization 9 void Start() 10 { 11 //スコア表示用のゲームオブジェクトを取得 12 Text scoreLabel = GameObject.Find("Canvas/Score").GetComponent<Text>(); 13 scoreLabel.color = Color.red; 14 //グローバルに宣言したスコアをResultMgrのスクリプトから読み込む 15 int Score = ResultMgr.GetScoreData(); 16 scoreLabel.text = Score.ToString() + " 問正解"; 17 } 18}

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 Debug.Log("アンサー'" + answerText + "'"); 26 27 if (answerText == selectedBtn.text){ 28 ResultMgr.SetJudgeData("正解"); 29 Debug.Log("正解"); 30 Application.LoadLevel("Result1"); 31 } else { 32 ResultMgr.SetJudgeData("不正解"); 33 Debug.Log("不正解"); 34 Application.LoadLevel("Result1"); 35 } 36 } 37}

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; 5using System.IO; 6using System.Linq; 7 8public class Game1 : MonoBehaviour 9{ 10 11 public static int qCount; 12 13 public void NextQuiz() 14 { 15 if (Application.loadedLevelName == "Result1") 16 { 17 if (qCount < 5) 18 { 19 qCount++; 20 Application.LoadLevel("1F"); 21 } 22 else 23 { 24 qCount = 0; 25 Application.LoadLevel("Score1"); 26 } 27 } 28 } 29 30 31}

補足情報

unityは2021.2.2f1です。

勉強し始めて間もなく、知識不足なのですがよろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

実行するスクリプトがほかの場所にもアタッチされており2回動作していました。

とても拙い質問でお2人にはご迷惑をおかけしました。
本当にありがとうございます。

投稿2021/11/25 01:49

編集2021/11/29 06:18
taaiii

総合スコア6

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

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

fiveHundred

2021/11/26 06:05

低評価は私ではないですが、「同じ関数が(理由は不明だが)2回呼ばれている」ということになるので、対処法として間違っていると思います。
taaiii

2021/11/26 07:41

確かにそうですね。 ご指摘ありがとうございます。 どこか間違えてそうな箇所があれば教えていただきたいのですが分かりますでしょうか?
fiveHundred

2021/11/26 08:02

分かりませんが、とりあえずデバッガでどこから呼ばれているのか確認するといいと思います。
fana

2021/11/26 08:24 編集

Unity は知らんのですが,「MonoBehaviour Start」でググると > Start はスクリプトが有効で、Update メソッドが最初に呼び出される前のフレームで呼び出されます とのこと. 文言の雰囲気的に「各インスタンス毎に1回だけ呼ばれる」っぽい感じを受けますが, ResultMgr型のインスタンスはいつどうやって生成されたり破棄されたりするのでしょう? 同時に2つ生成されてたりとか,あるいは 生成→破棄→生成 みたいなことになってたりしないのでしょうか?
taaiii

2021/11/27 08:34

ネットの記事を参考にプログラムを組んでおり、自身も詳しくはないのでインスタンスがどのようになっているのかは分かりません。 インスタンスの生成や破棄はどのように確認するのでしょうか? デバッグで出来ますか? 教えていただけると嬉しいです。
fana

2021/11/28 01:45

前述のように,私はUnityを知らないので助力できませんが…… 個人的な感覚ではインスタンスがいつどうやって生成されるのかを把握してない状態でプログラム作るっていうのが考えられないです. そのまま進めても同じようなことが今後も起きそうですし,一度,そこらへんのルールというか仕組みについて調べてみては?
fiveHundred

2021/11/28 02:39

この場合、着目してほしいのはResultMgrですから、ResultMgrはどのシーンに配置されているのか、それが初期状態で有効なのか無効なのか、それを生成・破棄・有効化・無効化しているコードがどうなっているのか、という点が分からないので、答えられない感じですね。 完全な推測ですが、シーンAのResultMgrのStart()→シーンチェンジ→シーンBのResultMgrのStart()となっているのではないか、というのが怪しいですね。
fiveHundred

2021/11/28 03:01

もしかしたら、最初の選択肢を選択→g_judgeDataに「正解」をセット→スコア表示シーンでResultMgrのStart()が実行→次の問題のシーンでResultMgrのStart()が実行、となっているような気がします。
taaiii

2021/11/29 02:08

>ResultMgrはどのシーンに配置されているのか、それが初期状態で有効なのか無効なのか、それを生成・破棄・有効化・無効化しているコードがどうなっているのか、という点が分からないので、答えられない感じですね 今あるスクリプトを追加しました。 使用しているシーンは、問題と選択肢がある「1F」と〇×の画像を切り替え正解不正解を表示する「Result1」、これらを何回か繰り返し、最終スコアを表示する「Score1」があります。 ResultMgrはResult1の〇のイメージにアタッチしています。 これらは参考になりますでしょうか?
fiveHundred

2021/11/29 05:56

本当にResultMgrはResult1の〇のイメージ「のみ」にアタッチしていますか? あと、解決していないのであれば、ベストアンサーは解除したほうがいいと思います。 また、参考のURL自体、初心者が書いているのではないかと疑いたくなるものなので、他を参考にしたほうがいいかもしれません。 例えば、「他のスクリプトからも参照可能な変数(関数)宣言」としてstaticにしていますが、これは全くのデタラメで、static以外でも参照する手段はあります。 staticは「クラスに一つしかない共通の変数」として運用すべきです。 今回の場合、「ResultMgrのインスタンスが存在しないのにg_judgeDataとg_scoreDataが存在する」状況にもなっていますし、これが意図的でなかったとしたら、適切でないことは明確です。 もっとも、シーン切り替え時に全てのゲームオブジェクトは(デフォルトでは)消えてしまうので、結局使うことになるかもしれませんが、ざっと読んだ限り記事のどこにもそのような記載は見当たりませんでした。
taaiii

2021/11/29 06:13

Result1が背景のpanelにもアタッチされていました。 それを削除すると正解がちゃんと増えていくようになりました! こちらの確認ミスです! 本当に申し訳ないです。 参考のURLは他のも調べながら進めていこうと思います。 このような自分に丁寧に教えてくださり本当にありがとうございます! 今後もっと自分で勉強していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問