Files
old-profesoratom/Assets/Scripts/Quiz2Controller.cs
Mediha Zukic 2073e620f1 New font
2017-05-22 11:16:43 +03:00

270 lines
9.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Quiz2Controller : MonoBehaviour {
public Text counterText;
public Text scoreText;
public GameObject[] answerModels;
// References to answers
private List<GameObject> answers;
private const int numberOfAnswers = 2;
private const int scoreCorrectAnswer = 10;
private const int scoreIncorrectAnswer = -15;
private const int scoreTimedOut = 0;
private const int totalGameTime = 90;
private float totalTimePerQuestion;
private int scoreValue;
private int questionIdx = 0;
private float counterValue;
private float counterPerQuestionValue;
private int selectedAnswerIdx;
// Positions for answers 1, 2, 3 and 4
private Vector3[] answerPositions = new Vector3[]
{
new Vector3(-10, 10, -5),
new Vector3(10, 10, -5)
};
private Vector3 answerScale = new Vector3(0.15f, 0.15f, 0.15f);
// List of questions and correct answers
List<Question> questions = new List<Question>() {
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.ZARNA_SIJALICA, "Sijalica"),
new Answer(AnswerObjectModel.STEDNA_SIJALICA, "Štedna sijalica")}),
new Question(new int[] {1},
new Answer[] {
new Answer(AnswerObjectModel.KLIMA, "Klima"),
new Answer(AnswerObjectModel.VENTILATOR, "Ventilator")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.STRUJA, "Struja"),
new Answer(AnswerObjectModel.SOLARNI_PANEL, "Solarni panel")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.AUTO, "Auto"),
new Answer(AnswerObjectModel.BICIKLO, "Biciklo")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.PAPIRI, "Papiri"),
new Answer(AnswerObjectModel.EMAIL, "Email")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.STARI_PROZOR, "Stari prozor"),
new Answer(AnswerObjectModel.NOVI_PROZOR, "Novi prozor")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.KANTA_ZA_SMECE, "Kanta za smeće"),
new Answer(AnswerObjectModel.KANTA_ZA_RECIKLIRANJE, "Kanta za recikliranje")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.FRIZIDER, "Frižider"),
new Answer(AnswerObjectModel.FRIZIDER_PLUS, "Frižider A++")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.TERMOSTAT_28, "Termostat 28°C"),
new Answer(AnswerObjectModel.TERMOSTAT_25, "Termostat 25°C")}),
new Question(new int[] {1},
new Answer[] {
new Answer(AnswerObjectModel.TAMNA_FASADA, "Tamna fasada"),
new Answer(AnswerObjectModel.SVIJETLA_FASADA, "Svijetla fasada")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.PROZOR_BEZ_ROLETNE, "Prozor sa dignutom roletnom"),
new Answer(AnswerObjectModel.PROZOR_SA_ROLETNOM, "Prozor sa spuštenom roletnom")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.PLASTICNA_KESA, "Plastična kesa"),
new Answer(AnswerObjectModel.CEKER, "Ceker")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.RUCNO_PRANJE_SUDJA, "Pranje suđa na ruke"),
new Answer(AnswerObjectModel.MASINA_ZA_SUDJE, "Mašina za suđe")}),
new Question(new int[] {2},
new Answer[] {
new Answer(AnswerObjectModel.UPALJENA_CESMA, "Voda curi dok četkaš zube"),
new Answer(AnswerObjectModel.UGASENA_CESMA, "Gasiš vodu dok četkaš zube")}),
new Question(new int[] {1},
new Answer[] {
new Answer(AnswerObjectModel.STRIK, "Štrik"),
new Answer(AnswerObjectModel.SUSILICA, "Sušilica za veš")}),
};
// Use this for initialization
void Start () {
scoreValue = 0;
counterValue = 0;
counterPerQuestionValue = 0;
totalTimePerQuestion = totalGameTime / questions.Count;
answers = new List<GameObject>();
UpdateCounter();
UpdateScore();
InstantiateAnswers();
UpdateScene();
}
// Update is called once per frame
void Update () {
// TODO: Game over
if (counterValue > totalGameTime)
SceneManager.LoadScene("EntryScene");
counterValue += Time.deltaTime;
UpdateCounter();
// Next pair
if(counterPerQuestionValue > totalTimePerQuestion)
{
counterPerQuestionValue = 0;
LoadNextPair();
}
else
counterPerQuestionValue += Time.deltaTime;
// Select answers event handler
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100))
{
Debug.Log(hit.transform.gameObject.name);
selectedAnswerIdx = GetAnswerIdx(hit.transform.gameObject.name);
counterPerQuestionValue = 0;
LoadNextPair();
}
}
}
/// <summary>
/// Instantiates all answer objects
/// </summary>
private void InstantiateAnswers()
{
for (int qIdx = 0; qIdx < questions.Count; ++qIdx)
{
for (int ansIdx = 0; ansIdx < numberOfAnswers; ++ansIdx)
{
Answer ans = questions[qIdx].getPossibleAnswers()[ansIdx];
string answerName = "Answer" + (qIdx * numberOfAnswers + ansIdx + 1).ToString();
InstantiateAnswerObject(answerName, ansIdx, ans.getAnswerModel(), ans.getAnswerCaption());
}
}
}
/// <summary>
/// Instantiates answer object according to its type and sets its transform
/// </summary>
/// <param name="answerName"></param>
/// <param name="answerIdx"></param>
/// <param name="model"></param>
/// <param name="answerCaption"></param>
private void InstantiateAnswerObject(string answerName, int answerIdx, AnswerObjectModel model, string answerCaption)
{
GameObject answerGameObject = Instantiate(answerModels[(int)model]) as GameObject;
answerGameObject.SetActive(true);
answerGameObject.name = answerName;
answerGameObject.transform.position = answerPositions[answerIdx];
answerGameObject.transform.localScale = answerScale;
answerGameObject.GetComponent<ObjectController>().modelCaption.text = answerCaption;
answers.Add(answerGameObject);
}
void LoadNextPair()
{
scoreValue += GetScore();
if (scoreValue < 0)
scoreValue = 0;
UpdateScore();
questionIdx = questionIdx + 1;
if (questionIdx == questions.Count)
SceneManager.LoadScene("EntryScene");
else
UpdateScene();
}
/// <summary>
/// Updates score value - called from Update() method
/// </summary>
private void UpdateScore()
{
scoreText.text = scoreValue.ToString();
}
/// <summary>
/// Updates counter value - called from Update() method
/// </summary>
private void UpdateCounter()
{
counterText.text = counterValue.ToString("f0");
}
/// <summary>
/// Updates scene with new question and related answers
/// </summary>
private void UpdateScene()
{
// Set answers for selected question
for (int i = 0; i < answers.Count; i++)
{
if (i >= numberOfAnswers * questionIdx && i < numberOfAnswers * (questionIdx + 1))
{
answers[i].SetActive(true);
}
else
answers[i].SetActive(false);
}
}
/// <summary>
/// Returns answer index (X) from answer's name (AnswerX)
/// </summary>
/// <param name="gameObjName">GameObject's name</param>
/// <returns></returns>
private int GetAnswerIdx(string gameObjName)
{
string resultString = Regex.Match(gameObjName, @"\d+").Value;
return System.Int32.Parse(resultString);
}
/// <summary>
/// Returns score for a particular question
/// </summary>
/// <returns></returns>
private int GetScore()
{
return IsAnswerCorrect(selectedAnswerIdx, questions[questionIdx].getCorrectAnswers()) ? scoreCorrectAnswer : scoreIncorrectAnswer;
}
private bool IsAnswerCorrect(int selectedAnswerIdx, int[] correctAnswers)
{
return ((selectedAnswerIdx % 2) ^ (correctAnswers[0] % 2)) == 0;
}
}