
평소 스토리가 있는 방탈출 게임을 즐겨 했는데, 우연히 기회가 닿아 비주얼 노벨 코딩을 해 볼 수 있게 되었다. Unity는 비주얼 노벨을 다루기에 너무 복잡해서, 비주얼 노벨 특화 게임 툴인 렌파이를 골랐다. 툴이 간단하고 비주얼 노벨을 만들기에 최적화돼서 아주 편리하다.
ㅤ
# 이 파일에 게임 스크립트를 입력합니다.
# image 문을 사용해 이미지를 정의합니다.
image junghoon idle = "junghoon_idle.png"
image junghoon angry = "junghoon_angry.png"
image steward = "steward.png"
image leewan idle = "leewan_idle.png"
image leeyeon = "leeyeon.png"
image harbor = "harbor.png"
# 게임에서 사용할 캐릭터를 정의합니다.
define ch_junghoon = Character('정훈', color='#BDBDBD')
define ch_leewan = Character('???', color='#610B0B')
define ch_leeyeon = Character('???', color='#38610B')
define ch_steward = Character('승무원')
# 여기에서부터 게임이 시작합니다.
label start:
scene harbor
play music "bgm_ocean.mp3"
"갑판에 섰다."
"짜디짠 바닷바람이 숨통을 조이듯 밀려든다."
"감회가 새로울 거란 예상과 달리,"
"눈앞에 펼쳐진 광경에 모든 기대가 무너졌다."
show junghoon idle at center
ch_junghoon "그대로네…."
hide junghoon
"십 년 전이나 지금이나, 조선은 다를 게 없었다."
"어째서 달라진 게 아무것도 없나."
"저 바다 건너 세상은 하루가 멀다하고 새로워지는데."
"뒤로 다가오는 인기척이 느껴져 습관적으로 뒤를 돌았다."
show junghoon idle at left
show steward at right
ch_steward "배가 곧 정박합니다. 선실로 들어가시지요."
hide junghoon
show steward
"청의 언어를 할 수 있는 건 아니지만, 대충 눈치로 알아들을 수 있었다."
"갑판에 있던 다른 손님들이 선실로 향했기 때문이다."
"정훈은 가볍게 목례하고 선실로 들어갔다."
"좁은 복도를 따라 걸었다."
"걸을 때마다 마룻바닥이 끼익 소리를 낸다."
"맞은편 모서리를 돌아 대화소리가 들린다."
ch_leeyeon "곧 눈이 올 모양입니다."
ch_leewan "한바탕 장설이면 좋겠군."
ch_leeyeon "이제 더는 청에 갈 일이 없으시겠지요?"
ch_leewan "그래. …그 자와는 더 이상 할 말이 없어."
"낮은 목소리의 중년 남자와 젊은 남자인 것 같다."
"걸음이 가까워진다."
"정훈은 바닥에 꽂아두었던 시선을 올렸다."
"콧수염 난 나이 든 남자가 이쪽을 바라보고 있다."
"찰나 마주친 눈이 날카롭다."
show junghoon idle at left
show leewan idle at right
ch_leewan "……."
ch_junghoon "……."
"곧 시선을 비낀 정훈은 옆으로 비켜 섰다."
ch_junghoon "지나가시죠."
ch_leewan "…조선인이었군."
"정훈은 중년 남자를 바라보았다."
show leewan idle at left
show leeyeon at right
ch_leewan "그런데 나를 모르는게, 조선말을 할 줄만 아는 건가?"
ch_leeyeon "백부님."
"백부라면, 조카겠군."
"젊은 남자가 무어라 귓속말한다."
hide leewan
hide leeyeon
menu:
show junghoon angry
"사람 앞에 두고 뭐하는 짓인가?"
$love_point = 0
"무시하고 지나쳐 간다.":
hide junghoon
$love_point = love_point - 1
"정훈은 우두커니 선 두 사람을 뒤로한 채 선실로 향했다."
"지켜본다.":
hide junghoon
$love_point = love_point + 1
"말이 끝나자 중년 남자는 지나쳐 선실로 향했다."
"정훈은 그가 지나간 자리를 한참 바라보았다."
play sound "sfx_ship.mp3"
"배가 정박하는 소리에 걸음을 옮겼다."
return
ㅤ
#image 문
image junghoon idle = "junghoon_idle.png"
image junghoon angry = "junghoon_angry.png"
#define 문
define ch_junghoon = Character('정훈', color='#BDBDBD')
label start:
return
ㅤ
image문으로 이미지 파일을 정의하고, scene으로 설정한다.
(모든 이미지 파일은 images 폴더에 저장해 둔다.)
예시
image harbor = "harbor.png"
label start:
scene harbor
ㅤㅤ
play문으로 음악 파일을 재생한다.
music은 배경 음악 재생에 사용되고,
sound는 효과음 재생에 주로 사용된다.
예시
label start:
play music "bgm_ocean.mp3"
play sound "sfx_ship.mp3"
ㅤㅤ
image문으로 이미지 파일을 정의하고, define으로 이름을 설정한다.
(모든 이미지 파일은 images 폴더에 저장해 둔다.)
예시
image junghoon idle = "junghoon_idle.png"
image junghoon angry = "junghoon_angry.png"
image steward = "steward.png"
image leewan idle = "leewan_idle.png"
image leeyeon = "leeyeon.png"
define ch_junghoon = Character('정훈', color='#BDBDBD')
define ch_leewan = Character('???', color='#610B0B')
define ch_leeyeon = Character('???', color='#38610B')
define ch_steward = Character('승무원')
label start:
image로 캐릭터를 정의할 때, 한 캐릭터의 표정 변화를 묘사하기 위해 idle/angry/happy 등등의 태그로 묶을 수 있다. 이때 캐릭터 이름으로 그룹화를 하는데, hide로 캐릭터 이미지를 한 번에 숨길 수 있다.
define문으로 스크립트 내에서 캐릭터를 정의할 때, Character() 함수로 캐릭터를 정의할 수 있다. Character('캐릭터이름', color='#컬러코드') 형식으로 정의하며, color는 생략 가능하다.
ㅤ
예시
$love_point = 0
menu:
show junghoon angry
"사람 앞에 두고 뭐하는 짓인가?"
"무시하고 지나쳐 간다.":
hide junghoon
$love_point = love_point - 1
"정훈은 우두커니 선 두 사람을 뒤로한 채 선실로 향했다."
"지켜본다.":
hide junghoon
$love_point = love_point + 1
"말이 끝나자 중년 남자는 지나쳐 선실로 향했다."
"정훈은 그가 지나간 자리를 한참 바라보았다."
$ 변수명
앞에 '$' 표시를 붙여야 변수 구문을 식별한다.
ㅤ
show와 hide로 이미지를 나타내거나 숨길 수 있다.
예시
show junghoon idle at left
show steward at right
hide steward with fade
이때, 이미지를 나타내는 위치와 방법을 지정할 수 있다.
위치:
show junghoon at left/right/center
방법:
show junghoon with dissolove/fade
ㅤ
기본적인 것들만 기술했는데, 사실 제작 자체는 여기에 기술된 것으로만 해도 괜찮을 정도로 간단하게 이루어져 있어서 아주 만족스럽다. 더 만들면서 알게 된 것은 이 글에 추가하거나 따로 포스팅할 예정이다.
ㅤ