Luaスクリプトを採用した理由とは
『FF7EC』の開発では、「プレイアブルなエリアでのイベント管理」や「キャラクター同士の掛け合いのあるアドベンチャーパート」を共通の仕組み で制作したいニーズがありました。開発メンバーのスキルセットを考慮に入れつつニーズを達成する手段を検討した結果、スクリプト言語 を採用するに至ったそうです。
採用するスクリプト言語としてLua を選択した理由としては、メジャーである 点、スクリプターの採用がしやすい 点の2つが挙げられました。
『FF7EC』におけるLuaスクリプト使用例
『FF7EC』で、Luaは「ダンジョン中のギミック」「アドベンチャーパートの掛け合い」「チョコボ農場」の3か所で使用されています。
ダンジョン中のギミック 「特定の場所を通ったときに石が落ちてくるイベント」や「選択肢に応じてアイテムが取得できるオブジェクト」といった、ダンジョンにある一部のギミックはLuaスクリプトで実装されています。
ストーリーパートで使われるマップにあるギミックもLuaで実装されている
ギミックのLuaスクリプトは、プランナーがマップの制作時に併せて作成している とのこと。
アドベンチャーパートの掛け合い ストーリー中のアドベンチャーパートにおける、キャラクターのモーション再生 やエフェクト・効果音の再生 に加え、セリフ表示 などの機能を用いた演出はすべてLuaスクリプトによって構成されています。
各機能の実装はエンジニアが担当 し、Luaによる演出のスクリプト作成はスクリプターが担当 しています。
チョコボ農場 チョコボ農場では、「遠征(※)」で得られた報酬に応じてオブジェクト の見た目が変わる仕組みや、チョコボを含めたNPCとの会話などの実装がLuaスクリプトです。
※ チョコボを遠征地に探索に出し、アイテムやキャラクターの経験値を持ち帰らせるシステム
チョコボに話しかけるたびにセリフが変わる仕組みもLuaスクリプトで実装されている
C#とLuaを用いた開発フロー
次に、佐藤氏はLuaスクリプトを用いた具体的な開発フローについて説明しました。
C#の関数定義とLuaからの呼び出し 『FF7EC』の開発では、C#で定義した関数をLuaスクリプトから呼び出す 形で実装しています。Luaからの呼び出しを想定していないC#関数もあるため、事前に登録された関数のみがLuaスクリプトから呼び出せる仕組みになっています。
C#で「move(float x, float y, float z)」という関数を定義した場合、LuaからはC#と同じように「move(1.0, 2.0, 3.0)」と記述することでmove関数を呼び出せるようになっています。
また、Luaは計算式やif文に対応しています。そのため、選択肢に応じた分岐処理もC#側で実装することなくLuaスクリプト内で完結します。
上記右のように「インデックスが1の選択肢を選んだ場合は座標(1.0, 2.0, 3.0)に移動する」処理を記述できる
C#のクラスをLuaに公開する独自Attribute 『FF7EC』では、C#のクラス をLuaに公開する 独自のAttributeを活用。Attributeを付与したクラスのインスタンスは、Lua上でC#と同様にメンバ変数やメンバ関数にアクセスできます。
Luaスクリプトで扱うクラスに「LuaClass」Attributeを付与することで、C#上と同じようにインスタンスを扱える
C#とLuaを組み合わせた演出の実装例 ここで、制作フローの具体例として「キャラクターが歩いてきてセリフを言う」シーンが挙げられました。
まず、エンジニアがC#で特定の座標まで歩くmove関数とセリフを表示するtalk関数を定義します。関数は、Luaスクリプトを特に意識せずに実装します 。
次に、スクリプターやプランナーがLua上でC#関数を使用した演出のスクリプトを記述します。
上記画像のLuaスクリプトは、まずCharacterClassのインスタンスであるCharacterのmove関数を呼び出して指定の座標に移動させ、移動が完了するのを待ってからtalk関数で「到着」というセリフを表示します。Luaスクリプトでは、演出を作る上で欠かせない非同期処理も記述できる ようになっています。
Visual Studio Codeスニペット生成の自動化 Luaスクリプトの記述には、Visual Studio Code が使用されています。
開発では、C#関数に付与したAttributeからVisual Studio Codeのスニペットを自動生成する仕組みを開発し、スクリプティングの効率化を図っています。
関数に「LuaFunctionSetting」Attributeと説明文を記述すると、自動的にスニペットが出力される
『FF7EC』のワークフローでは、基本的に関数を用意する人と使用する人は異なります。そのため、なるべく低コストでドキュメントに近いものが出力できるよう工夫をしているそうです。
Luaのメリットと採用時の考慮点
最後に、佐藤氏はLuaスクリプトを採用するメリットと、採用時に考慮すべき点を紹介しました。
Luaを採用する3つのメリット Luaスクリプト採用のメリットは、以下の3点が挙げられました。
エンジニアがC#の関数を用意した後はスクリプターのみで完結するため、自走しやすい環境 にできる
UnityにはLua言語を扱うためのライブラリが豊富にあるため、大規模なツールを開発する必要がない
プロジェクト独自のスクリプト言語ではないため、使用経験のあるスクリプターを採用できる 。スクリプターの市場価値が向上する
スクリプターが自走しやすい環境の具体例としては、下記画像に示す「回転する扉」が紹介されました。
プレイヤーがアクションすると扉が回転し、向こう側に移動できるギミック
このギミックは、「キャラクターのモーション再生」「オブジェクトの回転」「キャラクターの移動」という関数の組み合わせで実装されています。事前に基本的な関数をエンジニアで用意しておけば、ギミックをスクリプターだけで制作できます。
Luaを取り入れる上での考慮点 Luaを採用する際に考慮すべき点もいくつか挙げられました。
スクリプターが自走しやすい環境はメリットである一方、エンジニアが把握していない新しい機能が生まれる可能性 もあります。エンジニアの工数が減る反面、いつの間にか想定していない関数の使い方によってバグが発生していた 、ということが起こり得ます。そのため、フロー整備などを事前に考慮しておく対策が必要とのこと。
また、自由度が高いがゆえに制御しづらくなってしまう懸念点もあります 。Luaスクリプトが煩雑化しバグ対応などがしづらくなってしまったため、実装を最終的にC#へ寄せたギミックもいくつかあったそうです。先ほど例に挙げた回転する扉 も、中断処理などを考慮した結果、最終的にはC#で実装されることとなりました。
C#への移行作業自体は、Lua経由で呼んでいた関数をそのままC#で呼び出すようにする のみで完結するため、コストは大きくありません。ただし、「どこまでLuaスクリプトで作るのか」を意識して開発を進めた方がよいと佐藤氏は語りました。
最後に佐藤氏は、「Luaを導入する際は、コーディングルールを決めるなど開発の地盤を整えておくと扱いやすくなる。Luaスクリプトに頼りすぎず、時にはC#の実装に寄せる判断も大事である。」と語り、講演を締めくくりました。
「大規模開発におけるLuaスクリプトの活用方法」CAGC2024公式サイト 『FINAL FANTASY VII EVER CRISIS』公式サイト
ゲーム会社で16年間、マニュアル・コピー・シナリオとライター職を続けて現在フリーライターとして活動中。 ゲーム以外ではパチスロ・アニメ・麻雀などが好きで、パチスロでは他媒体でも記事を執筆しています。 SEO検定1級(全日本SEO協会)、日本語検定 準1級&2級(日本語検定委員会)、DTPエキスパート・マイスター(JAGAT)など。