Slide 1

Slide 1 text

『アナザーエデン 時空を超える猫』 スマートフォンでのRPG体験の実現のためにしてきたこと 2018/3/30 ⻄⽥ 綾佑

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

⻄⽥ 綾佑 (Nishida Ryosuke) Wright Flyer Studios アナザーエデン @hosi_mo 2014年 東京⼤学⼤学院 情報理⼯学系研究科修了 同年 グリー株式会社 ⼊社

Slide 4

Slide 4 text

消滅都市 (2014/5/26~) ららマジ (2017/1/25~) 武器よさらば (2017/3/30~) アナザーエデン (2017/4/12~) ダンまち 〜メモリア・フレーゼ〜 (2017/6/19~) VR スタジオも内包 2014年2⽉21⽇設⽴ 現在5年⽬の社内ゲームスタジオ Wright Flyer Studios

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

⽬次 •システム⾯から⽀えたRPG体験のための⼯夫 •膨⼤なイベントスクリプトから創られたRPG体験

Slide 7

Slide 7 text

システム⾯から⽀えたRPG体験の ための⼯夫

Slide 8

Slide 8 text

差異の解消 ≒ 進化 スマートフォン ゲーム コンシューマゲーム との差異の解消 ≒ ? よりコンシューマゲームっぽい作り⽅をしてみる

Slide 9

Slide 9 text

スマホゲーム vs コンシューマゲーム スマホ コンシューマ ゲームサイクル ホーム -> ゲーム ゲーム -> 設定 運⽤形態 サービス パッケージ 更新頻度 ⾼ 低 1プレイ時間 5分から10分 数⼗分 データ通信頻度 ⾼ 低 ダウンロード 分割か逐次 ⼀括 ユーザデータ サーバ ローカル

Slide 10

Slide 10 text

スマホゲーム vs コンシューマゲーム スマホ コンシューマ ゲームサイクル ホーム -> ゲーム ゲーム -> 設定 運⽤形態 サービス パッケージ 更新頻度 ⾼ 低 1プレイ時間 5分から10分 数⼗分 データ通信頻度 ⾼ 低 ダウンロード 分割か逐次 ⼀括 ユーザデータ サーバ ローカル

Slide 11

Slide 11 text

コンシューマライクのために

Slide 12

Slide 12 text

アナザーエデン の場合 スマホ コンシューマ アナザーエデン ゲームサイクル ホーム -> ゲーム ゲーム -> 設定 ゲーム -> 設定 運⽤形態 サービス パッケージ サービス 更新頻度 ⾼ 低 中 1プレイ時間 5分から10分 数⼗分 数⼗分 データ通信頻度 ⾼ 低 ⾼ (Background) ダウンロード 分割か逐次 ⼀括 選択性 ユーザデータ サーバ ローカル ハイブリッド

Slide 13

Slide 13 text

アナザーエデン の場合 スマホ コンシューマ アナザーエデン ゲームサイクル ホーム -> ゲーム ゲーム -> 設定 ゲーム -> 設定 運⽤形態 サービス パッケージ サービス 更新頻度 ⾼ 低 中 1プレイ時間 5分から10分 数⼗分 数⼗分 データ通信頻度 ⾼ 低 ⾼ (Background) ダウンロード 分割か逐次 ⼀括 選択性 ユーザデータ サーバ ローカル ハイブリッド

Slide 14

Slide 14 text

オートセーブ機能 コンシューマライクの第⼀歩

Slide 15

Slide 15 text

オートセーブのゴール • プレイヤーの没⼊感を邪魔しない • ネットワーク環境に依存しない • いつ中断しても途中からやり直せる • 割り込みの多いスマフォでも納得感のある挙動を

Slide 16

Slide 16 text

• ゲームプレイ中、左上に「Auto Saving…」と 表⽰されるタイミングがある • アプリをkillしても、最後に表⽰されたタイミン グの状態でゲームが復帰する 「Auto Saving…」

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

オートセーブのタイミング • 各種設定UIクローズ時 • フィールドのエリア移動時 • luaイベント終了時 • シナリオ進捗時 • バトル終了時 • 1分に1回(プレイ時間が積み上がる)

Slide 19

Slide 19 text

ステートが変わる時にセーブ処理 ExplorerState 装備画⾯などのUI表⽰ イベントスクリプト実⾏ エリア移動中 バトル中 釣り中 プレイヤー操作中 ExplorerStateに戻る タイミングでオートセーブ FishingState WarpState BattleState EventScriptStat GlobalUIState

Slide 20

Slide 20 text

クライアントからサーバへの同期 GameServer msgpack AutoSave! msgpack Push diff Background }Size = 100 Request Queue Diff リクエストごとローカルDBに保存 たくさんリクエストくる スケーラビリテイだいじ msgpack msgpack msgpack msgpack

Slide 21

Slide 21 text

バックグラウンドで同期することで 通信していないか のように⾒える 通信状態にプレイ を邪魔されない レイテンシを気にせず DBを選択できる プレイヤー Game Server

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

オートセーブまとめ 1.オートセーブ制御 2.キューイングとバックグラウンド通信の組み合わせ

Slide 24

Slide 24 text

アナザーエデンにおける⾮同期オートセーブを⽤いた 通信待ちストレスのないゲーム体験の実現 http://cedec.cesa.or.jp/2017/session/ENG/s58e0fb2eb6330/ https://www.slideshare.net/greetech/ss-79467627 http://gamebiz.jp/?p=192603

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

膨⼤なイベントスクリプトから 創られたRPG体験

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

イベントスクリプト C++製 RPGエンジンのAPIをできる限り多くLuaに解放

Slide 29

Slide 29 text

イベントスクリプトの種類 Area Script AreaEvent Script Story Script Quest Script Lottery Script Enemy Script Skill Script - 1エリア1つ。毎フレupdateされる。ランチャ機能付き - フィールドのギミック全般 ⼀番量が多い - メインストーリーが記述される。キャラ劇なども記述 - サブクエストが記述される。キャラ劇なども記述 - 出会いキャラ劇の実装 - バトル中の特殊キャラのギミック - バトル中の味⽅キャラの特殊ギミック

Slide 30

Slide 30 text

Area Script AreaEvent Script - 1エリア1つ。毎フレupdateされる。ランチャ機能付き - フィールドのギミック全般 ⼀番量が多い フィールド系 フィールド班 AreaScript Area EventScriptをたくさん登録してる AreaEvent Script 部屋の中へ移動 バルーンを表⽰ タップするとプレイヤーのHPを満タンにする

Slide 31

Slide 31 text

Story Script Quest Script Lottery Script - メインストーリーが記述される。キャラ劇なども記述 - サブクエストが記述される。キャラ劇なども記述 - 出会いキャラ劇の実装 シナリオ系 シナリオ班 QuestScript AreaScriptからフラグをみて追加される エルジオンまで到達していたら、 クエスト解放 if Common_isQuestStepActive(quest_step_erujion_chihatokiwokoete_step1) then Common_registQuestEvent(quest_erujion_chihatokiwokoete, "step1", true)

Slide 32

Slide 32 text

Enemy Script Skill Script - バトル中の特殊キャラのギミック - バトル中のスキルの特殊ギミック EnemyScript 特定のボスでHPが⼀定以上削れたら 特殊ギミック発動 等 バトル系 バトル班

Slide 33

Slide 33 text

製作体制 フィールド班 シナリオ班 バトル班 - シナリオ演出 - キャラ劇の演出 - フィールド作成 (マップエディタ) - フィールドギミック組み込み - フィールドパラメータ調整 - fogや天候調整 - シェーダプログラム調整 - レベルデザイン - バトルギミック設計 レベルデザインから 実装まで⾏う 演出から 実装まで⾏う フィールドデザインから 実装まで⾏う アートチーム アートチーム アートチーム

Slide 34

Slide 34 text

製作体制 イベントスクリプト(Lua)を記述できる⼈が25⼈ チーム全体が70~80⼈ ⼈によってそれぞれに味わい深いイベントが組まれる

Slide 35

Slide 35 text

イベントスクリプト事例 実装を⾒てみましょう

Slide 36

Slide 36 text

⼆度寝

Slide 37

Slide 37 text

⻤ごっこ

Slide 38

Slide 38 text

時間によって変化する床

Slide 39

Slide 39 text

フィールド効果事例 制御をみてみましょう

Slide 40

Slide 40 text

カメラの画⾓を毎フレーム調整 if pos.x <= 0 and pos.x >= posD.x then Common_setCameraInfoFOV(fov) Common_setCameraInfoAngleV(15) elseif pos.x <= posD.x then Common_setCameraInfoFOV(60) Common_setCameraInfoAngleV(15)

Slide 41

Slide 41 text

特定の箇所のみキャラクターのライトを変更 if v_chr_1.x >= v_left.x and v_chr_1.x <= v_right.x then Common_setCharacterLightColor(0.1, 1.4, 1.5, 1.3, 1) else

Slide 42

Slide 42 text

特定の場所で全体ライトを変更 if pos.z < posT1.z and pos.x > posT2.x and pos.x <= posT3.x then Common_setForegroundLightColor(0.3, 0.7, 0.7, 0.7, 1) Common_setCharacterLightColor(0.3, 0.7, 0.7, 0.7, 1) else Common_setForegroundLightColor(0.3, 1, 1, 1, 1) Common_setCharacterLightColor(0.3, 1, 1, 1, 1)

Slide 43

Slide 43 text

余談 ⻤のようなミニゲームスクリプト

Slide 44

Slide 44 text

運⽤とイベントスクリプト これらの⼊稿にもはやエンジニアという職種は関わっていない フィールド班 シナリオ班 バトル班 PC版ビルド (Mac, Windows) Shift + Rでリロード イベントスクリプト修正 ok? ⼊稿

Slide 45

Slide 45 text

APIリスト C++がLuaに公開してるAPI数 525 バトル カメラ制御 フィールドオブジェクト制御 UI アイテム サウンド、ムービー フィールドエフェクト (fogとか影とか) 移動 フラグ - 約 50 API - 約 30 API - 約 150 API - 約 20 API - 約 10 API - 約 20 API - 約 100 API - 約 30 API - 約 100 API

Slide 46

Slide 46 text

スクリプトの規模 リリース時(2017年4⽉) : 63万⾏ 20170531 709077 +72238 20170630 804724 +95647 20170731 861798 +57074 1年で100万⾏ペース 現在(2018年3⽉) : 146万⾏

Slide 47

Slide 47 text

イベントスクリプトに 最⼤限の裁量を

Slide 48

Slide 48 text

スクリプトまとめ •C++製 RPGエンジンのAPIをできる限り多くLuaに解放 •イベントスクリプト x オートセーブの合わせ技 •職⼈スクリプター

Slide 49

Slide 49 text

セキュリティの話 クライアント主導のデータ変更

Slide 50

Slide 50 text

サーバにロジックを置くケース

Slide 51

Slide 51 text

サーバにロジックを置くケース 1. サーバからクライアントへ命令送信(APIコールのレスポンスに⼊れる • クライアントから完了通知が来るまでサーバの命令は不揮発性 2. クライアントがデータを変更 3. オートセーブ時に差分をサーバへ送信(完了済の命令idも送信 4. サーバは命令を削除 サーバからデータ更新命令を送信 Operation Builder

Slide 52

Slide 52 text

OperationBuilderの流れ : 図 diff API Call 抽選 OperationBuilde DB 変 AutoSave 出会い実⾏ 命令削除 完了報告

Slide 53

Slide 53 text

OperationBuilderのキモ • サーバ • クライアントから完了報告が来るまでは、処理が終わっていな いものとみなす • 終わったときちんと⾔ってくるまで、何度も命令を送りなおす • クライアント側 • 処理完了をかならず差分と⼀緒に保存する • ⼆回実⾏するのを防ぐ • ⼆回実⾏してもいいが、実⾏前の状態に巻き戻してからだ

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

クライアントがデータ作っていることについて

Slide 56

Slide 56 text

クライアントがデータ作っていることについて •Luaに全開放している • データ群、スクリプト群、DB群は暗号化 • イベントスクリプトのチェックサムlogを収集 • メモリも単純なチートツールからは⾒れないよう難読化 • データの発⾏は出所がわかるように全てにタグをつける • 何か怪しいと思ったらlogを遡る

Slide 57

Slide 57 text

チートリスクへの対応 • クライアント > サーバとすると、チートリスクが⼀気に増⼤する • 制御不能になる可能性さえある • だが、いずれにせよ「完璧に網羅して塞ぐ」はありえない • ログを適切にとり、調査可能にする • 個別に⼿続きを⽤意して、ひとつひとつ認証していく 署名

Slide 58

Slide 58 text

終わりに

Slide 59

Slide 59 text

•システム⾯から⽀えたRPG体験のための⼯夫 •膨⼤なイベントスクリプトから創られたRPG体験

Slide 60

Slide 60 text

本格スマホRPG『アナザーエデン』開発の裏側を包み隠さずお話します 〜コード 資産も無く、チームとしての経験も豊富ではない中エンジニアはどう挑んだのか〜 http://cedec.cesa.or.jp/2017/session/ENG/s591428ca963a1/ https://www.youtube.com/watch?v=dEZ31MWhC40 http://gamebiz.jp/?p=192924

Slide 61

Slide 61 text

引き続き、RPGに全⼒で挑みます!

Slide 62

Slide 62 text

No content