Metlivi ブログ

レトロ調のゲームで会話のセリフの合間にキャラクターの表情を変える方法

会話のセリフの合間にキャラクターの表情を変えるには、表情ごとに対応するスプライトを用意し、その表情を使用するセリフの直前でキャラクターの表示画像を切り替えます。シーンの雰囲気を損なうことなく表情の変化がはっきりと伝わるよう、スプライトの位置と全体のシルエットは統一しておきましょう。Ren’Pyでは、各表情に同じ画像タグを割り当て、新しい表情属性を指定して再度 show を使うのが最もシンプルな方法です。コマンドは異なりますが、他のエンジンでも概念としては同様の仕組みで動作します。

2026年10月15日読了時間:6分Metlivi Editorial Team
セクション 1

何が変化のきっかけになるかを決める

スプライトシートからではなく、会話のスクリプトから着手しましょう。新たなリアクション、トーンの変化、あるいは通常の表情への復帰など、プレイヤーに気づかせるべき表情の変化がある行にのみ印を付けます。すべてのセリフで表情を変えてしまうと、表情が持つ情報量が薄れ、アートの制作負担も一気に増えてしまいます。

印を付けた行ごとに、意図する表情とそれを表示するスプライトアセットを書き出します。通常(neutral)、喜び(happy)、不安(worried)、驚き(surprised)といった少数の一揃えがあれば、多くのシーンに対応できます。特定のシーンで必要な場合にのみバリエーションを追加してください。これはエンジンの制約ではなく演出上の選択です。適切なセット内容は、ゲームのアートスタイルや会話内容によって異なります。

セクション 2

違和感なく切り替わる表情スプライトを準備する

すべての表情で、キャラクターのフレーム設定、スケール、アンカーポイント(原点)を統一します。各画像がキャラクター全体の完全なスプライトである場合は、画像を切り替えたときにキャラクターが跳ねて見えないよう、ファイル間で目、頭、体の位置を揃えてください。スプライトをシーンの上に重ねて表示する必要がある場合は、背景を透明にしておきます。

ピクセルアート(ドット絵)の場合は、ゲームの実際の表示スケールで画像を確認してください。スプライトが切り替わる際、1ピクセルのズレでも目立つことがあり、拡大・縮小処理によってピクセルグリッドがぼやけたり歪んだりする場合があります。各表情は同じ寸法でエクスポートし、統一されたフィルタリングやスケーリング設定でインポートすることをお勧めします。これらは実制作における確認事項であり、正確な設定はエンジンやプロジェクトによって異なります。

mira neutral や mira worried のように、規則的で分かりやすいファイル名や画像名を付けましょう。Ren’Pyでは、画像名はタグとそれに続く任意の属性で構成され、このタグによって新しい show で置き換え可能なキャラクター画像が識別されます。Ren’Pyの画像ドキュメントには、この命名規則と置き換えの挙動についての詳細が記載されています。

セクション 3

Ren’Pyで表情を変更する

画像タグを指定して話者を宣言し、会話の行で表情属性を使用します。例:

define m = Character("Mira", image="mira")

label scene:
    show mira neutral
    m "The door is open."

    m worried "I thought I locked it."

    m "Maybe the wind caught it."

ここでは、mira が画像タグであり、neutral や worried が属性となります。worriedの行で表示中のキャラクター画像が更新され、次の行では新たな属性が指定されていないため、その表情が維持されます。スクリプト上で明示的に通常の表情に戻したい場合は、最後の行を m neutral "..." とします。Ren’Pyの対話ドキュメントでは、画像タグ付きで定義されたキャラクターはsay文で画像属性を受け取ることができ、画像がすでに表示されている場合、それらの属性は対応する show コマンドと同様に機能すると説明されています。Ren’Pyの対話と画像属性

画面上にキャラクターの全身スプライトを表示したくない場合は、会話UI内のポートレート(顔グラフィック)要素に対して同じ考え方を適用できます。いずれにしても、エンジン側で現在の話者と表情を画像に対応付ける手段が必要です。ポートレートUIでは異なる命名規則やデータ構造が使用される場合があります。Ren’Pyの構文を他のエンジンにそのまま移植する前に、選択したフレームワークのドキュメントを確認してください。

セクション 4

即時切り替えかトランジションかを選択する

即時切り替え(パッと切り替わる手法)は、歯切れの良いレトロな演出に適しており、表情の変化をセリフと密接に連動させることができます。トランジションを使えば切り替えを滑らかにできますが、ゲームの視覚スタイルに合致する場合にのみ使用してください。短いディゾルブ(クロスフェード)なら唐突感を和らげることができますが、長すぎると新しい表情が認識できるようになるまでに時間がかかってしまいます。

Ren’Pyでは、画像の切り替え時に dissolve などのトランジションをサポートしています。たとえば、show mira worried with dissolve と記述すると、表示画像の切り替え時にディゾルブが適用されます。ドキュメントに記載されているデフォルトの dissolve は0.5秒かかりますが、テンポの速い会話では遅く感じられることがあります。前後の文脈に合わせてテンポをテストし、必要に応じてより短いカスタムの所要時間を設定してください。Ren’Pyのトランジションに関するドキュメント

ピクセルアートの場合は、ゲームの目標解像度でトランジションと直接切り替えを比較検討してください。ディゾルブをかけると切り替え中に新旧のピクセルが混ざり合い、意図的に段階的または瞬間的に変化させた場合と比べて輪郭がぼやけて見えることがあります。これは自動的に追加すべき演出ではなく、実際のシーンを動かしながら確認すべきスタイルの判断事項です。

セクション 5

表情を変える間もスプライトを安定させる

さらにアートワークを追加する前に、表情の切り替えによって意図した箇所以外に変化が生じていないかを確認してください。前後のフレームやスクリーンショットを比較し、スプライトの位置、スケール、シルエットを確認します。キャラクターがピクッと動いて見える場合は、元画像の位置を揃えるか、エンジン側で共通のピボット(回転軸)や原点を修正してください。

また、レイヤーの重なり順や会話のタイミングも確認しましょう。スプライトの切り替えによって、誤って背景が消えたり、キャラクターが別の画像の背面に回ったり、新しい行が表示される前に追加のプレイヤー入力が必要になったりしてはいけません。Ren’Pyでは、show は同じタグを持つ画像を置き換えますが、hide は基本的にキャラクターがシーンから退場するときに使用されます。ドキュメントでも、スプライトを非表示にしてから表示するという個別のステップを踏むのではなく、show を使用して感情表現を置き換えることが明確に推奨されています。Ren’Pyの画像表示ルール

セクション 6

実際の会話の流れの中で変化を確認する

最初の変化の少なくとも1行前から、次の表情変化までシーンを再生してみましょう。意図したセリフで顔が更新され、その後も意図した表情が維持され、スクリプトの指示がある場合にのみ通常の表情に戻ることを確認してください。即時切り替えにするかトランジションにするか迷っている場合は、両方のバージョンをテストしてみます。

ゲームの目標解像度、かつメッセージウィンドウを表示した状態で一連の流れを確認してください。顔が隠れたり、見切れたり、小さすぎて判読できなかったりしないかを確かめます。表示がおかしい場合は、「スクリプトの表情名を確認する」→「対応する画像が存在し、エンジンに認識されているか確認する」→「位置合わせとトランジションの挙動を確認する」という順序で原因を特定してください。この手順を踏むことで、アセットの不足や命名の不一致による問題と、アートの配置に関する問題を切り分けることができます。

スクリプトで表情を指定し、対応するスプライトでキャラクターの位置を保ち、簡単なテストプレイで会話のテンポに合わせて切り替わりが認識できることを確認する——これらが揃うことで、すべての変化を意図どおりに演出する設定が完成します。

セクション 7

参考資料

関連記事

このテーマをさらに見る