1. 텍스트 메쉬 프로 UGUI
스크럽터블 오브젝트를 만들었으니까, 이를 UI에 연결하면 된다
먼저 Quiz Canvas 인스펙터를 우클릭해서 새로운 스크립트를 만든다
start 함수 위에 QuestionSO question; 을 써주는데
다른 스크립트의 이름과 관련된 변수도 사용할 수 있다!
TestMeshPro를 스크립트에서 이용하기 위해서는 using TMPro; 가 최상단에 필요하다
이걸 넣으면 TextMeshProUGUI을 사용할 수 있고, (타입같은거?)

SerializeField를 통해 인스펙터에서 확인가능하다
이제 QuestionText를 넣어서 문제 공간과 Question을 연결할 수 있다
2. 루프
버튼을 보이게 설정할건데,
start함수 안에
TextMeshProUGUI buttonText = answerButtons[0].GetComponentInChildren<TextMeshProUGUI>();
buttonText.text = question.GetAnswer(0);
을 추가해서 첫번째 버튼 안에 첫번째 선택지를 넣을 수 있다
다만 선택지는 4개
이걸 반복해야하니 4번을 복붙할 수도 있는데, 그걸 편하게 해주는 게 for loop이다
loop는 조건이 만족할 때까지 반복하는 것이다
for (int i=0; i<n; i++) {
반복할 것
}
기본 형태는 이렇게 생겼다
int i=0; 은 반복 전에 무조건 한 번 실행된다. 초기화문이라고도 했던 것 같다
이 때 설정한 i가 i<n을 만족할 때까지 i++ , i에 1을 더한다
3. 스와핑 스프라이트
정답을 선택하면 빨간색으로 바뀌게 바꿀거다
public void OnAnswerSelected(int index)
{
Image buttonImage;
if (index == question.GetCorrectAnswerIndex())
{
questionText.text = "맞았습니다!";
buttonImage = answerButtons[index].GetComponent<Image>();
buttonImage.sprite = correctAnswerSprite;
}
else
{
correctAnswerIndex = question.GetCorrectAnswerIndex();
string correctAnswer = question.GetAnswer(correctAnswerIndex);
questionText.text = "틀렸습니다... 정답은 " + correctAnswer;
buttonImage = answerButtons[correctAnswerIndex].GetComponent<Image>();
buttonImage.sprite = correctAnswerSprite;
}
}
}
코드는 다음과 같고 나도 이해 잘 못해서 나중에 덧붙이겠다
아직은 감이 안 잡혔다


버튼을 클릭해서 On click()에 Runtime Only 밑에 QuizCanvas를 드래그해서 넣고
No function을 클릭해서 Quiz

Quiz -> OnAnswerSelected(int)를 클릭해준다
근데 이거 어떻게 선택되는 거지 궁금해서...물어봤다
QuizCanvas 오브젝트에 Quiz 스크립트가 붙어 있기 때문이라한다
그러고보니 나는 QuizCanvas에 Quiz 스크립트를 넣었다
💡 요약 먼저Quiz가 저기 드롭다운에 뜨는 이유는👉 QuizCanvas 오브젝트에 "Quiz" 스크립트가 붙어 있기 때문이에요. 🧩 구조를 풀어서 보면
✅ 조건 요약이게 뜨려면 세 가지가 반드시 만족해야 해요 👇① 스크립트 이름 = 클래스 이름이 동일해야 함 Quiz.cs 파일 안에 public class Quiz : MonoBehaviour 있어야 함 ② public 함수여야 함 public void OnAnswerSelected(int index) ③ 스크립트가 대상 오브젝트(여기선 QuizCanvas)에 붙어 있어야 함 Hierarchy에서 QuizCanvas를 보면 Quiz 스크립트가 컴포넌트로 붙어 있어야 함 |
4. 버튼 상태
이번에는 오답을 선택한 뒤 정답을 클릭하면 정답처리되는 문제를 해결할 것이다

버튼튼은 Interactable을 비활성화하면 더 이상 작동하지 않는다
public class Quiz : MonoBehaviour
{
[SerializeField] TextMeshProUGUI questionText;
[SerializeField] QuestionSO question;
[SerializeField] GameObject[] answerButtons;
int correctAnswerIndex;
[SerializeField] Sprite defaultAnswerSprite;
[SerializeField] Sprite correctAnswerSprite;
void Start()
{
DisplatQuestion();
}
public void OnAnswerSelected(int index)
{
Image buttonImage;
if (index == question.GetCorrectAnswerIndex())
{
questionText.text = "맞았습니다!";
buttonImage = answerButtons[index].GetComponent<Image>();
buttonImage.sprite = correctAnswerSprite;
}
else
{
correctAnswerIndex = question.GetCorrectAnswerIndex();
string correctAnswer = question.GetAnswer(correctAnswerIndex);
questionText.text = "틀렸습니다... 정답은 " + correctAnswer;
buttonImage = answerButtons[correctAnswerIndex].GetComponent<Image>();
buttonImage.sprite = correctAnswerSprite;
}
SetButtonState(false);
}
void GetNextQuestion()
{
SetButtonState(true);
SetDefaultButtonSprites();
GetNextQuestion();
}
void DisplatQuestion()
{
questionText.text = question.GetQuestion();
for (int i = 0; i < answerButtons.Length; i++)
{
TextMeshProUGUI buttonText = answerButtons[i].GetComponentInChildren<TextMeshProUGUI>();
buttonText.text = question.GetAnswer(i);
}
}
void SetButtonState(bool state)
{
for (int i = 0; i < answerButtons.Length; i++)
{
Button button = answerButtons[i].GetComponent<Button>();
button.interactable = state;
}
}
void SetDefaultButtonSprites()
{
for (int i=0; i<answerButtons.Length; i++)
{
Image buttonImage = answerButtons[i].GetComponent<Image>();
buttonImage.sprite = defaultAnswerSprite;
}
}
}
SetDefaultButtonSprirtes()를 직접 작성하게 하셨던 것 같은데 잘 맞춰서 기분이 좋았던 기억이 난다
너무 오래전에 쓴 거라 코드만 대충 붙여본다...
논리는 나중에 적어보자...
헐 근데 넘 바빠서 나중에 적을거임
'유데미 > C# Unity 2D' 카테고리의 다른 글
| Quiz Master - 1 (1강 - 6강) (0) | 2025.10.28 |
|---|---|
| Snow Boarder - 3 (42강-완) (0) | 2025.09.25 |
| Snow Boarder - 2 (35-41강) (1) | 2025.08.31 |
| Snow Boarder - 1 (29-34강) (0) | 2025.08.22 |
| Delivery Driver - 3 (21-강의 완) (3) | 2025.08.20 |