卒業研究日記1・Unityで3択式クイズを作る
前置き
真夜中の更新です。今回はUnityで以下のような卒業研究の一環として作っている3択式のクイズを解説します。
各オブジェクトの紹介
problem_text :「sin π/2=?」の部分
problem_number:「問1/10」の部分
Button_0,1,2 :解答欄の部分。
Button_memo: 「メモ」の部分。ここを押すと、メモ帳が出て数式など書ける。今回は紹介だけ。
Circle.ver:判定後に正解なら〇を表示するためのオブジェクト。
Cross.ver:判定後に不正解なら×を表示するためのオブジェクト。
※上から3つのオブジェクトの各テキストはスクリプトで変更している。
スクリプトの紹介
では、次に今回作成したスクリプトを紹介する。スクリプト名は、「Judge.cs」とした。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TexDrawLib; // 数式を表現したいので使用している。
public class Judge : MonoBehaviour
{
public GameObject Screen; //判定の時に画面を消す
public GameObject Circle; //正解の時に使う〇の画像
public GameObject Cross; //不正解の時に使う×の画像
public Text problem_number;
public TEXDraw problem_text;
public TEXDraw[] _text; //TEXDrawの配列
public int IssueNumber=1;
public int MaxIssueNumber=10;
[SerializeField] private Button[] _Button;
// Start is called before the first frame update
void Start()
{
problem_number.text = "問" + IssueNumber.ToString() + "/" + MaxIssueNumber.ToString();
problem_text.text = "$\\sin\\frac{\\pi}{2}=?";
_text[0].text = "0";
_text[1].text = "1";
_text[2].text = "-1";
// ボタンにクリックイベントを登録
for (int i = 0; i < _Button.Length; i++)
{
int index = i; // ローカル変数を使ってクロージャ問題を回避
_Button[i].onClick.AddListener(() => judge_button(index));
}
}
// ボタンが押されたときの処理
public void judge_button(int index)
{
Screen.SetActive(false);
if (_text[index].text == "1")
{
Circle.SetActive(true);
}
else
{
Cross.SetActive(true);
}
}
}
各変数の説明
Screen:判定時に問題の画面を非表示にするためのGameObject。
Circle:正解時に表示する〇の画像を格納する。
Cross:正解時に表示する×の画像を格納する。
problem_number:現在の問題番号を表示するための、テキストオブジェクト。「問1/10」の部分。
problem_text:出題される問題のテキストを表示するためのTEXDrawオブジェクト。「sin π/2=?」の部分
_text:各選択肢のテキストを格納するTEXDrawの配列。(例:_text[0]は0を示す。)
IssueNumber:現在の問題番号を示す整数。「問1/10」の「1」の部分。今後、問題を解いていくたびに1増えるようにしたい。
MaxIssueNumber:全問題数を示す整数。今後は、ユーザが好きな問題数に設定できるようにしたい。
_Button:ボタンの配列で、各選択肢のボタンを格納する。
メソッドの説明
judge_button(int index)
_text[index].text: _text はテキスト要素の配列で、index 番目のテキスト要素の文字列の値を取得する。
Screen.SetActive(false): Screen というオブジェクトを指しており、これを非表示にする。(SetActive(false) を呼び出すことで、画面要素を非表示にする。)
Circle.SetActive(true):選択したボタンが正解なら、格納している画像を表示させる。※元々の画像は非表示にしている。
Cross.SetActive(true):選択したボタンが不正解なら、格納している画像を表示させる。※元々の画像は非表示にしている。
スクリプトを付与
次に、「ヒエラルキー」(右クリック)→「空のオブジェクト作成」をして名前を「JudgeSystem」にする。このオブジェクトに先ほど作成した「Judge.cs」を付与する。スクリプトを付与したら以下の画像の様に各オブジェクトを格納する。
完成
では、実際にプレイしてみよう。
※判定後の各テキストは、Circle.ver,Cross.verの親オブジェクトの中にテキストを作って表示させています。
中間発表までに実現したいこと
現在、3択式のクイズアプリを卒業研究として作成しています。最終的には、自分の学校に通う1年生にこのクイズを利用してもらい、楽しみながら学力向上を図ることを目指しています。以下は、現状のアイデアと中間発表までに実現したい機能です。
回答欄のランダム化:現在のスクリプトでは、選択肢の並び順が固定されているため、これをランダムに表示するように変更したい。
CSVファイルから問題を読み込む:問題データをCSVファイルに格納し、スクリプトでこのCSVファイルを読み込んで、画面上に問題を表示させるようにしたい。これにより、問題の管理が容易になり、データの追加や編集がしやすくなる。
「次へ」ボタンで次の問題に移動:現在のスクリプトでは、回答判定後に次の問題に移る機能がないため、判定が終わったら「次へ」ボタンを押して次の問題に移動できるようにしたい。
最終的に実現したいこと
復習機能:過去に間違えた問題を自動的にピックアップし、繰り返し練習できる。
カスタマイズ機能:ユーザーが自分の学習ペースや難易度を選べるようにし、個人の出来に合わせた問題を提供。
ランクシステム:
経験値でランクアップ: 勉強を続けることでランクが上昇。
ランク上昇のメリット: 他のユーザーとランクを比較し、競争心を刺激させる。
デイリー報酬:
報酬内容:経験値2倍やゲーム内コインの配布。これにより毎日ログインする動機付けを強化。→ゲーム内コインは何に使うのかは未定。
フレンド機能:
友達のランクや勉強時間の確認:友達と競い合うことで勉強のモチベーションを高める。
チャレンジモード:
タイムアタック:制限時間内にできるだけ多くの問題を解くモード。これにより、瞬発力と問題解決のスピードを鍛えることが可能にする。
フレンド対戦: 友達と直接対戦し、同時に出題される問題を解くことで競争心を高める。
勉強ログ機能:
詳細な学習履歴の記録:いつ、どの章で、どのような問題を解いたかを記録し、過去の学習内容を振り返りやすくする。
学習習慣の分析:ユーザーの勉強時間や解いた問題数をグラフ化し、どの時間帯に集中できるかを分析・提案できるようにする。
AIチュータリング(一番やりたい):
パーソナルアシスタント:AIがユーザーの学習進捗を分析し、次に取り組むべき章や問題を提案。また、適切なタイミングで休憩を促す機能も導入。
現状はこのようなイメージです。とりあえず、卒業研究の中間発表までに実現したい3つを主に取り組んでいきます。最後までご覧いただきありがとうございました。