161 lines
4.1 KiB
C#
161 lines
4.1 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class PostTestMenu : Menu<PostTestMenu>
|
|
{
|
|
[Header("Questions")]
|
|
[SerializeField] TextMeshProUGUI questionText;
|
|
[SerializeField] List<QuestionSO> questions = new List<QuestionSO>();
|
|
[SerializeField] GameObject[] answerButtons;
|
|
|
|
[Header("Answers")]
|
|
[SerializeField] private Sprite normalButttonSprite;
|
|
[SerializeField] private Sprite trueAnswerSprite;
|
|
[SerializeField] private Sprite falseAnswerSprite;
|
|
|
|
[Header("UI")]
|
|
[SerializeField] TextMeshProUGUI timerText;
|
|
|
|
[Header("Settings")]
|
|
[SerializeField] float timeToComplete = 30f;
|
|
[SerializeField] float timeToShowAnswer = 10f;
|
|
|
|
float timer;
|
|
bool isAnswering = true;
|
|
bool hasAnsweredEarly = false;
|
|
int correctAnswerIndex;
|
|
|
|
QuestionSO currentQuestion;
|
|
bool isComplete = false;
|
|
|
|
SaveData saveData;
|
|
int correctAnswers = 0;
|
|
int totalQuestions = 9;
|
|
|
|
private async void OnEnable()
|
|
{
|
|
LoadRandomQuestion();
|
|
await LoadAndRefresh();
|
|
}
|
|
|
|
private async Task LoadAndRefresh()
|
|
{
|
|
saveData = await Cloudsave.LoadData<SaveData>("DataPlayer");
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (isComplete) return;
|
|
|
|
timer -= Time.deltaTime;
|
|
|
|
int minutes = Mathf.FloorToInt(timer / 60);
|
|
int seconds = Mathf.FloorToInt(timer % 60);
|
|
timerText.text = string.Format("{0:00}:{1:00}", minutes, seconds);
|
|
|
|
if (isAnswering && timer <= 0f)
|
|
{
|
|
ShowCorrectAnswer();
|
|
}
|
|
else if (!isAnswering && timer <= 0f)
|
|
{
|
|
LoadNextQuestion();
|
|
}
|
|
}
|
|
|
|
|
|
async void LoadRandomQuestion()
|
|
{
|
|
if (questions.Count == 0)
|
|
{
|
|
await EndGame();
|
|
return;
|
|
}
|
|
|
|
|
|
Image buttonImage;
|
|
int index = Random.Range(0, questions.Count);
|
|
currentQuestion = questions[index];
|
|
questions.RemoveAt(index);
|
|
|
|
questionText.text = currentQuestion.question;
|
|
|
|
for (int i = 0; i < answerButtons.Length; i++)
|
|
{
|
|
TextMeshProUGUI buttonText = answerButtons[i].GetComponentInChildren<TextMeshProUGUI>();
|
|
buttonImage = answerButtons[i].GetComponent<Image>();
|
|
buttonImage.sprite = normalButttonSprite;
|
|
buttonText.text = currentQuestion.GetAnswer(i);
|
|
answerButtons[i].GetComponent<Image>().color = Color.white;
|
|
answerButtons[i].GetComponent<Button>().interactable = true;
|
|
}
|
|
|
|
correctAnswerIndex = currentQuestion.answerIndex;
|
|
timer = timeToComplete;
|
|
isAnswering = true;
|
|
hasAnsweredEarly = false;
|
|
}
|
|
|
|
public void OnAnswerSelected(int index)
|
|
{
|
|
if (!isAnswering) return;
|
|
|
|
hasAnsweredEarly = true;
|
|
isAnswering = false;
|
|
timer = timeToShowAnswer;
|
|
|
|
foreach (GameObject btn in answerButtons)
|
|
{
|
|
btn.GetComponent<Button>().interactable = false;
|
|
}
|
|
|
|
Image selectedImage = answerButtons[index].GetComponent<Image>();
|
|
|
|
|
|
if (index == correctAnswerIndex)
|
|
{
|
|
correctAnswers++;
|
|
selectedImage.sprite = trueAnswerSprite;
|
|
questionText.text = "Jawaban Benar!";
|
|
}
|
|
else
|
|
{
|
|
selectedImage.sprite = falseAnswerSprite;
|
|
questionText.text = "Jawaban Salah";
|
|
}
|
|
saveData.postTestStatistik = (int)(((float)correctAnswers / totalQuestions) * 100f);
|
|
|
|
}
|
|
|
|
void ShowCorrectAnswer()
|
|
{
|
|
isAnswering = false;
|
|
timer = timeToShowAnswer;
|
|
|
|
foreach (GameObject btn in answerButtons)
|
|
{
|
|
btn.GetComponent<Button>().interactable = false;
|
|
}
|
|
|
|
questionText.text = "Waktu habis";
|
|
}
|
|
|
|
void LoadNextQuestion()
|
|
{
|
|
LoadRandomQuestion();
|
|
}
|
|
|
|
private async Task EndGame()
|
|
{
|
|
isComplete = true;
|
|
int finalScore = (int)(((float)correctAnswers / totalQuestions) * 100f);
|
|
saveData.postTestStatistik = finalScore;
|
|
await Cloudsave.SaveData(saveData, "DataPlayer");
|
|
MainMenu.Open();
|
|
}
|
|
}
|