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

    関連記事

    AIはイテレーションを回すために活用すべし!中割りの生成やリアルなエフェクトのアニメ調変換など、エフェクト制作へのAI活用を模索したR&Dの苦労と展望をインタビュー【CAGC2024】
    2024.04.16
    自社ツールが可能にする開発効率化の8つの観点──「大規模開発を効率化させるUnityのツール紹介」セッションレポート【CAGC2024】
    2024.03.19
    インディーゲームパブリッシャーに聞く! Vol.02「パブリッシャーごとの違いは?」
    2024.04.15
    RE ENGINEで10,000体の恐竜群を制御!『エグゾプライマル』超大量のエネミーを表現するために施された最適化を深堀りしたセッションをレポート【GCC2024】
    2024.04.12
    ゲーム制作者が選ぶ!「クリエイターにオススメな書籍」読者アンケートを大募集!
    2024.04.10
    ノベルゲーム・アドベンチャーゲーム開発に便利な主要ノベルエンジンまとめ
    2024.04.10

    注目記事ランキング

    2024.04.09 - 2024.04.16
    1
    フォートナイトとUEFNがv29.20にアップデート。見下ろし視点でもプレイヤーキャラクターの向きを操作できるようになった
    2
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧
    3
    『フォートナイト』で動く本格的なゲームが作れるツール「UEFN」とは?従来のクリエイティブモードから進化したポイントを一挙紹介!
    4
    【CHALLENGE1】「クリエイター ポータル」を使って、UEFNで作成した島を世界中に公開する
    5
    【2022年5月版】今から始めるフォートナイトの「クリエイティブ」モードープレイ開始から基本的な操作方法まで解説
    6
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.1「アイテム系」
    7
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.5「島の設定」
    8
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.7「NPC系」Part1
    9
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.2「ユーティリティ系」
    10
    『フォートナイト』で建築ビジュアライゼーション!?UEFNでオリジナルの世界観をどう作り上げたか、その手法を解説【UNREAL FEST 2023 TOKYO】
    11
    【CHALLENGE3】UEFNの機能「ランドスケープ」を使ってオリジナルの地形を作る
    12
    【CHALLENGE2-1】フレンドと一緒にゲームを作ろう――UEFNプロジェクトをチームメンバーとリアルタイムで共同編集する
    13
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.7「NPC系」Part2
    14
    UEFNで使えるプログラミング言語「Verse」のノウハウが集結。『UEFN.Tokyo 勉強会 03 Verse Night』レポート
    15
    【STEP2】UEFNの基本的な使い方を覚えよう
    16
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.6「チーム・対戦系」Part1
    17
    まるで『マイクラ』?ボクセル地形を生み出す無料アセット「VoxelPlugin Free」で”地形を掘ったり積み重ねたり”して遊んでみよう
    18
    フルカラー書籍「UEFN(Unreal Editor For Fortnite)でゲームづくりを始めよう!」、ついに本日発売!全国書店で好評発売中!
    19
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.10「UI系」Part1
    20
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.4「ゲームシステム系」
    21
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.3「プレイヤー系」
    22
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.8「ゾーン系」
    23
    【STEP1】「UEFN」を入手しよう
    24
    フォートナイトとUEFNがv29.10にアップデート。プレイヤーのジャンプや射撃などの入力を無効化するオプションが追加
    25
    【STEP5-1】スタート時のカウントダウンを作る
    26
    「UEFN」って実際どうなの? 編集部が3時間で「みんなで遊べるアクションゲーム(?)」を作ってみた
    27
    【STEP3】オリジナルのアスレチックコースを作ろう
    28
    【STEP4-2】リスポーンとチェックポイントの仕組みを作る
    29
    フォートナイト クリエイティブとUEFNで使える仕掛け一覧 Vol.9「建築物系」Part2
    30
    GDC 2024で行われた「State of Unreal」UEFN関連の発表内容まとめ。UEFNがMetaHumanを正式サポート
    VIEW MORE

    イベントカレンダー

    VIEW MORE

    今日の用語

    マーケットプレイス(Market Place)
    マーケットプレイス
    1. インターネット上で売買を行う仕組みやウェブサイト自体を示す。
    2. Epic Games LauncherやアンリアルエンジンのWebサイトからアクセスできる、アンリアルエンジン用のオンラインストア。アセットやプラグインなどの販売・購入が可能。
    VIEW MORE

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