Quiz Master - 2 (7강- 완 )

2025. 11. 6. 01:15·유데미/C# Unity 2D

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" 스크립트가 붙어 있기 때문이에요.

🧩 구조를 풀어서 보면

  1. Unity의 OnClick() 이벤트는
    버튼이 눌렸을 때 실행할 함수를 가진 컴포넌트를 찾아요.
  2. 그래서 OnClick에 연결한 건
    QuizCanvas (Quiz) 오브젝트죠.
    이 오브젝트에는 Quiz라는 C# 스크립트 컴포넌트가 붙어있어요.
  3. 유니티는 “QuizCanvas” 안의 컴포넌트를 전부 스캔해서,
    “호출 가능한 public 메서드”를 찾아 보여줍니다.

    그래서 드롭다운에 이렇게 구조가 나와요:
  4. 즉, Quiz라는 이름은 C# 스크립트의 클래스명이에요.
    유니티는 컴포넌트 이름을 그 스크립트의 클래스 이름으로 표시해요.

✅ 조건 요약

이게 뜨려면 세 가지가 반드시 만족해야 해요 👇
① 스크립트 이름 = 클래스 이름이 동일해야 함
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
'유데미/C# Unity 2D' 카테고리의 다른 글
  • Quiz Master - 1 (1강 - 6강)
  • Snow Boarder - 3 (42강-완)
  • Snow Boarder - 2 (35-41강)
  • Snow Boarder - 1 (29-34강)
피까츄
피까츄
프로그래밍 마스터가 될테야
  • 피까츄
    프로그래밍 마스터
    피까츄
  • 전체
    오늘
    어제
    • 분류 전체보기 (87)
      • 컴퓨터가 이상해요 모음집 (5)
      • 프로그래밍 (0)
      • 회고 (1)
      • 1학년 (21)
        • 명품 HTML+CSS+JS (10)
        • 쉽게 배우는 C언어 Express (2)
        • R언어 (9)
      • 2학년 (3)
        • C언어로 쉽게 풀어쓴 자료구조 (1)
        • 프로그래밍 언어론 (2)
      • 개인공부 (25)
        • 백준 (17)
        • 코드트리 JS (7)
        • 코테 공부 (1)
      • 챌린지 (1)
        • Do it C++ 코테 6주 챌린지 (1)
      • 교재 (14)
        • 이것이 C++이다 (3)
        • 이것이 JAVA다 (0)
        • 혼자 공부하는 컴퓨터구조 + 운영체제 (1)
        • 혼자 공부하는 데이터통신 (0)
        • 코어 자바스크립트 (8)
        • OpenGL로 배우는 3차원 컴퓨터 그래픽스 (2)
      • 유데미 (11)
        • 100일 코딩 챌린지 (3)
        • C# Unity 2D (8)
      • 기타 (0)
        • 24주 게임 프로그래밍 챌린지 (5)
  • 블로그 메뉴

    • 방명록
    • 그림블로그
    • 3D 블로그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    작업표시줄클릭안됨
    우분투java
    가상현실 설정
    the package javax.swing is not accessible
    우분투 설치 오류
    0x80370102오류코드
    js #자바스크립트_기초
    HTML5+CSS3+Javascript 웹 프로그래밍 #연습문제 #이론문제 #실습문제 #풀이 #정답
    vscode자동완성
    윈도우 기능 켜기
    우분투C
    프로그래밍언어론
    복습
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
피까츄
Quiz Master - 2 (7강- 완 )
상단으로

티스토리툴바