- Home /
Why my bool isnt working
So my code is taken from here https://www.youtube.com/watch?v=G9QDFB2RQGA&t=919s, but this code is Onbutton system and my game is using OntriggerEnted2D, because i want my player collision answers. I can get only wrong answers or correct, but right now this code is only getting wrong answers. Inspector is showing isCorrect is true, but Debug.Log is writing only wrong answer... I dont know what to do. And there is more problems coming, because sometimes after first question there may not be right answers at all. I dont know is this happening because i Destroy(gameObject); and i have put right picture too what question is... I am bit late for this project and i want end this nightmare, because i dont have a clue what to do anymore and i am very noob at c#. I would be very grateful if somebody can help. My codes are in comments.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AnswerScript : MonoBehaviour
{
public bool isCorrect = false;
public QuizManager quizManager;
public void Answer()
{
if (isCorrect)
{
quizManager.Correct();
Debug.Log("Correct Answer");
}
else
{
quizManager.Wrong();
Debug.Log("Wrong Answer");
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class QuizManager : MonoBehaviour
{
public List<QuestionsAndAnswers> QnA;
public GameObject[] options;
public int currentQuestion;
public GameObject ImagePanel;
public GameObject Quizpanel;
public GameObject GoPanel;
public Text QuestionTxt;
public Text ScoreTxt;
int totalQuestions = 0;
public int score;
private void Start()
{
totalQuestions = QnA.Count;
GoPanel.SetActive(false);
GenerateQuestion();
}
public void Retry()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void GameOver()
{
ImagePanel.SetActive(false);
Quizpanel.SetActive(false);
GoPanel.SetActive(true);
ScoreTxt.text = score + "/" + totalQuestions;
}
public void Correct()
{
score += 1;
QnA.RemoveAt(currentQuestion);
StartCoroutine(WaitForNext());
}
public void Wrong()
{
QnA.RemoveAt(currentQuestion);
StartCoroutine(WaitForNext());
}
IEnumerator WaitForNext()
{
yield return new WaitForSeconds(1);
GenerateQuestion();
}
void SetAnswers()
{
for (int i = 0; i < options.Length; i++)
{
options[i].GetComponent<AnswerScript>().isCorrect = false;
options[i].transform.GetChild(0).GetComponent<Text>().text = QnA[currentQuestion].Answers[i];
if (QnA[currentQuestion].CorrectAnswer == i + 1)
{
options[i].GetComponent<AnswerScript>().isCorrect = true;
Debug.Log("Ball" + i + "is right!");
}
}
}
void GenerateQuestion()
{
if (QnA.Count > 0)
{
currentQuestion = Random.Range(0, QnA.Count);
QuestionTxt.text = QnA[currentQuestion].Question;
ImagePanel = QnA[currentQuestion].Image;
SetAnswers();
}
else
{
GameOver();
Debug.Log("Out of Questions");
}
}
}
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
public class DestroyBall : MonoBehaviour
{
public AnswerScript answerScript;
// Start is called before the first frame update
private void OnTriggerEnter2D(Collider2D collision)
{
answerScript.Answer();
Destroy(gameObject);
Debug.Log("Osuma!");
}
}
using UnityEngine;
[System.Serializable]
public class QuestionsAndAnswers
{
public string Question;
public string[] Answers;
public int CorrectAnswer;
public GameObject Image;
}
Answer by Riiich · Sep 01, 2021 at 07:38 PM
It seems you're only using a single AnswerScript
but it's hard to tell because I'm not sure how you're using these scripts. What does your scene look like? Could you show a few screenshots of the inspector on several of the questions?
Most people upload to Imgur - it's better to keep everything here in case other people want to help - can you record a video of what happens?
Ok. ty for that info. https://imgur.com/a/1bZdcv6
I'm honestly not sure, my most used tip when debugging is to use Debug.Log("NameOfClass.cs:NameOfMethod() - extra info");
every single time a method is called and every step in the process to find out where the issue lies
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
public class DestroyBall : MonoBehaviour
{
public AnswerScript ball;
// Start is called before the first frame update
private void OnTriggerEnter2D(Collider2D collision)
{
ball = gameObject.GetComponent<AnswerScript>();
ball.Answer();
Destroy(gameObject);
Debug.Log("Osuma!");
}
}
Answer by bubzy · Sep 01, 2021 at 09:45 PM
you've made it public, it will permanently be set to whatever state it is in in the inspector