台詞とナレーション link
テキストはビジュアルノベルの基本であり、物語を中心としたゲームにとってとても大切なものです。テキストにはそれを話しているキャラクターで分類できる台詞と、話し手のいないナレーションがあります(簡単にするため、特に分ける必要がない限り台詞もナレーションも台詞で統一します)。 また、台詞の外観はゲームに合わせてユーザーがカスタマイズできます。
Ren'Py ではほとんどの台詞は say ステートメントで書かれます。台詞の見た目は Character オブジェクトを使ってキャラクター毎にカスタマイズできます。
say ステートメント link
say
ステートメントは、台詞やナレーションに使われます。これは Ren'Py スクリプトで最も多く使われるステートメントですから、say ステートメントの構文は最小限の負荷で書けます。こちらは say ステートメントの例です。
"This is narration."
"Eileen" "This is dialogue, with an explicit character name."
e "This is dialogue, using a character object instead."
"Bam!!" with vpunch
最初の形式は 1 つの文字列だけで構成されています。この形式はナレーションに使われ、この文字列がナレーションの内容です
第二の形式は、2 つの文字列で構成されています。最初の文字列は話者の名前で、二番目が話される台詞です。
第三の形式は、単純式とその後の文字列で構成されます。ここでの単純式は、キャラクター名の文字列または Character オブジェクトであるべきです。後者では、その Character オブジェクトが台詞の見た目の制御に使われます。
最後の形式は文字列とトランジション付きの with 節で構成されており、文字列の表示とスクリーンの揺れが同時に起こります。
say ステートメントの詳細な動作は使われる Character オブジェクトによって制御されますが、say ステートメントは通常台詞をスクリーンに表示し、ユーザーがクリックしたら台詞をスクリーンから取り除きます。
文字の中には Ren'Py で特別な意味を持ち、それゆえ台詞の文字列で使えないものがあります。 {
文字はテキストタグを開始し、 [
文字は置換を開始します。これらを台詞中で使うには 2 つ重ねてください。また、クオートが文字列を閉じてしまうのを防ぐには、バックスラッシュを前置しなければなりません。例
"I walked past a sign saying, \"Let's give it 100%%!\""
character オブジェクトの代わりにプロキシ関数も使用できます。詳細は こちらのセクション を参照ください。
Character オブジェクトの定義 link
Character オブジェクトを作成して、 say ステートメントで使用すると、会話文の見た目 (ある程度の動作も) を変更できます。キャラクターは、define
ステートメントを使って変数に Character を代入して作成できます。例
define e = Character("Eileen", who_color="#c8ffc8")
これでそのキャラクターを say ステートメントで使えます:
e "Hello, world."
Character は Python 関数でもあり、多くのキーワード引数を受け取ります。これらのキーワード引数は、キャラクターの動作を制御します。
- Character(name=..., kind=adv, **args) link
台詞やナレーションの外観を制御する Character オブジェクトを作成して返します。
- name
name
が文字列であれば、台詞を話すキャラクターの名前となります。 None であれば、ナレーションのように名前の表示は省略されます。 name が指定されないと kind から name が所得され、 kind がなければ None となります。- kind
このキャラクターの元になるキャラクターです。指定されると、このキャラクターに与えられなかった全ての引数のデフォルト値は、
kind
に与えられた引数の値になります。これはテンプレートキャラクターを定義してそのキャラクターをコピーして変更するのに使われます。これには名前空間も渡せられ、その場合その名前空間の character 変数が kind として使用されます。
画像の関連づけ キャラクターに画像タグを関連付けられます。これにより、そのキャラクターに関わる say ステートメントでこのタグの画像を表示したり、そのキャラクターがしゃべるときに現れるサイドイメージを自動的に選んだりできます。
- image
このキャラクターに関連付けられる画像タグの文字列です。
ボイスタグ ボイスタグを Character に指定して、そのキャラクターに関連するボイスファイルを設定画面でミュートやテスト再生可能にできます。
- voice_tag
そのキャラクターに関連付けするボイスファイルを voice チャンネルでミュートにしたり再生可能にするのに使用する文字列です。
接頭辞と接尾辞 これを使って、キャラクター名と表示されるテキストに、接頭辞や接尾辞を適用できます。これは例えば会話文のそれぞれの行をクオートで囲むのに使えます。
- what_prefix
会話文が表示される前に前置される文字列です。
- what_suffix
会話文が表示される前に後置される文字列です。
- who_prefix
表示される前にキャラクター名に前置される文字列です。
- who_suffix
表示される前にキャラクター名に後置される文字列です。
名前表示の変更 このオプションは名前の表示を制御するのに役立ちます。
- dynamic
True なら、 name は Python 式を含む文字列または関数、呼び出し可能なオブジェクトでなければなりません。文字列なら台詞のそれぞれの行の前にその文字列が評価され、その結果がキャラクター名として使われます。そうでなければ関数または呼び出し可能なオブジェクトが台詞のそれぞれの行の前に引数なしで呼び出され、返り値がキャラクター名として使用されます。
インタラクションの制御 これらのオプションは、台詞が表示されるか、インタラクションが行われるか、そして入ったモードが表示されるかを制御します。
- condition
指定するなら Python 式を含む文字列でなければなりません。この式が False なら、say ステートメントがなかったかのように、台詞は現れません。
- interact
デフォルトでは True で、台詞が表示される度にインタラクションが行われます。 False の場合は、インタラクションを行わずにスクリーンに要素を追加できます。
- advance
デフォルトは True で、クリックしてのステートメントの読み進めや、 (スキップやオートモードのような)他の進行も同様にできます。 False なら(ハイパーリンクへのジャンプやスクリーンのような)代替方法を除いて say ステートメントを通過できません。
- callback
キャラクターが話している時に発生するイベントによって呼び出される関数です。詳細は キャラクターコールバック のセクションを参照してください。
Click-to-continue ctc は、全てのテキストが表示された後、ユーザーに進行を促すために表示される標識です。
- ctc
特殊な標識が使われないときに ctc に使う Displayable です
- ctc_pause
テキストの表示が {p} や {w} テキストタグで停止されているときに ctc に使う Displayable です。
- ctc_timedpause
テキストの表示が {p=} や {w=} テキストタグで停止されたときに ctc に使う Displayable です。None であれば、ctc_pause をデフォルトとするので、 ctc_pause だけ使って ctc_timedpause は使わないときは、
Null()
を使ってください。- ctc_position
ctc の位置を制御します。
"nestled"
の時、ctcは表示されるテキストの一部として、最後の文字の直後に表示されます。"nestled-close"
も同じですが、最後の文字とctcとの間で改行を許可しません。"fixed"
の場合は、 ctc を含む新しいスクリーンが表示され、 ctc の位置プロパティーが ctc の配置に使用されます。
スクリーン 台詞の表示には スクリーン を使います。以下の引数により、スクリーンの選択、及びスクリーンへの引数の受け渡しができます。
- screen
台詞を表示するのに使われるスクリーンの名前です。
- retain
True でなければ、台詞の各行に対して使われていないタグが生成されてスクリーンの表示が保持されます。
renpy.clear_retain()
を呼び出すと、保持されている画面をすべて削除できます。これはほとんどの場合 吹き出し と共に使用されます。
show_
で始まるキーワード引数は、接頭辞を取り除かれ、スクリーンに引数として渡されます。例えば、show_myflag
の値はスクリーンのmyflag
変数の値になります (myflag 変数はデフォルトでは使われませんが、カスタマイズされた say スクリーンで使用可能です)。一つの show 変数が、歴史的な理由のため、 Ren'Py 自身によって扱われます。 :
- show_layer
必要に応じて say スクリーンを表示するレイヤーの名前の文字列を指定します。
テキストとウィンドウのスタイル
who_
,what_
, およびwindow_
で始まるキーワード引数は、接頭辞を剥ぎ取られ、それぞれキャラクター名、会話テキスト、その両方を含むウィンドウの スタイル になります。例えば、キャラクターがキーワード引数
who_color="#c8ffc8"
を与えられると、キャラクター名の色が変わり、この場合は緑になります。window_background="frame.png"
で、キャラクターの台詞を含むウィンドウの背景を設定します。who_style
,what_style
, およびwindow_style
引数を使う方法でも、それぞれキャラクター名、台詞、ウィンドウに適用されるスタイルを設定できます。config.character_id_prefixes
の設定により他の displayable もまとめてスタイルを設定できます。例えば、デフォルト GUI が使用されると、スタイル接頭辞namebox_
を使用して話者の名前欄のスタイルが設定できます。
画像属性を伴う say link
キャラクターが画像タグを伴って定義されたとき、そのキャラクターを含む say ステートメントのキャラクター名と2番目の文字列の間に画像属性を入れられます。
この形式では、与えられたタグの画像が表示されていれば、Ren'Py はそのキャラクターのタグと属性を含む show コマンドを発します。その画像が表示されていなければ、Ren'Py はその画像属性をサイドイメージで使うためにプールしますが、画像の表示はしません。
例
define e = Character("Eileen", image="eileen")
label start:
show eileen concerned
e "I'm a little upset at you."
e happy "But it's just a passing thing."
これは以下と等しいです。
define e = Character("Eileen")
label start:
show eileen concerned
e "I'm a little upset at you."
show eileen happy
e "But it's just a passing thing."
上記の例では concerned
と happy
が互いを置き換えています。しかし concerened
属性 を指定しなくとも happy
でない eileen に戻せます。マイナス記号 (-) で始まる属性名が show ステートメント と同様にその作用をもちます。
例
define e = Character("Eileen")
label start:
show eileen
e concerned "I'm a little upset at you."
e happy "That's funny."
e -happy "I'm not sure what to think now."
画像属性のリストに@が含まれていると、@で始まる属性の変更は一時的で、台詞の最後の行で以前表示していた画像に戻ります。
例えば、次のコードは以前の例と等しいです。
define e = Character("Eileen", image="eileen")
label start:
show eileen concerned
e "I'm a little upset at you."
e @ happy "That's funny."
e "I'm not sure what to think now."
2つのシンタックスは組み合わせられ、@の前に永続的な変更を、後に一時的な変更を続けます。
e happy @ vhappy "Really! That changes everything."
マイナス記号も @ 記号の後に使用出来ます。
e @ right -concerned "My anger is temporarily suspended..."
e "HOWEVER !"
画像がこのように変更される度にトランジションを起こすには、config.say_attribute_transition
にトランジションを、さらに細かい制御をするには config.say_attribute_transition_callback
を設定してください。
キャラクターの例 link
キャラクターの例をいくつか挙げます:
# A character that has its dialogue enclosed in parenthesis.
define e = Character("Eileen", what_prefix='(', what_suffix=')')
# A character that pulls its name from a variable.
define p = Character("player_name", dynamic=True)
特殊なキャラクター link
デフォルトでいくつかのキャラクター名が定義されていて、特定の状況で自動的に使われます。これらのキャラクターを意図的に再定義すれば Ren'Py の振る舞いを変えられますが、間違えて使ってしまうと問題になりえます。
adv
Character によって使われるデフォルトのキャラクターの kind です。これは、画面に一度に一行ずつ表示されるようなキャラクターを設定します。
nvl
台詞が NVL モード で表示されるキャラクターの kind です。画面に一度に複数行表示されます。
narrator
キャラクター名の無い say ステートメントにより、ナレーションを表示するのに使われるキャラクターです。
name_only
キャラクター名が文字列として指定されると台詞を表示するのに使われるキャラクターです。このキャラクターは指定された名前の新しいキャラクターにコピーされ、その新しいキャラクターが台詞を表示するのに使われます。
centered
台詞をウィンドウの外、画面の中央に表示するキャラクターです。
vcentered
台詞を画面の中央、ウィンドウの外に縦書きで表示するキャラクターです。
extend
最後に台詞を話したキャラクターにその台詞の後に「 {fast} 」タグと extend に与えられた台詞をつなげて構築された台詞を話させます。これを使用して台詞中に画面を変化させられます。
extend は NVLモードを検知して適切に扱いますが、最初の say と extend の間で言語設定が変更されると正しく動作しません。
例
# Show the first line of dialogue, wait for a click, change expression, and show
# the rest.
show eileen concerned
e "Sometimes, I feel sad."
show eileen happy
extend " But I usually quickly get over it!"
# Similar, but automatically changes the expression when the first line is finished
# showing. This only makes sense when the user doesn't have text speed set all the
# way up.
show eileen concerned
e "Sometimes, I feel sad.{nw}"
show eileen happy
extend " But I usually quickly get over it!"
テキストウィンドウの管理 link
Ren'Py にはテキストウィンドウを管理するためのステートメントが含まれています。台詞の間、ウィンドウは常に表示されますが、台詞がない間のウィンドウの表示・非表示はこれらのステートメントによって制御できます。
window show
window show ステートメントは、ウィンドウが表示されるようにします。このステートメントはオプションとして表示時のトランジションを引数に受け取ります。トランジションが省略された場合は、
config.window_show_transition
が使われます。window hide
window hide ステートメントは、ウィンドウが非表示になるようにします。このステートメントはオプションとして非表示時のトランジションを引数に受け取ります。トランジションが省略された場合は、
config.window_hide_transition
が使われます。window auto True
これはウィンドウの自動管理を有効化させます。ウィンドウは
config.window_auto_show
にリストアップされたステートメント (デフォルトでは say ステートメント) の前で表示され、config.window_auto_hide
にリストアップされたステートメント (デフォルトではscene
,call screen
, キャプションのないmenu
ステートメント) の前で非表示となります。考慮されるのはステートメントのみで、ステートメントに相当する関数は考慮されません。
window auto False
これはウィンドウの自動管理を無効にします。ウィンドウは自動的には表示・非表示されなくなります。
window auto
ステートメントは、ウィンドウの表示・非表示にそれぞれ config.window_show_transition
と config.window_hide_transition
を使います。 window auto
は window show
や window hide
によって中断されます。
例
window show # shows the window with the default transition, if any.
pause # the window is shown during this pause.
window hide # hides the window.
pause # the window is hidden during this pause.
window show dissolve # shows the window with dissolve.
pause # the window is shown during this pause.
window hide dissolve # hides the window with dissolve.
pause # the window is hidden during this pause.
window auto True
"The window is automatically shown before this line of dialogue."
pause # the window is shown during this pause.
scene bg washington # the window is hidden before the scene change.
with dissolve
window show # Shows the window before it normally would be shown.
show eileen
with dissolve
"Without window show, the window would have been shown here."
台詞ウィンドウの管理は Preference()
の "show empty window" に影響されます。この設定が無効化されている時、上記のステートメントでは何も起こりません。
引数つきの say link
say ステートメント後に括弧で囲んで、追加の引数を say ステートメントに渡せます。
e "Hello, world." (what_color="#8c8")
None が指定されなければ、 say ステートメントへの引数は最初に config.say_arguments_callback
によって処理されます。残りがあれば character に渡され、そのキャラクターが定義されたときに渡されたかのように扱います。 例えば、上記の例は台詞を緑に表示します。特別なキーワードである _with_node はキャラクターの with_none 属性を上書きします。
interact パラメーターは特別です。 : その Character 定義時に False を渡すと、 interact=True
を渡しても上書きされないので、その場合インタラクションが起こりません。
config.say_arguments_callback
は引数に渡された時だけでなく say ステートメント実行のたびに呼び出されるので注意してください。キャラクターの設定を、条件によって上書き出来するのに便利でしょう。例
init python:
def say_arguments_callback(char, *args, **kwargs):
if colorblind_mode:
kwargs["what_color"] = "#000"
return args, kwargs
define config.say_arguments_callback = say_arguments_callback
モノローグモード link
ビジュアルノベルでは、ナレーションや同じキャラクターの台詞が続くときがあります。これらの場合、キャラクター名とクオートを何度も入力するのは煩雑です。
これらのケースのため、 Ren'Py はモノローグモードをサポートします。台詞がトリプルクオートで囲まれると、 Ren'Py は空白表で台詞をブロックに分け、各ブロックで say ステートメントを使用します。例として、三ブロックのナレーションに続いて、三行の台詞が続きます。
"""
This is the first line of narration. It's longer than the other two
lines, so it has to wrap.
This is the second line of narration.
This is the third line of narration.
"""
e """
This is the first line of dialogue. It's longer than the other two
lines, so it has to wrap.
This is the second line of dialogue.
This is the third line of dialogue.
"""
引数や属性のような追加の節も可能ですが、モノローグの各ブロックに渡されてしまうので、あまり有用ではありません。
ブロック間のスペースを省略したいなら、モノローグ行の前のファイルの先頭に rpy monologue single
と記述してください。
これを無効にし、トリプルクォートで囲まれた行をすべて1つのメッセージとして表示して改行を節約したい場合は、 rpy monologue none
とすればよいです。
character
Store link
詳細: その他の名前付き store
say ステートメントはデフォルト store の前に character
と名付けられた store を探します。デフォルト store で変数名と同じキャラクターを使用したければ以下のように定義できます。
define character.e = Character("Eileen")
このキャラクターはデフォルト store の変数と平行して使用可能です。:
default e = 0
label start:
# This is still a terrible variable name.
$ e = 100
e "Our current energy is [e] units."
これは say ステートメントと衝突しないように、ある名前空間でキャラクターについての変数の情報を管理するために便利です。
define character.naomi = Character("Naomi Nagata", who_color="#8c8")
default naomi = PersonClass(engineering=5, max_g_force=.7) # can be an object...
define character.fred = Character("Fred Johnson", who_color="#72f")
default fred.money = 1000 # ...or a dedicated named store
default fred.rank = "Colonel"
label traded:
fred "Here you go."
$ fred.money -= 50
$ naomi.money += 50
naomi "Thanks ! I knew you would value my class-[naomi.engineering] engineering skills."
代替の方法 link
NVL モード : 台詞を画面一杯に表示するモードです。
吹き出し : 動的に配置される吹き出しに台詞を表示する方法です。
次も参照してください。 link
ステートメントに相当するもの : python の文脈でここで記述された機能の殆どを使用する方法ですが、いくらかの欠点や制限があります。
renpy.last_say()
: 最後の say ステートメントに関する情報を提供します。