2-3. 유니티 2D 모바일 대화창 선택지에 따른 결과
선택지에 따른 결과가 나오도록 할것이다.
방법에는 여러가지가 있다.
선택지마다 대사가 달라지는 게임도 있고, 선택지를 모두 고르면 결과나 엔딩이 나오는 게임도 있고 선택지에 따라 정답과 오답이 갈리는 게임이 있다.
오늘 해볼건 가장 쉬운 정답과 오답이 정해져있어서 마지막 결과로 점수를 알려주는식으로 만들어 볼것이다.
우선 적당한 위치에 점수판을 만들어준다.
그리고 결과가 나오기 전까지는 보이면 안되니 비활성화 해둔다.
이전에 짠 코드를 보니 DialogueManager에서 해결하려고 했었는데 너무 복잡해지기도 하고 다른 식으로 결과를 만들고
싶을수도 있으니 Result라는 스크립트에 만들어 줄것이다.
Result 스크립트를 만들기 전에 문제풀이 형식으로 대화를 하기 위해 대사랑 선택지의 텍스트를 바꿔보았다.
GPT에게 컴퓨터공학과가 풀만한 객관식 문제를 만들어달라 했더니 이런식으로 만들어 주었다.
오늘도 고마워요 GPT.
이제 Result script를 만들어본다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Result : MonoBehaviour
{
private Queue<int> myChoices;
public Text ScoreText;
private int[] answers= {3,1,2,2};
private void Start()
{
myChoices = new Queue<int>();
}
public void myChoice(int number)
{
Debug.Log(number);
myChoices.Enqueue(number);
}
public void getScore()
{
int score = 0;
for(int i = 0; i < answers.Length; i++)
{
int myChoice = myChoices.Dequeue();
if (myChoice == answers[i])
{
score++;
}
}
ScoreText.gameObject.SetActive(true);
ScoreText.text = "점수: " + score.ToString();
}
}
getScore() 함수를 실행할 방법을 생각해야하는데, 가장 쉬운건 "결과확인" 버튼 같은걸 만들어주는것이지만 선택지가 끝나면 바로 결과를 보여주게 하고싶었다.
public void DisplayNextSentence()
{
for (int i = 0; i < choiceButtons.Length; i++)
{
choiceButtons[i].interactable = false;
choiceTexts[i].text = "";
}
if (sentences.Count == 0)
{
animator.SetBool("IsOpen", false);
FindObjectOfType<Result>().getScore();
}
else
{
string sentence = sentences.Dequeue();
StopAllCoroutines();
StartCoroutine(TypeSentence(sentence));
IEnumerator TypeSentence(string sentence)
{
dialogueText.text = "";
foreach (char letter in sentence.ToCharArray())
{
dialogueText.text += letter;
yield return new WaitForSeconds(textSpeed);
}
for (int i = 0; i < choiceButtons.Length; i++)
{
choiceButtons[i].interactable = true;
}
Queue<string> currentChoices = choices.Dequeue();
int size = currentChoices.Count;
for (int i = 0; i < size; i++)
{
choiceTexts[i].text = currentChoices.Dequeue();
}
}
}
}
DialogueManager의 DisplayNextSentence함수에 대화가 끝났을때 getScore함수를 실행하도록 추가해주었다.
이제 만든 Result script를 DialogueManager object에 넣어준다.
Score Text를 넣는곳에 아까 만들어둔 텍스트 object도 넣어준다.
그리고 3개의 ChoiceButton들의 onClick 함수에 myChoice가 실행되도록 넣어준다.
DisplayNextSentence의 인자를 없애버렸으므로 다시 설정해준다.
설정을 완료하면 결과를 확인할 수 있다.
대화창 뒤에 점수를 숨겨두는 것도 괜찮아보일거 같긴 하다.
-완-