우리들이 지난 시간에 일단 무작정 실행했던 프로젝트 코드를 하나씩 살펴보자.

일단 하라고 해서 하긴 했지만 저게 무슨 의미인지 얼핏 알 것 같으면서도 모를 수도 있을 것이다.

렌파이 학습에 앞서 파이썬이나 기타 프로그래밍 언어를 선행적으로 다뤄본 적이 있다면 대충 어떻게 돌아가는지 잘 알테지만 비슷한 것 조차 해보지 않았던 사람이라면 약간 혼란할 수도 있다.

하지만 걱정하지 말자. 하나씩 다 뜯어서 씹고 마시고 즐기다보면 다 알게되는 것들이다.


먼저 위의 코드들을 살펴보자. 대충 초록색으로 솰라솰라 써진 것들과 아닌 것들로 구분된다.

그리고 초록색으로 표시된 것들에게는 모두 공통점이 하나 있는데, 눈썰미가 있다면 바로 눈치 챌 수 있겠지만, 해당 문장의 제일 처음에 '#' 표시가 들어가 있다는 점이다.

그렇다면 과연 '#' 표시가 들어간 녹색 문장들은 대체 무엇을 의미하는 것일까?

대충보면 흡사 해시태그 느낌도 나지만 당연히 그런건 아니고 아주 단순한 의미를 지닌다.

저 녹색 글씨들은 전부다 '주석'처리된 것이다.


주석에 대한건 바로 다음시간에 다뤄보도록 하고 일단은 Say문에 대해 집중하기 위해 녹색 표시된것들은 코드상에서만 보이는 거고 실제 프로젝트에서는 전혀 영향을 주지 않는 유령같은 존재이므로 실제 게임에서는 전혀 영향을 주지 못하는 존재로 일단은 쌩 무시하고 지나가도록 한다.


일단은 '# 여기에서부터 게임이 시작합니다.' 밑에 있는 label start: 밑의 문구부터 보도록하자.

다른걸 다 떠나서 지난시간에 출력했던 Hello World! 대사를 통해 대애충 텍스트가 써지는 흐름은 알거라 생각된다.

e "Hello World!" 다른건 몰라도 이 텍스트를 바꾸면 그대로 게임상의 대사창에 그대로 뜰거라는건 바로 직관적으로 알것이라고 생각한다.

이제 이걸 좀 더 확장하기 위해서는 Say문에 대해 가장 기초적인것부터 짚고 넘어가야 한다.

렌파이에 대해 전혀 모르는 사람이라면 저 Hello World!라는 대사 다음으로 '나도 만나서 반가워!' 라는 대사를 치고 싶다고 했을때 저 코드를 어떤식으로 늘려야 할 것 같은가 생각해보자.


어.. 저 코드를 그대로 복사해서

e "Hello World!"

e "나도 만나서 반가워!"

하면 되지 않을까? 싶기도 한데 근데 저 e는 대체 뭐지? 저것도 붙여야 하나 말아야 하나. 고민 될 수도 있을 것이다.

맨땅에 헤딩하면서 배우는것도 당연히 나쁘지는 않겠지만 예제에 문장 한두개로 이루어진 설명을 보면 바로 알 수 있는 것을 굳이 맨땅헤딩까지는 필요 없을 것 같다.


결과적으로 말해서 일단 코드에는 문제가 전혀 없고 게임상에서도 정상적으로 대화가 출력은 되겠지만 저렇게 쓴다면 대화가 성립되는게 아니라 다중인격 소유자의 혼잣말이 되어버린다.

결국

아이린: Hello World!

아이린: 나도 만나서 반가워!

를 출력하고 게임은 그대로 종료가 된다.

이쯤되면 이러한 궁금증이 생길것이다.

'저 e라고 쓴거에 뭔가 있구나! 그러고보니 왜 아이린이라는 화자가 대사를 치는거지? 난 아이린이라고 쓴적도 없다고!'

e는 무엇이고 아이린은 무엇일까? 

e가 무엇인지 알기 위해서는 start 레이블 위에 있는 코드를 봐야 한다.


# 게임에서 사용할 캐릭터를 정의합니다.

define e = Character('아이린', color="#c8ffc8")


이걸보면 대애충 눈치 챌것이다. 여기에 답은 다 나와있다.

'대충보아하니 어쩌구저쩌구 '아이린'이라고 쓰여져있으니 이게 밑의 대사에 영향을 끼친건 분명하고 define 다음에 e가 있으니 잘은 모르지만 이놈 때문에 e라고 쓰면 아이린 역할을 하는거구나!'

잘은 모를지라도 이정도 분석만 이끌어내기만 해도 앞으로 렌파이 제작을 위한 학습 지능으로는 충분하고도 넘친다.

처음부터 완벽분석하여 다 알 수 없을 것 같으면 대충 핵심만 베껴서 바꾸면 그만이다.

'그렇다면 저 캐릭터 명을 입력하는 자리에 다른 이름을 써놓고 define 다음에 다른 명칭을 써넣으면 사람이 바뀌는거네?'

그것만 알아도 너의 능력 베리굿 인증이다.

근데 이왕이면 복사해서 두명 이상의 화자로 만드는게 좋으니까 아이린은 그대로 놔두고 다른 캐릭터를 만들어보자.


# 게임에서 사용할 캐릭터를 정의합니다.

define e = Character('아이린', color="#c8ffc8")

define jj = Character('찌질이', color="#c8ffc8")


하나의 찌질이 캐릭터가 이렇게 쉽게 뚝딱 완성이 되었다.

너무나도 쉽지 않은가?

이제 레이블에서 다음과 같이 작성하도록 하자. 물론 추가로 정말 찌질한 대사를 쳐도 상관없다.


# 여기에서부터 게임이 시작합니다.

label start:


    e "Hello World!"


    jj "나도 만나서 반가워! 으흐흐~ 쿰척쿰척"


    return


그리고 반드시 저장을 하고 프로젝트를 켜서 게임을 시작해보자.



이처럼 찌질이라는 등장인물을 쉽게 만들어 낼 수 있게 되었다. 단순히 '찌질이'라는 이름을 매 대사마다 쳐서 만드는게 아니라 jj만 입력하면 그게 곧 찌질이가 되니 얼마나 편한가?

하지만 여기서 의문의 인물이 등장한다.

그 의문의 인물의 이름도 모르고 단지 목소리만 등장할 뿐이니 형태적으로 추상화 할 수도 없다.

그래서 '???' 로 처리하는 경우가 많이 있는데 

여기서 두갈래 길로 나뉘게 된다.

아이린이나 찌질이처럼 '???'라는 캐릭터를 정의할 것인지.

아니면 짧게 1회성으로 등장할 뿐이니 단순히 ???로만 표기하고 끝낼 것인지를 말이다/


전자라면 

define q = Character('???', color="#c8ffc8") 식으로 하나의 캐릭터를 만들고 비밀스러운 인물이 등장할때마다 q를 기준으로 대사를 치면 된다.

하지만 후자라면 캐릭터를 정의하지 않게 되는 것이므로 그렇게되면 어떻게 해야되는 것인지 아리송 할 것이다.

이제 다른 Say문들을 배워보도록 한다.


지금까지는 캐릭터를 정의하고 해당 캐릭터를 불러왔지만 지금부터 하고자 하는 것은 캐릭터가 없는 나레이션 내지는 주인공의 속마음, 혹은 1회성 캐릭터나 캐릭터가 정의되지 않은 캐릭터를 쓸 때 쓸 수 있는 방식이다.


우리가 지금 배운 방식은

정의된 캐릭터 "문장" 형식이었지만

기본원형으로


"안녕하신가 내 이름을 말하자면 나는 빨딱."


이런식으로도 쓸 수 있다. 단지 화자가 표시 안될뿐이라 나레이션 용도나 주인공의 속마음으로 자주 쓴다.

또한 다음과 같이 사용할 수도 있다.


"???" "난 누구지?"


"개찌질이" "으허엉 살려줏메."


이렇게 실시간으로 캐릭터 명칭을 정해서 쓸 수도 있다. 단지 매번 화자를 길게 지칭해야 하므로 어지간한 1회성 캐릭터가 아닌한 무조건 캐릭터를 정의해서 쓰는 것이 좋을 것 같다는 건 굳이 설명하지 않아도 본능적으로 깨닫게 될 것이다.


그런데 여기서 렌파이 입문자들의 대다수가 모르는 사실을 알려주려고 한다.

코드를 수정해서 저장까지 마쳤는데 수정된 코드가 전혀 적용되지가 않는다!

심지어 메인메뉴로 나갔다가 다시 들어와도 마찬가지다. 이걸 어찌해야 할까?

답은 게임을 완전히 껐다가 다시 프로젝트를 실행해서 재시작하는 것이다...

라는 말을 들으면 으아아아아~ 할 수도 있다. 잠깐 코드 한 줄 바꿀 때마다 게임을 껐다가 다시 켜란 말이냐! 라는 울부짖음..같은건 사실 안해도 된다.

사실 게임이 커지면 커질 수록 게임을 로딩하는데 갈수록 오래걸리는데 그때마다 껐다 켰다 하는 것은 자원낭비에 시간낭비다.

그래서 사실은 개발자를 위해서 렌파이 엔진은 어디서나 재시작 기능을 넣어두었다.

이 기능은 개발자 모드가 켜져 있어야 하는데 일단 기본적으로 개발자 모드는 켜져있는 상태이므로 아무것도 할 필요가 없다.

단지 코드를 수정한 다음에 게임 창을 선택하고 Shift+R키를 누르면 된다.

그러면 좌측 상단에 게임명 - autoreload라는 표시가 뜨면서 게임이 리로딩되는데 이때부터 코드가 수정될 때마다 자동으로 프로젝트 전체를 다시 읽는다. 그렇게 되면 하드코딩된 부분을 포함하여 게임의 수정사항이 적용된다.

다만 autoreload상태라면 코드가 하나라도 변경되면 계속 게임이 리로딩되므로 원치 않는 경우 다시 Shift+R키를 눌러 일반 상태로 만들어주어야 한다.

완전 꿀팁이 아닐 수가 없다.

이 사항을 명심하고 개발하는 것이 좋다. 앞으로 진짜 어마무시하게 많이 쓰는 기능이 될테니까.



아무튼 캐릭터는 색상을 필요로 한다. 이게 무슨 소리냐면 비주얼노벨을 하다보면 알겠지만 캐릭터별로 시그니처 색상이 존재한다는 사실을 알 수가 있다. 렌파이에서 일괄적으로 한가지 색상만으로 전체 캐릭터를 통일시키는 경우는 그렇게 많지 않다.

그래서 아이린은 아이린만의 색이 있고 찌질이는 찌질이 만의 색상이 존재할 수 있다.

그런데 그 색상을 정하는 것은 개발자의 몫이다. 그런데 그 색상을 어떻게 정하고 어떻게 바꾸는지 아직 잘 모를 것이다.

경우에 따라서는 캐릭터별 시그니처 색상을 진짜 개발자 마음대로 정하는 경우가 있다. 얜 그냥 빨간색이 어울려 그리고 얜 그냥 하늘색이야 등등.

하지만 시그니처 색상이라는 것은 캐릭 고유의 색상이므로 어떠한 토대로 만드는 경우도 있다.

특정 게임들의 경우는 캐릭터의 머리카락색으로 표현하는 경우도 있다. 캐릭별로 형형색색의 머리카락색을 지니고 있으면(특히나 서양캐릭터 기준) 이러한 경우도 가능하다. 

하지만 그것도 어느정도껏이어야 되는 거지 평범한 동양인이 판치는 경우에는 거의 다 검은색일 것이라 의미가 없을 수도 있다. 그러므로 성향별로 자주입는 의상색이라던가 캐릭터가 좋아하는 색이라는 설정으로 시그니처 색을 입히는 방법도 있다.

선택은 개발자 마음이다.


그렇다면 어떻게 색상을 바꾸는가만 남았는데 이건 이미 눈치챘을거라 생각된다.

define e = Character('아이린', color="#c8ffc8")

define jj = Character('찌질이', color="#a54444")


캐릭터를 정의할때 나오는 컬러를 바꿔주면 그만이다.

그런데 컬러라는 것은 알겠는데 저 #어쩌구저쩌구는 대체 뭐란말인가?

하는 사람도 있고 아주 자알 아는 사람도 있을 것이다. 잘 아는 사람들은 대충 넘어가고 잘 모르는 사람들은 저게 색상 코드라는 것만 알면 된다. 16진수로 이루어진 6자리 숫자는 2묶음씩 3개로 나눌 수 있는데 각각 RGB(Red,Green,Blue)를 뜻한다. #000000이면 검은색이고 #ffffff면 하얀색이다.그리고 그 사이의 수 RGB의 R이 첫 2개의 수를 관장하고 G가 가운데 2자리 수를, 그리고 마지막 B는 마지막 2개의 수를 관장한다. 그래서 #FF0000이면 순 빨간색을, #00FF00이면 순 녹색을, #0000FF인 경우 순 파란색을 나타내고 그 색상끼리 섞여서 형형색색의 색상의 조합을 만들어 낼 수 있다. 16진수로 6자리이니 24비트 총 16,777,216개의 색상을 표현할 수 있는 것. 하지만 여기서 2자리 숫자를 더 붙이면 알파값까지 더해져 32비트 조합인 4,294,967,296의 색상표를 굳이 선택하려면 선택할 수 있다. 하지만 그것까지는 크게 의미가 있나 싶다. 정밀하게 그림을 표현하는 것도 아니고 고작 텍스트 따위에 8자리 32비트는 필요치 않으니 그냥 6자리 24비트로만 놀자.

그런데 색상코드의 경우 마비노기 출신이 아닌한 그런걸 툴의 도움없이 머릿속에서 바로 떠올리는게 불가능하다.

다행히도 VScode에서는 바로 색상을 보면서 선택할 수 있으니 해당 기능을 잘 이용해보자. 


빨간색 동그라미 표시를 누르면 원하는 색상을 선택할 수 있으므로 아주 편하다.

그리고 해당 컬러를 선택하고나면 캐릭터명이 해당 색상으로 바뀌고 그게 그 캐릭터의 시그니처 컬러가 된다.


이제 아주 기초적인 Say문과 이미 있는 코드를 복사하고 바꿔치기해서 캐릭터 정의를 하는 방법을 통해 계속해서 등장인물과 대사를 늘려가며 노벨을 전개할 수 있게 되었다. 하지만 왕기초이기 때문에 그렇지 이 Say문도 사실은 훨씬 더 복잡하다. 지금 알고 있는 것들 외에도 수 많은 것들을 더 배워야 하지만 지금은 이 정도만 알아도 일단 대사쪽은 쭉쭉 늘려나갈 수 있다.

당장의 이미지 추가방법 등을 몰라서 그렇지 적어도 소설하나 정도는 뚝딱 써내려 갈 수 있게 된 것이다.

단지 현 상태로는 return문 전까지 텍스트만 주야장천 써야 되는 탓에 실질적으로 비주얼적으로 아무것도 나오지 않아 지루할 뿐이겠지만 슬슬 비노의 핵심인 이미지나 영상을 추가하기 시작하면 훨씬 더 재미있어지는 게 사실인지라 적어도 거기까지는 열심히 달려보도록 하자.

거기서부터는 비주얼적으로 이것저것 할 수 있는 재미가 붙기 때문에 누가 말려도 달리는 경우를 볼 수 있다.

다음시간에.