Ren'Py 日本語ベーシックガイド
ビジュアルノベル/ノベルゲームエンジン Ren'Py の「これだけ知れば作り始められる」基本機能を、動くコード例つきでまとめたものです。.rpy スクリプトは Python に似た独自言語で、インデント(字下げ)でブロックを表します。最後に「単純な分岐の先でできること」も一覧で載せています。
クイックスタート(5分で最初の1本)
とにかく動かしたい人向け。下の流れで「画面に出る・喋る・選べる」までいけます。
1. ダウンロード〜起動
- renpy.org で SDK をDL → 解凍 → ランチャー起動
- 「新規プロジェクトを作成」→ 名前を入力(例:
my_first_vn)→ 解像度はそのままでOK - 作ったプロジェクトを選び「スクリプトファイル」→
script.rpyを開く
2. script.rpy を丸ごとこれに置き換え
# ===== キャラ定義 =====
define s = Character("シルヴィ", color="#2563eb")
# ===== 覚えておく変数 =====
default affection = 0
# ===== ここから本編 =====
label start:
scene bg room with fade # 背景なければ単色でもOK(後述)
"目を覚ますと、知らない部屋にいた。"
show sylvie smile with dissolve # 立ち絵なければこの2行は消してOK
s "おはよう。やっと起きたね。"
$ name = renpy.input("あなたの名前は?")
$ name = name.strip() or "あなた"
s "よろしくね、[name]。"
menu:
s "朝ごはん、何がいい?"
"パン":
$ affection += 10
s "私もパン派。気が合うね。"
"ごはん":
$ affection += 5
s "渋いね。"
"まだ寝たい":
s "だめ。もう昼だよ。"
if affection >= 10:
s "今日はいい一日になりそう。"
else:
s "……まあ、ぼちぼちいこう。"
"― おわり ―"
return
3. 起動して確認
- ランチャーの「プロジェクトを起動」を押すだけ
- クリックで読み進む/選択肢を選ぶ/名前入力 → 分岐するのを体験できる
- セーブ・スキップ・オートはもう動いている(右クリック or 下メニュー)
scene bg room や show sylvie smile はその名前の画像が無いとエラーになります。素材ナシで試すなら、その2行を消すか、次のように単色背景にすればOK。
# 画像なしでも動く版(先頭に置く)
image bg room = "#222" # 単色を背景画像扱いに
# show sylvie smile の行は消しておく
Ren'Pyとは
Ren'Py(レンパイ)は、ノベルゲーム・ADV・乙女ゲーなどを作る無料・オープンソースのエンジンです。Python製で、シナリオは独自スクリプトで書きます。
- 出力先:Windows / macOS / Linux / Android / iOS / Web(HTML5)
- 標準装備:セーブ&ロード・オート・スキップ・バックログ・設定画面が最初から入っている
- 書く中心:
game/フォルダ内の.rpyファイル
インストール
- 公式 renpy.org から SDK をダウンロード(OS別)
- 解凍して Ren'Py Launcher(ランチャー)を起動
- 「新規プロジェクトを作成」→ 名前を入れる → ひな形が自動生成
- 「スクリプトファイル」でエディタ(VS Code等)を開いて編集
- 「プロジェクトを起動」で即プレイ確認
game/ に置いて gui.rpy で指定すると安全です。プロジェクト構成
新規作成するとだいたいこうなります。最初に触るのは script.rpy。
プロジェクト名/ └─ game/ ├─ script.rpy ← 本編シナリオ(ここを書く) ├─ options.rpy ← タイトル名・BGM音量などの設定 ├─ gui.rpy ← 色・フォント・サイズなど見た目 ├─ screens.rpy ← UI画面(メニュー/セーブ画面など) ├─ images/ ← 背景・立ち絵などの画像 └─ audio/ ← BGM・効果音
images/ に bg room.png と置くと、スクリプトから scene bg room で呼べます(ファイル名のスペース=画像名のスペース)。ラベルとセリフ
ゲームは必ず label start: から始まります。ラベルは「シーンの見出し」、セリフは文字列を書くだけ。
label start:
"むかしむかし、あるところに……" # ナレーション(話者なし)
"少女" "ここはどこ?" # 一時的な話者名つき
"……目を覚ますと、見知らぬ部屋だった。"
return # ゲーム終了 / 呼び出し元へ戻る
- "〜" 1つだけ=ナレーション
- "名前" "セリフ"=その場限りの話者名つきセリフ
- よく出る人物は次の「キャラクター定義」で名前を固定するのが定番
キャラクター定義 define
登場人物は define で先に定義しておくと、名前の色や表示が統一できます。ファイル先頭に書くのが通例。
define s = Character("シルヴィ", color="#2563eb")
define m = Character("主人公", color="#0a7d3c")
label start:
s "おはよう。よく眠れた?"
m "うん、おかげさまで。"
s "それはなにより[name]。" # [変数名] で値を埋め込める
| 書き方 | 意味 |
|---|---|
color="#..." | 名前の表示色 |
"[変数名]" | セリフ中に変数の値を差し込む(名前入力などで) |
{w} / {nw} | クリック待ち / 待たずに次へ(セリフ内タグ) |
{b}太字{/b} {color=#f00}赤{/color} | 装飾タグ(太字・色・ルビなど) |
ジャンプ・コール(流れの制御)
シーンをまたぐにはラベルを呼びます。
label start:
"プロローグ……"
jump chapter1 # 戻ってこない移動
label chapter1:
"第一章。"
call tutorial # サブルーチンとして呼んで戻ってくる
"チュートリアルが終わった。"
return
label tutorial:
"(操作説明……)"
return # call の次の行に戻る
jump:片道。戻らないcall…return:呼んで戻ってくる(共通シーンに便利)
画像(背景・立ち絵)
背景は scene、立ち絵は show、消すのは hide。
label start:
scene bg room # 背景を切り替え(前の画像は全消去)
show sylvie smile # 立ち絵を表示(images/sylvie smile.png)
s "こんにちは。"
show sylvie surprised at right # 表情差し替え+右に配置
s "えっ、もう行っちゃうの?"
hide sylvie # 立ち絵を消す
"彼女は去っていった。"
scene は画面を一旦クリアして背景を敷く、show はその上に重ねる。位置は at left / center / right。トランジション(切り替え演出)
行末に with を付けると効果つきで切り替わります。
scene bg night with fade # 黒で一度暗転してから表示
show sylvie smile with dissolve # ふわっと出現
"…時間が流れた。"
with Pause(1.0) # 1秒待つ
| 名前 | 効果 |
|---|---|
dissolve | クロスフェード(重ねて溶ける) |
fade | 黒に落ちて戻る暗転 |
pixellate | モザイク状に切り替え |
move | 立ち絵が位置までスライド移動 |
音楽・効果音
play music "audio/bgm_town.ogg" fadein 1.0 # BGM(ループ&フェードイン)
play sound "audio/se_door.ogg" # 効果音(1回)
"扉が開いた。"
stop music fadeout 2.0 # BGM停止(2秒かけて)
queue music "audio/bgm_next.ogg" # 今の曲の後に予約再生
music=BGM(自動ループ)、sound=効果音、voice=ボイス。形式は .ogg 推奨。変数とフラグ(好感度など)
数値や真偽値を覚えさせて分岐に使います。default で初期値宣言、$ で代入・計算。
default affection = 0 # 好感度
default got_flower = False # フラグ(真偽)
label start:
menu:
"花をあげる":
$ affection += 10 # 好感度+10
$ got_flower = True
s "ありがとう、嬉しい。"
"何もしない":
$ affection -= 5
define=変化しない定数(キャラ定義など)、default=ゲーム中に変化しセーブされる変数。フラグは必ず default。条件分岐 if
覚えた変数で結末を変える。インデントでブロックを表します。
label ending:
if affection >= 20:
s "ずっと一緒にいようね。" # グッドエンド
jump ending_happy
elif affection >= 5:
s "……またね。"
jump ending_normal
else:
s "あなたのことは、もう忘れる。" # バッドエンド
jump ending_bad
比較は Python と同じ:== != >= <= > <、組合せは and / or / not。
Python連携
Ren'Py の中身は Python なので、必要ならそのまま書けます。1行は $、複数行は python: ブロック。
$ player_name = renpy.input("あなたの名前は?")
$ player_name = player_name.strip() or "名無し"
s "よろしくね、[player_name]。"
init python: # ゲーム開始前に関数や定数を準備
def calc_rank(score):
if score >= 80:
return "S"
return "B"
$ x = ...:1行のPython(代入・計算)python::複数行のPythonブロック(実行時)init python::起動時に一度だけ実行(関数定義など)renpy.input():プレイヤーに文字入力させる
単純な分岐の“先”にできること
Ren'Py は「セリフ+選択肢」だけのツールではありません。下のどれも標準機能、またはちょっと足すだけで実現できます。気になったキーワードで公式を引くと一気に世界が広がります。
ちょいレシピ(コピペで雰囲気だけ)
立ち絵を跳ねさせる(ATL)
transform bounce:
yoffset 0
easein 0.15 yoffset -30
easeout 0.15 yoffset 0
label x:
show sylvie smile at bounce # 登場でひと跳ね
s "じゃーん。"
雪を降らせる
$ snow = SnowBlossom("snowflake.png", count=100)
show expression snow as snow
"しんしんと雪が降っている。"
ガチャ的ランダム分岐
$ roll = renpy.random.randint(1, 100)
if roll <= 5:
"激レアイベント発生。"
else:
"いつもの朝だ。"
クリアした人にだけ隠しルート(周回特典)
$ persistent.cleared_once = True # クリア時に記録
menu:
"はじめから":
jump start
"真ルート" if persistent.cleared_once: # 2周目で解放
jump true_route
セーブ/ロード 標準装備
自分で作る必要はありません。右クリックや画面下メニューからセーブ/ロード/設定が呼べ、バックログ・スキップ・オートも標準で動きます。
- セーブされるのは
defaultで宣言した変数とシーン進行状況 persistent.〜はセーブをまたいで永続(実績・既読・CG回収率など)
ビルド・配布
- ランチャー →「ディストリビュートを作成(Build Distributions)」
- OSごとのzip(Win/Mac/Linux)が出力される
- Android/iOS は追加SDK設定、Webは「Web向けビルド」で HTML5 出力
- 容量を抑えるなら画像を適切に圧縮、未使用ファイルは
game/から除く
label の打ち間違いや未定義画像は起動時にエラーで教えてくれます。早見表(チートシート)
| やりたいこと | 書き方 |
|---|---|
| 開始地点 | label start: |
| ナレーション | "地の文" |
| セリフ | s "セリフ" |
| キャラ定義 | define s = Character("名", color="#..") |
| 背景 / 立ち絵 | scene bg 名 / show 名 表情 / hide 名 |
| 演出つき切替 | ... with dissolve |
| BGM / SE | play music "..ogg" / play sound "..ogg" |
| 選択肢 | menu: → "選択肢":(... if 条件:で条件表示) |
| 移動(片道/往復) | jump 名 / call 名 … return |
| 変数 / 代入 | default x = 0 / $ x += 1 |
| 条件分岐 | if / elif / else: |
| 文字入力 | $ n = renpy.input("?") |
| ランダム | renpy.random.randint(1, 100) |
| 永続データ | persistent.名 |
| 立ち絵アニメ | transform 名: → show 名 at 名 |