[Skill] 대화 시스템



게임에서 많이 쓰이는 대화 시스템을 만들어 보겠다. 자료들은 케이디님의 자료를 다운 받아서 사용하였다.

여기서 만드는 것은 간단한 대화 시스템이라 이런식으로 만드는 것이고 RPG형식의 게임에서 퀘스트 받을 떄 나오는 대화 시스템은 다른 기법으로 만드는 것이 좋다. 우선 간단한 대화 시스템을 만들기 전에 스프라이트 이미지와 스프라이트가 그려질 캔버스를 따로 생성해서 세팅을 해주자.

1.스프라이트 이미지와 대화창을 정렬할 수 있도록 캔버스 오브젝트를 하나 만들고 이름을 Sprite Canvas로 바꿔준다.

2.캔버스 오브젝트의 컴포넌트 중에서 Canvas 컴포넌트의 프로퍼티인 Render Mode를 Screen Space-Camera로 바꿔서 카메라를 따라 다니게 만들어준다.

3.Canvas 컴포넌트의 프로퍼티 중 Render Camera에 Main Camera를 할당해준 다음 Plane Distance를 1로 바꿔주면 다음과 같은 화면 구성이 된다.

image

메인 카메라 앞에 캔버스가 그려진 것을 확인할 수 있다.

4.하이어라키 창에 있는 Gameobject를 StandingCG로 이름을 바꿔주고 Sprite Canvas의 자식 오브젝트로 넣어준다음 포지션의 좌표값을 화면의 우측에 보이도록 바꾸고 크기도 알맞게 줄여준다. 여기서는 다음과 같이 설정하겠다.

image

5.Standing Cg를 복사한 다음 이름을 Dialogue_Bar라고 이름을 바꾸고 Sprite를 대화창으로 바꿔준다음 화면 아래로 옮긴다.그리고 스프라이트가 그려질 순서를 바꿔준다.(대화창에 캐릭터에 가려지면 안되기 때문) 여기서는 Order in Layer를 1로 바꿔줘서 해결한다.

image

6.이제 대화가 나올 Text UI도 만들어 주고 셋팅을 해주자. 다음과 같이 셋팅하면 된다.

image

그리고 원래는 이렇게만 하면 텍스트는 보이지 않는다. 이 다음으로 Sprite Canvas의 Order in Layer를 2로 바꿔주면 위와같이 텍스트가 보인다.

  1. 우리는 버튼이 클릭 되었을 때 대화가 시작하게끔 만들 것이기 때문에 새로운 캔버스와 버튼UI도 만들고 세팅해주고 처음 상태는 전부 비활성화 시킨다.

image

이제 셋팅은 끝났으니 스크립트로 동작할 수 있게 로직을 짜 보자.

스크립트는 아래와 같다. 설명은 코드안에 들어 있다.

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

[System.Serializable] //이걸 선언해야 인스펙터창에서 Dialogue형 변수가 보임
public class Dialogue //대사와 스프라이트들을 관리해줌
{
    [TextArea]//한 줄 말고 여러줄 쓸 수 있게 해줌
    public string dialogue; //대사
    public Sprite cg;//캐릭터 스프라이트
}
public class Test : MonoBehaviour
{
    [SerializeField] private SpriteRenderer sprite_StandingCG;//이걸 통해서 스프라이트를 바꿔줌
    [SerializeField] private SpriteRenderer sprite_DialogueBox;//대화창임
    [SerializeField] private Text txt_Dialogue;  //대화 텍스트

    private bool isDialogue=false;//현재 대화 진행중인지 체크 (대화중일 때는 다음대화로 스킵x)
    private int count = 0;//대화가 얼마나 진행 되었는지 알아야함

    [SerializeField] private Dialogue[] dialogue; // 스프라이트와 대사가 여러개 있을 수 있도로 배열로 선언

    public void ShowDialogue() //버튼이 눌리면 실행 될 함수
    {
        //버튼이 눌리기 전까지 오브젝트들은 비활성화 되어 있기 때문에 활성화 해준다.
        OnOff(true);

        count = 0; //대화가 처음부터 실행 되도록 초기화
        NextDialogue(); //처음 시작하자마자 대사가 나와야해서 호출
    }

    private void OnOff(bool flag) //현재 대화중인지와 오브젝트 활성화,비활성화를 결정해줌
    {
        sprite_DialogueBox.gameObject.SetActive(flag); //대화창
        sprite_StandingCG.gameObject.SetActive(flag); //스프라이트
        txt_Dialogue.gameObject.SetActive(flag); //텍스트
        isDialogue = flag;
    }

    private void NextDialogue()//스페이스바를 누를 때 마다 대화를 진행 할 함수
    {
        txt_Dialogue.text = dialogue[count].dialogue; //미리 지정해둔 n번째 대사를 넣어줌
        sprite_StandingCG.sprite = dialogue[count].cg;//미리 지정해둔 n번째 스프라이트를 넣어줌
        count++; 
    }
    void Update()
    {
        if (isDialogue)
        {
            if (Input.GetKeyDown(KeyCode.Space))//스페이스바를 눌렀을 때
            {
                if (count < dialogue.Length) //내가 설정해둔 대사와 스프라이트의 갯수보다 적을 때
                {
                    NextDialogue(); //다음 대새와 스프라이트를 출력
                }
                else //대화가 끝나면
                {
                    OnOff(false);// 다 비활성화
                }
            }
        }
    }
}

이제 유니티로 돌아가서 셋팅을 해주면 끝이다.

1.새로 생성한 Canvas에 만든 스크립트를 부착하고 다음과 같이 셋팅한다.

image

2.새로 만든 버튼UI에 OnClick()에 canvas를 할당하고 만들어둔 함수와 연결해준다.

image-20220315162523965

이제 실행하고 대화 시작 버튼을 누르고 스페이스바를 누르면 화면에 대사와 스프라이트가 계속해서 바뀌는 걸 확인 가능하다.

image

스페이스바 누르면

image

스페이스바 누르면

image

스페이스바 누르면

image-20220315162726865

스페이스바 누르면 대화가 끝났기 때문에 전부 비활성화 된다.

image




© 2022. by KSC

Powered by sora