株式会社WFS クライアントエンジニア

市川ひまわり氏:「『ヘブンバーンズレッド』×バトル×アドベンチャー〜WFSのゲーム制作・演出の最大化手法〜」の発表を始めさせていただきます。本日はどうぞよろしくお願いします。

まずは自己紹介をします。ゲームの開発・運用を主に行っている株式会社WFSで、クライアントエンジニアをしている市川ひまわりです。現在は『ヘブンバーンズレッド』で、アドベンチャーパートの開発を担当しています。

伊藤栄治氏:株式会社WFSクライアントエンジニアの伊藤と申します。『ヘブンバーンズレッド』では、主にバトル周りの組み込みを担当しています。

本発表は2部構成となっており、それぞれ別の切り口から『ヘブンバーンズレッド』の開発事例を紹介します。第1部ではLuaを使ったアドベンチャー制作エンジンの裏側を紹介し、第2部ではUnity Timelineを使ったバトルの作成事例を紹介します。

アドベンチャーパートでは「Lua」を使用

市川:市川から「Luaで最上の演出を! 『ヘブンバーンズレッド』におけるアドベンチャー制作エンジンの裏側」の紹介をします。

初めに、『ヘブンバーンズレッド』について説明をします。『ヘブンバーンズレッド』、通称『ヘブバン』は、株式会社WFSのゲームスタジオ、Wright Flyer Studiosと、株式会社ビジュアルアーツのブランドであるKeyが贈る、ドラマチックRPGです。2022年2月にリリースしました。

『ヘブバン』には大きく3つの構成要素があります。立ち絵、背景、メッセージで構成されるアドベンチャーパート、3Dの背景をキャラクターが動き回るフィールドパート、そしてターン制コマンドバトルを行うバトルパートです。本パートでは、私が開発を担当しているアドベンチャーパートについてお話しします。

先ほども説明したとおり、アドベンチャーとは、立ち絵、背景、メッセージで構成される、シナリオパートのことを指します。1分ほどの動画をご覧ください。

ご覧いただいた動画でもわかるように、『ヘブバン』のアドベンチャーでは大量のセリフと、それに伴う大量の演出があります。演出とは、キャラの入退場、背景の移動、BGM、表情などです。これらを大量に作るために、アドベンチャーの量産体制を整える必要がありました。

『ヘブバン』ではアドベンチャーを作るのにLuaを用いています。Luaとは、スクリプト言語の一種です。WFSでは『ヘブバン』を含めた複数タイトルで使っています。

アドベンチャーの演出を組むのは、スクリプターと呼ばれる企画職の方々です。スクリプターさんのスクリプティングの経験はさまざまで、ベテランの方もいれば、初心者の方もいます。そのため、スクリプト初心者でも直感的に組むことができる仕組みを作る必要がありました。

シナリオ変換ツール「Tulip」を内製

アドベンチャーの実装の流れを紹介します。アドベンチャーの実装は、協業であるビジュアルアーツ社からのシナリオ納品、スクリプターさんによるスクリプト作業、テストと修正の順で行っています。これらを支えるツールとして、シナリオ変換内製ツール「Tulip」、Layout命令、UnityとLuaを組み合わせたホットリロードがあります。本発表ではこれら3つについてそれぞれ説明します。

まず、協業先であるビジュアルアーツ社から納品されたファイルをLuaに変換するための内製ツール、Tulipについてお話しします。シナリオは、テキスト形式で納品されます。先ほど説明したとおり、『ヘブバン』のアドベンチャーはLuaで作られています。なので、納品されたファイルをLuaに変換する必要があります。

テキストファイルには、セリフ、キャラクター指定、コメント、吹き出しの種類など、さまざまな情報が書かれています。スクリプターさんがテキストファイルの中身を読みながら、一行ずつ手作業でLua構文に直す必要があります。手作業だと正確性が低く、抜け漏れや誤字脱字の起きる可能性があります。工数もかかり、あまりにも大変です。さすがに無理があるので、変換ツールを作り自動化することにしました。

納品されたシナリオのテキストファイルをLuaに変換するために、Tulipというパーサーを作りました。背景、立ち絵、メッセージがあるという基本構造はどのシナリオも同じなので、それを自動で書き出します。使用言語はPythonとC#で、Unity上のツールとして作成しました。基本構造の作成を自動化するため、シナリオの量産がしやすくなります。

Tulipでテキストファイルを変換する例

シンプルな例で見ていきましょう。このようなテキストファイルが納品されてきたとします。【スミカッコ】がキャラクター名、「カギカッコ」がセリフです。これをTulipでコンバートすると、このように『ヘブバン』のLua記法に合った出力を得ることができます。実際には自動でヘッダーが入ったり、再生できる状態まで変換してくれます。

やっていることは簡単です。テキストファイルを上から読み、特定の文字列を探して置換します。キャラクター一覧は、事前に持っています。キャラを表示させたり発言させたりするだけではなく、『ヘブバン』を代表する選択肢画面や、3×3選択肢にも対応しています。

3×3選択肢について説明します。左に3つ、右にも3つ選択肢があり、それらを1つずつ選ぶ選択肢画面です。組み合わせによってシナリオの内容が変わります。(スライドを示して)納品ファイルは、このようなかたちです。協業先であるビジュアルアーツ社には、Siglusというノベルゲームのスクリプトエンジンが存在しており、3×3選択肢はそれに倣った作りで納品されます。

Tulipでコンバートすると(スライドを示して)右のようになります。3×3選択肢はdoubleQuestionという命令で実現されます。返り値として、どの選択肢を選んだかが数字で返され、s1、s2に格納されます。s1が左側、s2が右側の選択肢結果です。

納品ファイルの上のブロックはゲーム画面の左側の選択肢で、下のブロックは右側の選択肢です。それぞれdoubleQuestion命令の引数として渡されます。選んだ結果から計算をして、計算結果から組み合わせごとに場合分けをしていきます。

納品ファイルではswitch文ですが、Luaにはswitch文がデフォルトで存在しないため、if文に置換していきます。このように、Tulipでは複雑な構文の変換も可能です。3×3選択肢も先ほどのシンプルなものと同じく、テキストファイルを上から読み、特定の文字列を探して置換していきます。switch文はif文に書き換えていきます。

「Layout命令」で演出をテンプレート化

次に、『ヘブバン』でのスクリプトの実装についてお話しします。すべてのアドベンチャーにおいて、背景、立ち絵、メッセージがあるという基本構造は同じです。また、演出もキャラの表示・非表示など、ある程度は共通です。つまり、量産するにあたって同じ命令をたくさん書く必要があります。そこで、テンプレート化してある程度は自動で作れるようにする必要がありました。

『ヘブバン』の主人公である茅森月歌と、その相方である和泉ユキを使って、キャラクターの表示切り替えがわかる簡単な演出の例をお見せします。

立ち絵が1人、2人、1人と変わります。何が起きているのかを分解して見ていきましょう。レイアウト1を最初の1人レイアウト、レイアウト2を茅森と和泉の2人レイアウト、レイアウト3を最後の1人レイアウトとします。

まずはレイアウト1です。背景しかない状態から茅森が登場する時、茅森はフェードインします。

次にレイアウト2です。和泉の登場に合わせてカメラが右へ向いている演出になっています。和泉が出てくる時、すでに表示されていた茅森は左へスライドします。和泉はフェードインしながらスライドします。背景は少しだけスライドしています。

最後にレイアウト3です。レイアウト3はレイアウト2とは逆で、和泉の退場と共にカメラが左へ向いている演出になっています。茅森は右へスライドし、和泉はフェードアウトしながらスライドし、背景は少しスライドしています。

演出にはパターンがあることがわかります。表示切り替えはフェード、立ち絵の変更が発生するサイドはスライドします。キャラクターの表示の演出を自動化することができそうです。

自動化するために作成したのが、Layout命令です。Layout命令とは、立ち絵を直感的に並べることができる仕組みです。立ち位置に注目して途中経過を補完します。

まず、キャラクターが出たり入ったりするための舞台の用意です。背景を基にステージを作ります。スクリプトでは、Layout.createStageという命令で行います。引数には、背景のインスタンスを渡します。そして作った舞台にキャラクターを立たせます。ADV立ち絵を表示するには、Layout.show命令を使います。引数には、キャラクターインスタンスを渡します。これは複数の指定が可能です。

先ほどの例を、Layout命令を使って考えてみましょう。(スライドを示して)レイアウト1、2、3、それぞれLayout.showを使ってこのように書くことができそうです。レイアウト1と3では同じ命令を書いているにもかかわらず、途中経過が補完されて、キャラクターの表示演出が変わっていることがわかります。

こちらが実際のコードです。背景インスタンスを基にステージを作って、表示させる命令を書いています。複雑な演出を簡単に作ることができました。

詳細は話しませんが、スクリプトの実装を簡単にするためのLua命令は他にもたくさんあります。また、アドベンチャーのみならず、冒頭でお伝えしたフィールドやバトルパートでもLuaを活用しています。

UnityとLuaを組み合わせたホットリロードを採用

最後に、UnityとLuaを組み合わせたホットリロードについてお話しします。

Unityでの単純な開発サイクルを考えてみましょう。Editorを再生し、確認、止めて、スクリプトを修正し、スクリプトファイルをReimportして、再度再生し、となかなか大変ですよね。量産する上で開発スピードは重要です。

そこで『ヘブバン』では、Luaスクリプトをリロードするだけで変更が反映される、ホットリロードが可能な環境にしています。手直しした後、ホットリロードをして即時反映されるので、開発スピードが速いです。

ホットリロードのデモです。左半分がゲーム画面、右側がスクリプトです。左に注目してください。キャラクターが吹き出しで会話をしています。これを編集してみます。右側を見てください。スクリプトを編集し終わったら、ホットリロードのショートカットキーを押します。無事反映されました。すぐに変更が確認ができて便利です。

第1部のまとめです。『ヘブンバーンズレッド』のアドベンチャーパートについてお話ししました。『ヘブンバーンズレッド』のリッチなアドベンチャーは、さまざまな工夫でできています。UnityとLuaの相性がよく、Editorを再生したままホットリロードが可能でインポートが不要なことから、開発スピードが速いです。また、簡単にLuaを作れるツールやLayout命令の存在により、量産しやすい環境が整いました。

以上が「Luaで最上の演出を! 『ヘブンバーンズレッド』におけるアドベンチャー制作エンジンの裏側」の紹介でした。

(次回へつづく)