글 작성자: Doublsb

저번 시간까지는 쉬운 에셋 사용 및 유지보수를 위해 Emotion 클래스를 개선했다.

밑작업은 했으니, 이제 다음 목표를 고려해보려 한다.

 

- 글자가 출력될 때마다 소리가 나야 한다. (Ex : 키보드 소리, 사람 소리 등)

- 문장 출력 도중 감정 표현을 위해 이미지가 변할 수 있어야 한다.

- 글자를 빠르게 나오거나, 느리게 나오도록 만들 수 있다.

- 글씨 색깔, 글씨 크기를 자유롭게 바꿀 수 있었으면 좋겠다.

 

이 세가지 목표를 고려했을 때, 입력 string에는 커맨드가 필요하다는 결론이 났다.

string 내에서 지정된 문자열을 사용해 명령을 내릴 수 있도록 만드는 것이다.

 

"(Emotion Smile) 안녕! (잠시 쉬었다가) (Emotion Normal) 내 이름은 (느려지기) ... (빨라지기) 캐릭터라고 해!"

 

이렇게 대사 중간 중간에, 여러가지 효과를 넣을 수 있는 커맨드를 만들어야 한다.

목표를 생각하며 만들 수 있는 커맨드를 정리해 보았다.

 


#1 커맨드

 

- Emotion 바꾸기

- 소리 재생하기

- 텍스트 재생 속도 변경하기

- 스킵 불가

- 상호작용을 해야 다음 텍스트로 넘어감

- 상호작용 하지 않아도 창이 닫힘

- 글자 색상 변경하기

- 글자 크기 변경하기

 

일단은 이 정도인 것 같고, 추후 생각나더라도 쉽게 유지보수할 수 있도록 클래스를 확장 가능하게 만들어야 할 듯 싶다.

또한 커맨드로 쓰일 식별자 char는 일반 텍스트 입력 시 쓰이지 않을 만한 문자여야 하므로, 일반적으로 통용되는 /로 정했다.

 

또한 일반 텍스트와 헷갈릴 수 있으므로, 커맨드는 /speedup/과 같이, 처음과 끝이 닫혀 있는 형태로 설계하려 한다.


#2 커맨드 이름 정하기

 

코딩에서 제일 까다로운 것 중 하나는 역시 이름 정하기가 아니겠는가?

커맨드가 너무 길면, 일반 텍스트를 편집하는 데 길어져 고생하게 될 것이다.

그렇다고 커맨드가 너무 짧아서, /su/같이 써 놓으면 내가 무슨 커맨드를 써 뒀는지 짐작할 수 없을 것이다.

 

이름 짓기 고찰의 시간을 가져보도록 하자. 어... 기능을 구현하면서 말이다.

그때쯤이면 무슨 이름으로 지을지 생각날 것이다. 아마도.


#3 상호작용할 수 있게 만들기

 

- 스킵 불가

- 상호작용을 해야 다음 텍스트로 넘어감

- 상호작용 하지 않아도 창이 닫힘

 

이 세가지를 위해 먼저 에셋에 상호작용 기능을 만들어야 한다.

지금은 무려 무엇을 누르더라도 창이 닫힌다거나, 다음 텍스트로 넘어가지 않는다.

 

윈도우를 클릭했을 때 다음 동작이 일어나도록 구현해 보자.

- 텍스트가 전부 표시된 상태가 아니라면, 전부 표시되도록 한다.

- 텍스트가 전부 표시된 상태라면, 창을 닫는다.

 

일단은 현재 상태를 체크하기 위한 Enum을 만들었다.

해당 Enum은 현재 Window가 열려 있는지, 텍스트를 출력 중인지, 혹은 입력 대기 중인지 등을 판단할 수 있다.

 

판별을 위해 코루틴의 시작 지점에 state를 변경하는 구문을 넣어주었다.

이렇게 하면 Window를 눌렀을 때, 스킵해야 하는지 창을 닫아야 하는지 알 수 있다.

 

자고로 Enum엔 Switch가 아닌가. Window 클릭 시 해당 함수가 작동한다.

그런데 좀 문제가 생겼다. Hide는 그냥 코루틴을 종료하고 창을 닫아버리면 되는데, Skip은 기능을 변경해야 했다.

 

바로 코루틴을 돌릴 때마다 속도를 조정하기 위해 WaitForSeconds를 사용하고 있었기 때문이다.

Skip 기능은 그럼 SpeakTime을 0으로 놓으면 되지 않을까? 라고 생각했지만, 그건 전혀 Skip이 아니었다.

 

왜냐면 SpeakTime을 0으로 둬도, 대기는 대기이므로 한 글자마다 1프레임은 대기하기 때문이었다.

 

이걸 해결하기 위해서는 입력받은 텍스트를 한꺼번에 전부 표시할 필요가 있었다.

말만 들으면 쉽지만, 해당 기능을 위해서는 변경해야 하는 추가 사항이 존재했다.

 

현재는 명령어를 한 글자를 출력하려 할 때마다 판단하여 처리하고 있었다.

ABCDE/apple/이라고 하면, A B C D E를 프레임마다 출력하다가, /를 판별한 프레임에 해당 명령어를 계산하여 처리한다.

 

그러므로, 한꺼번에 텍스트를 출력하기 위해서는 텍스트 내에서 명령어를 전부 덜어내야 했던 것이다.


#4 DialogText Class 만들기

 

뭐, 어쩔 수 있나. 고치기로 했다.

하지만 DialogManager에 입력받은 Text와 한꺼번에 출력할 Text를 따로 분리하여 변수로 저장해두는 것은 클래스를 복잡하게 만드는 요인이라고 생각했다.

 

그래서 DialogText 클래스를 만들기로 했다.

생성 시점에 '/'로 string을 split하여, originalText와 filteredText를 구분하여 저장할 수 있는 클래스이다.


#5 아니 이럴 필요가 있나?

 

그런데 곰곰이 생각해보니 그냥 SpeakTime이 0일 때에는 WaitForSeconds를 작동시키지 않으면 되는 것 아닌가?

 

해결했다.

 

조금 더 생각해서, Original Text와 Filtered Text를 나눠서 저장해 둘 필요가 있나 싶었는데,

저장해두는 게 메모리적으로도 별로인 것 같아서(의미는 없지만) 넘어가기로 했다.

 

DialogText 클래스는 지웠다 ^^

대신, Texting 코루틴은 읽기 쉽도록 추후 손볼 필요가 있어 보인다.


#6 글자 색상과 글자 크기 변경하기

 

남은 커맨드 밑작업은 글자 색상과 글자 크기를 변경하는 일이었다.

Rich Text를 가급적 쓰지 않고 해당 기능을 구현하려고 했었는데, 쓰는 쪽으로 생각을 해 보았다.

 

/color:red/와 같은 식으로 커맨드를 쓰면, <color=red>, </color>를 해당 위치에 추가하는 것으로 해결은 된다고 생각했다.

 

그러나 그러면 새 char가 출력될 때마다, <color=red> 'char' </color>를 추가해줘야 하는 것일까?

어... 더 좋은 방법이 있었으면 좋겠다. 찾아봐야겠다.

 

 

일단 오늘은 여기까지.

 

해당 커밋 보러가기

반응형