QuizManager
unknown
plain_text
3 years ago
5.0 kB
9
Indexable
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuizManager : MonoBehaviour
{
#pragma warning disable 649
//ref to the QuizGameUI script
[SerializeField] private QuizGameUI quizGameUI;
//ref to the scriptableobject file
[SerializeField] private List<QuizDataScriptable> quizDataList;
[SerializeField] private float timeInSeconds;
#pragma warning restore 649
private string currentCategory = "";
private int correctAnswerCount = 0;
//questions data
private List<Question> questions;
//current question data
private Question selectedQuetion = new Question();
private int lifesRemaining;
private float currentTime;
private QuizDataScriptable dataScriptable;
private int i = 0;
private GameStatus gameStatus = GameStatus.NEXT;
public GameStatus GameStatus { get { return gameStatus; } }
public List<QuizDataScriptable> QuizData { get => quizDataList; }
public void StartGame(int categoryIndex, string category)
{
currentCategory = category;
correctAnswerCount = 0;
lifesRemaining = 3;
currentTime = timeInSeconds;
//set the questions data
questions = new List<Question>();
dataScriptable = quizDataList[categoryIndex];
questions.AddRange(dataScriptable.questions);
//select the question
SelectQuestion();
gameStatus = GameStatus.PLAYING;
}
/// <summary>
/// Method used to randomly select the question form questions data
/// </summary>
private void SelectQuestion()
{
//get the random number
int val = UnityEngine.Random.Range(0, questions.Count);
//set the selectedQuetion
selectedQuetion = questions[val];
//send the question to quizGameUI
quizGameUI.SetQuestion(selectedQuetion);
questions.RemoveAt(val);
}
private void Update()
{
if (gameStatus == GameStatus.PLAYING)
{
currentTime -= Time.deltaTime;
SetTime(currentTime);
}
}
void SetTime(float value)
{
TimeSpan time = TimeSpan.FromSeconds(currentTime); //set the time value
quizGameUI.TimerText.text = time.ToString("mm':'ss"); //convert time to Time format
if (currentTime <= 0)
{
//Game Over
GameEnd();
}
}
/// <summary>
/// Method called to check the answer is correct or not
/// </summary>
/// <param name="selectedOption">answer string</param>
/// <returns></returns>
public bool Answer(string selectedOption)
{
//set default to false
bool correct = false;
//if selected answer is similar to the correctAns
if (selectedQuetion.correctAns == selectedOption)
{
//Yes, Ans is correct
correctAnswerCount++;
correct = true;
}
else
{
//No, Ans is wrong
//Reduce Life
lifesRemaining--;
quizGameUI.ReduceLife(lifesRemaining);
if (lifesRemaining == 0)
{
GameEnd();
}
}
if (gameStatus == GameStatus.PLAYING)
{
if (i <= 8)
{
//call SelectQuestion method again after 1s
Invoke("SelectQuestion", 0.4f);
i++;
}
else
{
GameEnd();
}
}
//return the value of correct bool
return correct;
}
private void GameEnd()
{
gameStatus = GameStatus.NEXT;
quizGameUI.GameOverPanel.SetActive(true);
//fi you want to save only the highest score then compare the current score with saved score and if more save the new score
//eg:- if correctAnswerCount > PlayerPrefs.GetInt(currentCategory) then call below line
//Save the score
PlayerPrefs.SetInt(currentCategory, correctAnswerCount); //save the score for this category
}
}
//Datastructure for storeing the quetions data
[System.Serializable]
public class Question
{
public string questionInfo; //question text
public QuestionType questionType; //type
public Sprite questionImage; //image for Image Type
public AudioClip audioClip; //audio for audio type
public UnityEngine.Video.VideoClip videoClip; //video for video type
public List<string> options; //options to select
public string correctAns; //correct option
}
[System.Serializable]
public enum QuestionType
{
TEXT,
IMAGE,
AUDIO,
VIDEO
}
[SerializeField]
public enum GameStatus
{
PLAYING,
NEXT
}Editor is loading...