Slide 1

Slide 1 text

大規模開発における Luaスクリプトの活用方法 1 クライアントエンジニア / FINAL FANTASY VII EVER CRISIS 佐藤 彩理 Sato Ayari

Slide 2

Slide 2 text

FINAL FANTASY VII EVER CRISIS 2

Slide 3

Slide 3 text

FINAL FANTASY VII EVER CRISISとは? 3 『FINAL FANTASY VII』シリーズ最新作のスマートフォン向けタイトル 原作『FINAL FANTASY VII』から『CRISIS CORE -FINAL FANTASY VII-』を 始めとするストーリーと、完全新作オリジナルストーリーが楽しめ、 魔法やアビリティを繰り出すコマンドバトルをスマートフォンならではの 操作性で体験できる。 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 4

Slide 4 text

FF7ECの掛け合いについて 4 『FINAL FANTASY VII EVER CRISIS』のストーリー部分、 所謂、掛け合いパートに関してはLuaスクリプトを用いて実装されています。 今回のセッションでは、 『FINAL FANTASY VII EVER CRISIS』での Luaスクリプトの活用方法について紹介させていただきます。 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 5

Slide 5 text

なぜLuaスクリプトを採用したのか? 5

Slide 6

Slide 6 text

なぜLuaスクリプトを採用したのか? 6 以下の箇所で共通の仕組みを利用したかった。 ・プレイアブルなエリアでのイベントの管理 ・アドベンチャーパート メンバーのスキルセットも考慮し、 スクリプト言語を使用することに決定!

Slide 7

Slide 7 text

なぜLuaスクリプトを採用したのか? 7 どのスクリプト言語を使用するか考えた時に、 ・メジャーなスクリプト言語である ・スクリプターの採用がしやすい という点から数あるスクリプト言語の中からLua言語を採用。

Slide 8

Slide 8 text

Luaを使用した開発フロー 8

Slide 9

Slide 9 text

Luaを使用した開発フロー 9 Luaを使用している箇所は主に以下。 ・ダンジョン中のギミック ・アドベンチャーパートの掛け合い ・チョコボ農場 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 10

Slide 10 text

ダンジョン中のギミック 10 ダンジョン中に存在しているギミックの一部はLuaスクリプトで実装。 ギミックのLuaスクリプトはマップと同時にプランナーが制作している。 特に演出や選択肢を伴ったギミックは、 Luaスクリプトで実装されていることが多い。 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 11

Slide 11 text

アドベンチャーパートの掛け合い 11 ストーリー中のアドベンチャーパートはLuaスクリプトで書かれている。 キャラクターのモーション再生やセリフの再生などの演出は、 全てLua言語にてスクリプターが制作している。 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 12

Slide 12 text

チョコボ農場 12 ・NPCとの会話 ・チョコボとの会話 ・遠征報酬に応じた袋の増減 などがLuaスクリプトで実装されている。 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 13

Slide 13 text

Luaを使用した開発フロー 13 C#で関数を定義して、Luaから呼び出す形で実装をしている。 計算やif文も使用できるので、フラグに依存した分岐処理なども可能。 public void move(float x, float y, float z) { // (x, y, z) の座標に移動するような処理 } -- valueが1なら(1.0, 2.0, 3.0)の座標に移動 if value == 1 then move(1.0, 2.0, 3.0) end C#の関数定義 Luaから呼び出し

Slide 14

Slide 14 text

Luaを使用した開発フロー 14 Luaで扱うC#のクラスにAttributeをつけることで、 そのクラスのインスタンスをLuaでC#のクラスのように扱うことも可能。 [LuaClass] public class CharacterClass { public void move(float x, float y, float z) { // (x, y, z) の座標に移動するような処理 } } C#のクラス定義

Slide 15

Slide 15 text

Luaを使用した開発フロー 15 例えば、キャラクターが歩いてきてセリフをいうようなシーンだと…… まず特定の座標まで歩く関数と、セリフを出す関数をC#側で用意する。 public void move(float x, float y, float z) { // (x, y, z) の座標に移動するような処理 } C#の関数定義(移動) public void talk(string message) { // message というセリフを表示 } C#の関数定義(セリフ)

Slide 16

Slide 16 text

Luaを使用した開発フロー 16 C#側で用意した関数を使用して、Luaスクリプトで演出を組み立てる。 非同期処理も可能◎ -- (1.0, 2.0, 3.0)の座標に移動する character.move(1.0, 2.0, 3.0) -- 移動完了を待機 coroutine.yield() -- 「到着」のセリフ表示 talk("到着") Luaから呼び出し

Slide 17

Slide 17 text

Luaを使用した開発フロー 17 Luaスクリプトを書く際の効率化のため、 C#の関数のAttributeからスニペットを自動生成出来るような 仕組みを開発。 [LuaFunctionSetting("移動")] public void move(float x, float y, float z) { // (x, y, z) の座標に移動するような処理 } C#の関数定義 "move": { "prefix": "move" "body": [ "move(${1:x}, ${2:y}, ${3:z})" ], "description": "移動" }, スニペット

Slide 18

Slide 18 text

Luaを使用した開発フロー 18 Visual Studio Codeに独自のスニペットとして登録して使用。

Slide 19

Slide 19 text

Luaスクリプトを採用したメリットと考慮点 19

Slide 20

Slide 20 text

Luaスクリプトを採用したメリット 20 ・エンジニアがC#の関数を用意してしまえば、  あとはスクリプターのみで完結し、自走しやすい環境に。 ・UnityではLua言語を扱うためのライブラリも豊富なので、  大規模なツール開発が必要ない。 ・独自言語ではないので過去に扱ったことのある人もおり、  スクリプターの採用がしやすい。

Slide 21

Slide 21 text

Luaスクリプトを採用したメリット 21 例えば、この回転する扉はLuaスクリプトで実装されていた。 © SQUARE ENIX Powered by Applibot, Inc. CHARACTER DESIGN: TETSUYA NOMURA / CHARACTER ILLUSTRATION: LISA FUJISE

Slide 22

Slide 22 text

Luaスクリプトを採用したメリット 22 回転する扉はおおまかにこのようなスクリプトで実現が可能。 -- 扉を叩くモーション再生 character.playMotion("knock") -- 扉回転 door.rotate(90) -- キャラクター移動 character.move(0.0, 0.0, 2.0) -- 扉回転 door.rotate(-90) Luaスクリプト

Slide 23

Slide 23 text

Luaスクリプトを採用する際に考慮した方が良いこと 23 ・運用でのギミック開発へのエンジニアの工数が減る反面、  エンジニアが把握していない新しい機能が出来ていて  時にはバグ対応の難易度があがることも。 ・自由度が高い故に、制御しづらいこともある。  → 元々Luaスクリプトで実装していたけれど    煩雑になり過ぎてc#に寄せたギミックもあった。

Slide 24

Slide 24 text

Luaスクリプトを採用したメリット 24 回転する扉は中断処理などを考慮してC#の実装へ変更。 Luaスクリプト経由で呼んでいたメソッドを叩くだけなので移行は簡単。 // 扉を叩くモーション再生 Character.PlayMotion("knock") // ドア回転 Door.Rotate(90) // キャラクター移動 Character.Move(0.0, 0.0, 2.0) // ドア回転 Door.Rotate(-90) C#スクリプト

Slide 25

Slide 25 text

まとめ 25

Slide 26

Slide 26 text

まとめ 26 Luaスクリプト導入によってエンジニアが演出を細かく実装する必要が なくなり、スクリプターが自走しやすい環境を作ることが出来る。 導入の際は制御しやすいようにコーディングルールを決めるなど、 開発の地盤を整えると扱いやすくなる。 Luaスクリプトに頼りすぎず、時にはC#の実装に寄せる判断も大事。