03/15 본캠프 #57

guno park·2024년 3월 15일
0

본캠프

목록 보기
57/77
post-thumbnail
post-custom-banner

Dialouge 시스템 구성하기

실제 사용할 법한 대화 구성해보기

여러가지 대화 패턴이 있을 것이나 지금 생각나는 것 중 한 가지를 구성해보았다.

Type 1. 특정 선택지의 경우 반복해야 할 수도 있다.

Type 2. 선택지를 고르고 나면 계속 진행되는 경우

Type 3. 일반적인 대화

여기서 Type1과 3을 섞어서 만들어 보았다.

데이터 정리

엑셀 시트

선택지가 몇개나 있을지도 모르기때문에 무작정 필드를 늘리는 것보다 배열로 관리하는게 좋다고 판단했다.

선택지가 5개 있는 경우에 \를 Split 기점으로 삼아 배열로 분리되게 만들었다.

직렬화 데이터 타입 변경

일반 string에서 배열로 변경되었기에 그에 맞게 타입도 수정해주었다.

그리고 Next_log를 Int로 타입을 변경해주며 json역직렬화 시 int값이 비어있으면 발생하는 에러를 처리하기 위해 사용하지 않는 부분이라도 0이라는 기본값을 할당해주었다.

선택지 버튼 관리

선택지를 관리하는데 Vertical Rayout Group을 사용해보았다.
GameObject가 IsActive일 때에만 정렬이 일어나기 때문에 데이터에서 받은 선택지의 길이를 바탕으로 해당하는 만큼만 버튼을 키고 값을 세팅해주도록 하였다.

 for (int i=0; i < data.Event_Log.Length;i++)
        {
            choice_btn[i].gameObject.SetActive(true);
            choice_btn[i].GetComponentInChildren<TextMeshProUGUI>().text = data.Event_Log[i];
        }

위와 같이 버튼을 사용하기 위해 각 버튼이 선택지의 몇번째 배열을 가리키고 있는 지 알아야 한다.

트러블 슈팅

for (int i = 0; i < choice_btn.Length; i++)
        {            
            choice_btn[i].onClick.AddListener(() => btnclick(index));
        }

위와 같이 작성할 경우 버튼을 클릭할 때 모든 인덱스 값들이 길이+1만큼 나오게 된다.

그 이유는 클로저 문제로 모든 버튼이 마지막 인덱스 값으로 클로저를 캡처하게 된다.
이를 해결하기 위해서는 각 버튼의 클릭 이벤트 핸들러를 설정할 때 해당 버튼의 인덱스 값을 캡처해야 한다.

for (int i = 0; i < choice_btn.Length; i++)
{
    int index = i; // 현재 인덱스 값을 새로운 변수에 저장
    choice_btn[i].onClick.AddListener(() => btnclick(index));
}

대화 스킵버튼 만들기

WebGL로 빌드해서 사용해보았을 때, KoreanTyper(코루틴)가 동작하는 속도가 에디터에서 run 시켰을 때보다 확연하게 느리다.
그런 부분을 고려해서 대화를 한 번에 띄워주는 기능이 필요하다고 생각했다.

기존에는 코루틴을 사용하여 한글자씩 천천히 나오지만, 스킵 버튼을 누르면 모든 코루틴을 정지하고 대화의 text에 입력되어야 할 값을 바로 집어넣도록 하였다.

 private void PloatingAllText()
    {
        StopAllCoroutines();
        _skipbtn.gameObject.SetActive(false);
        Dialogue_Data dialogueData = DataManager.instance.dic.DialogueDic[contextcount];
        _chatTxt.text = dialogueData.Log;
        FindNextLog();
        _confirmbtn.gameObject.SetActive(true);// = false;
    }

그리고 스킵 버튼을 대화가 출력되는 중에만 눈에 보이도록 코루틴이 시작될 때 Active, 끝날때는 Inactive 하였다.

post-custom-banner

0개의 댓글