🎮 Unity

[UNITY] 대화창 구현하기 / Scene 전환

dlalwl_jpg 2023. 8. 2. 20:29

게임 시작 전 캐릭터들의 대화씬을 위한 대화창을 구현해보자.

대화창을 클릭하면 다음 대화 텍스트가 바뀌고, 그에 맞게 캐릭터 이미지와 캐릭터 이름이 변경되도록 구현할 것이다.

그리고 대화와 끝나면 다음 씬으로 넘어가는 씬 전환까지 구현할 것이다.


1. 새로운 Scene 생성 및 배경 설정

Assets폴더 안의  Scenes폴더에서 마우스 우클릭 > Create > Scene으로 새로운 씬을 생성한 후 원하는 이름으로 변경한다.

(나중에 씬 전환을 위해 필요하다!)

 그 다음 게임 배경을 생성해준다. (게임 배경 생성 방법은 아래 글 참고!)

https://studybook.tistory.com/57

 

[UNITY] 게임 배경 설정하기

1. 게임 설명 게임 개발 동아리에서 게임 개발을 시작했다. 유니티를 처음 사용하게 되었는데 게임을 개발하면서 배우게 되는 유니티 사용 방법에 대해 정리할 예정이다. 내가 만들게 된 게임은

studybook.tistory.com


2. UI 배치하기

2-1. 대화창 UI 배치하기

GameObject에서 마우스 우클릭 > UI > Image를 클릭하면 Canvas와 EventSystem이 자동으로 생성된다.

Image를 원하는 이름으로 변경한 후 Canvas 아래, EventSystem 아래 위치시킨다.

Dialogue_box에서 마우스 우클릭 >  UI > Legacy >  Text를 클릭하여 대화텍스트 창을 생성해준다.

dialogue_text라는 텍스트 입력창을 생성하여 클릭하면 오른쪽에 inspector에서 기본값을 설정해준다.

그리고 Dialogue_box아래에 name_box와 name_text도 동일한 방법으로 생성해준다.


2-2. 캐릭터 UI 배치하기

EventSystem에서 마우스 우클릭 > Create Empty로 GameObject를 생성하여 character라는 이름으로 변경하고, 그 아래에 UI > Image를 클릭해 캐릭터를 생성한다. 이때 한 개만 만들고 복붙하여 사용하면 캐릭터의 위치와 크기를 똑같이 하여 조절할 수 있으니 더 편리하다. 

이미지까지 다 적용을 해주면 inspector에서 처음에 등장할 캐릭터를 제외하고 체크를 다 지워준다. (이미지를 비활성화 하는 것)


3. Script 작성하기

(전체 코드는 아래쪽에 있다!)

3-1. 대화창 클릭하면 대화 변경하기

Assets폴더 안의 Scripts 폴더 클릭 후 마우스 우클릭 > Create > C# Script를 클릭해 새 스크립트 생성 후 원하는 이름으로 변경한다.

그리고 아래와 같이 코드를 작성해준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class tori_start : MonoBehaviour, IPointerDownHandler
{
    public Text ScriptText_dialogue;
    public string[] dialogue
        = { "토리야 네가 내 usb 훔쳐 간 범인을 봤다던데 정말이야??",
            "나 좀 도와줘 제발..",
            "너도 날 도와주면 나도 널 도와줄게",
            "뭘 도와주면 될까??",
            "내 밭에 있는 당근이 너무 많아서 몇 개인지 모르겠어..!",
            "그런 거라면 문제없지! 내가 당근의 개수를 다 세주면 되는 거지??",
            "개수까지는 괜찮고, 홀수인지 짝수인지만 알려주면 돼!",
            "이번 게임은 홀짝 게임이야 잘 알고 있지??"
        };
    public int dialogue_count = 0;

    public void OnPointerDown(PointerEventData data)
    {
        dialogue_count++;
        Debug.Log(dialogue_count);

        if (dialogue_count == 8)
        {
            Debug.Log("대화 종료");
            dialogue_count = 0;
        }

        ScriptText_dialogue.text = dialogue[dialogue_count];
    }
}

[코드 설명]

대화 상자를 클릭하면 OnPointerDown 함수가 실행된다. 이 함수가 실행되면 dialogue_count가 1씩 증가한다. 그에 맞춰 dialogue 배열 안에 있는 대화가 순서대로 출력된다. 그리고 대화가 종료되면 dialogue_count를 초기화 시키고, console창에 대화 종료라고 띄운다.

여기서 IPointerDownHandler를 사용하였는데 이는 Text가 들어 있는 UI를 클릭하면 event를 발생시키는 역할을 한다. 즉, dialogue.text는 Dialogue_box라는 UI안에 있기 때문에 Dialogue_box만을 클릭해야 dialogue.text가 변경된다.


코드를 다 작성했으면 EventSystem의 inspector에 방금 작성한 스크립트를 드래그 해준다. 그리고 Script Text에 변경될 대화를 드래그 해준다.

실행하여 확인해보면 대화창을 클릭할 때마다 대화가 잘 변경되는 것을 확인할 수 있다.


3-2. Scene 전환하기

캐릭터들의 대화가 종료되면 다음 씬으로 넘어가도록 구현해보자. 나는 대화가 끝나면 앞서 만든 게임이 시작되는 씬으로 넘어가도록 할 것이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

public class tori_start : MonoBehaviour, IPointerDownHandler
{
    public GameObject chuchu1;
    public GameObject chuchu2;
    public GameObject chuchu3;
    public GameObject tori;
    public Text ScriptText_dialogue;
    public Text ScriptText_name;
    public string[] dialogue
        = { "토리야 네가 내 usb 훔쳐 간 범인을 봤다던데 정말이야??",
            "나 좀 도와줘 제발..",
            "너도 날 도와주면 나도 널 도와줄게",
            "뭘 도와주면 될까??",
            "내 밭에 있는 당근이 너무 많아서 몇 개인지 모르겠어..!",
            "그런 거라면 문제없지! 내가 당근의 개수를 다 세주면 되는 거지??",
            "개수까지는 괜찮고, 홀수인지 짝수인지만 알려주면 돼!",
            "이번 게임은 홀짝 게임이야 잘 알고 있지??"
        };
    public int dialogue_count = 0;

    public void OnPointerDown(PointerEventData data)
    {
        dialogue_count++;
        Debug.Log(dialogue_count);

        if (dialogue_count == 8)
        {
            SceneManager.LoadScene("tori_Game_Scene");
            dialogue_count = 0;
        }

        ScriptText_dialogue.text = dialogue[dialogue_count];
    }
}

[코드 설명]

대화글 8개가 다 출력되면 SceneManager.LoadScene(" ")안에 있는 tori_Game_Scene으로 넘어간다.


위와 같이 코드를 다 작성했으면 File > Build Settings를 클릭한 후 전환될 씬의 순서를 설정해준다. 전환할 씬이 없는 경우 Scene 폴더에서 Scenes In Build로 드래그 해주면 된다.

실행을 해보면 대화 종료 후 다음 씬(게임 시작 씬)으로 넘어가는 것을 확인할 수 있다.

마지막 대화(왼쪽) 후 게임 시작 씬으로 전환(오른쪽)


3-3. 캐릭터 및 캐릭터 이름 변경하기

아래와 같이 코드를 작성해준다. (전체 코드!)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

public class tori_start : MonoBehaviour, IPointerDownHandler
{
    public GameObject chuchu1;
    public GameObject chuchu2;
    public GameObject chuchu3;
    public GameObject tori;
    public Text ScriptText_dialogue;
    public Text ScriptText_name;
    public string[] dialogue
        = { "토리야 네가 내 usb 훔쳐 간 범인을 봤다던데 정말이야??",
            "나 좀 도와줘 제발..",
            "너도 날 도와주면 나도 널 도와줄게",
            "뭘 도와주면 될까??",
            "내 밭에 있는 당근이 너무 많아서 몇 개인지 모르겠어..!",
            "그런 거라면 문제없지! 내가 당근의 개수를 다 세주면 되는 거지??",
            "개수까지는 괜찮고, 홀수인지 짝수인지만 알려주면 돼!",
            "이번 게임은 홀짝 게임이야 잘 알고 있지??"
        };
    public int dialogue_count = 0;

    public void OnPointerDown(PointerEventData data)
    {
        dialogue_count++;
        Debug.Log(dialogue_count);

        if (dialogue_count == 8)
        {
            SceneManager.LoadScene("tori_Game_Scene");
            dialogue_count = 0;
        }

        ScriptText_dialogue.text = dialogue[dialogue_count];

        //추추 기본 이미지 활성화
        if (dialogue_count == 0 || dialogue_count == 3)
        {
            chuchu1.SetActive(true);
            chuchu2.SetActive(false);
            chuchu3.SetActive(false);
            tori.SetActive(false);
            ScriptText_name.text = "추추";
        }

        //추추 울음 이미지 활성화
        else if (dialogue_count == 1)
        {
            chuchu1.SetActive(false);
            chuchu2.SetActive(true);
            chuchu3.SetActive(false);
            tori.SetActive(false);
            ScriptText_name.text = "추추";
        }

        //추추 웃음 이미지 활성화
        else if (dialogue_count == 5)
        {
            chuchu1.SetActive(false);
            chuchu2.SetActive(false);
            chuchu3.SetActive(true);
            tori.SetActive(false);
            ScriptText_name.text = "추추";
        }

        //토리 이미지 활성화
        else if (dialogue_count == 2 || dialogue_count == 4 || dialogue_count == 6 || dialogue_count == 7)
        {
            chuchu1.SetActive(false);
            chuchu2.SetActive(false);
            chuchu3.SetActive(false);
            tori.SetActive(true);
            ScriptText_name.text = "토리";
        }
    }
}

[코드 설명]

대화 순서에 맞는 캐릭터를 활성화하고 대화에 맞지 않은 캐릭터들은 모두 비활성화해준다. 

그리고 대화 순서에 맞는 캐릭터의 이름도 같이 변경해준다. 


위와 같이 스크립트를 작성하고 EventSystem의 instector에 캐릭터 이미지와 이름 text를 드래그 또는 선택해준다.

게임을 실행해보면 캐릭터, 이름, 대화가 잘 바뀌고 대화 종료 후 씬이 잘 넘어가는 것을 확인할 수 있다.


[참고]

https://chameleonstudio.tistory.com/58

 

유니티 씬 전환(이동)하기 / SceneManagement / LoadScene

해당 티스토리 페이지는 필자가 유니티 C# 개발을 하면서 학습한 내용들을 기록하고 공유하는 페이지입니다 ! - 틀린 부분이 있거나, 수정된 부분이 있다면 댓글로 알려주세요 ! - 해당 내용을 공

chameleonstudio.tistory.com

https://welcomeheesuk.tistory.com/49

 

[유니티 C#] UI 터치영역 - 마우스, 터치 이벤트 만들기

이번 프로젝트를 진행하면서 겪은 시행착오를 공유하려고 합니다! 어려운것은 아니지만, 혹시 나중을 위해 정리해두겠습니다! 마우스 혹은 터치를 구현하게 되면 저 같은 경우에는 가장 먼저

welcomeheesuk.tistory.com