UI 세팅을 모두 마쳤으니, 본격적인 코드작업을 진행한다. 가장 먼저, 퀴즈 게임의 핵심이라고 할 수 있는 문제들을 scriptable object의 형태로 만들면 좋겠다.
여기서 scriptable object란, 일종의 '데이터 컨테이너'로 유니티에서 제공하는 대용량의 데이터를 저장하는 데 사용할 수 있다. 퀴즈 게임인 만큼 업데이트를 거듭할 수록 퀴즈의 수가 많아질 수 있는데, 이를 scriptable object의 형태로 만들어 주면 값의 사본이 생성되는 것을 방지하여 프로젝트의 메모리 사용을 줄일 수 있다. 다만, scriptable object는 Mono Behaviour과는 달리 게임 오브젝트에 컴포넌트로 부착할 수 없고 프로젝트의 에셋으로만 기능한다는 차이점이 존재한다.
scriptable object를 생성하기 위해서, 우선 QuestionSO라는 이름으로 스크립트를 하나 생성해 준다. 앞서 말했듯이, 우리가 만들어 줄 것은 Mono Behaviour이 아닌 scriptable object이기 때문에 스크립트 상단의 public class QuestionSO : Mono Behaviour을 수정하고 아래와 같이 코드를 작성해 준다.
// 게임 에셋으로 스크립터블 오브젝트를 생성할 수 있도록 해주는 코드
[CreateAssetMenu(fileName = "New Question", menuName = "Quiz Question")]
public class QuestionSO : ScriptableObject
{
// 인스펙터 상에 표시되는 글자의 행, 열
[TextArea(2, 6)]
// 퀴즈를 구성하는 요소들 선언 및 초기화
[SerializeField] string question = "Enter new question text here";
// 정답 선택지는 추후 개수 변동 가능성을 고려하여 리스트화
[SerializeField] string[] answers = new string[4];
// 정답 인덱스를 받을 변수
[SerializeField] int correctAnswerIndex;
// 문제를 반환하는 게터 메소드
public string GetQuestion()
{
return question;
}
// 정답 문자열을 반환하는 게터 메소드
public string GetAnswer(int index)
{
return answers[index];
}
// 정답 인덱스를 반환하는 게터 메소드
public int GetCorrectAnswerIndex()
{
return correctAnswerIndex;
}
}
이렇게 스크립트를 작성해 주면 아래와 같이 에셋에 스크립터블 오브젝트를 직접 생성할 수 있게 된다.
게터와 세터 메소드에 대한 정리는 velog 내 <프로그래밍!> 시리즈에 따로 해두었다.
아무튼, 이렇게 생성한 scriptable object를 통해 게임 진행에 사용되는 문제들을 생성하고 관리해 주도록 한다. 에셋 하위에 Questions라는 이름으로 폴더를 따로 만들어 주고, 여기에 scriptable object형태로 질문들을 만들어준다.
다음으로, Quiz라는 이름의 스크립트를 생성하여 게임의 핵심 메커니즘을 구현하고, 여태까지 만들어둔 UI를 연결해 준다.