Unity C#の関数を誰でも扱えるように。『FF7EC』におけるスクリプト言語「Lua」活用テクニック【CAGC2024】

2024.03.22
注目記事ゲームづくりの知識しくみをつくるゲームの舞台裏講演レポートCyberAgent Game Conference 2024
この記事をシェア!
Twitter Facebook LINE B!
Twitter Facebook LINE B!

サイバーエージェントのゲーム・エンターテイメント事業部(SGE)初開催のカンファレンス「CyberAgent Game Conference 2024」が、2024年3月7日に開催されました。

『FINAL FANTASY VII EVER CRISIS』(以下、『FF7EC』)の掛け合い部分や、ダンジョン中のギミックなどで用いられたLuaスクリプトの活用方法について語られた、アプリボット クライアントエンジニア 佐藤 彩理氏によるセッション「大規模開発におけるLuaスクリプトの活用方法」をレポートします。

TEXT / じく
EDIT / 神谷 優斗

目次

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)など。

    関連記事

    『呪術廻戦 ファンパレ』シナリオパート制作に迫る開発者インタビュー。Live2Dキャラクターの実在感を高める3Dライティングと作品愛あふれるワークフロー【CAGC2024】
    2024.07.03
    『プロセカ』3周年で行った200画面以上のUIリニューアルを振り返る開発者インタビュー。運営との並行作業、見えない工数、そして発足した“UIの夢を追う会”【CAGC2024】
    2024.05.09
    AIはイテレーションを回すために活用すべし!中割りの生成やリアルなエフェクトのアニメ調変換など、エフェクト制作へのAI活用を模索したR&Dの苦労と展望をインタビュー【CAGC2024】
    2024.04.16
    自社ツールが可能にする開発効率化の8つの観点──「大規模開発を効率化させるUnityのツール紹介」セッションレポート【CAGC2024】
    2024.03.19
    Unity公式イベント「U/Day Tokyo 2024」現地レポート!Unity 6以降のロードマップやHTML/CSSライクにUIを作れる新機能など全9セッション情報から気になる情報をお届け
    2024.07.11
    ゲーム開発者必見のカンファレンス10選【GDC・CEDEC・Unreal Fest・U/Dayなど】
    2024.07.11

    注目記事ランキング

    2024.07.08 - 2024.07.15
    VIEW MORE

    連載・特集ピックアップ

    イベントカレンダー

    VIEW MORE

    今日の用語

    レベル(Level)
    レベル
    1. ゲーム開発において、位置情報を持つオブジェクトが配置されている地形。
    2. RPGなどのゲームにおいて、キャラクターの成長度合いを示す数値。レベルアップなど。
    VIEW MORE

    Twitterで最新情報を
    チェック!