렌파이로 만드는 비주얼 노벨 (1)

­이주현 (Joo Hyun Lee)·2023년 2월 22일

렌파이 (renpy)

목록 보기
1/6
post-thumbnail

들어가며

평소 스토리가 있는 방탈출 게임을 즐겨 했는데, 우연히 기회가 닿아 비주얼 노벨 코딩을 해 볼 수 있게 되었다. 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

나가며

기본적인 것들만 기술했는데, 사실 제작 자체는 여기에 기술된 것으로만 해도 괜찮을 정도로 간단하게 이루어져 있어서 아주 만족스럽다. 더 만들면서 알게 된 것은 이 글에 추가하거나 따로 포스팅할 예정이다.

0개의 댓글