SlideShare ist ein Scribd-Unternehmen logo
1 von 62
『アナザーエデン 時空を超える猫』
スマートフォンでのRPG体験の実現のためにしてきたこと
2018/3/30
⻄⽥ 綾佑
⻄⽥ 綾佑 (Nishida Ryosuke)
Wright Flyer Studios
アナザーエデン
@hosi_mo
2014年 東京⼤学⼤学院 情報理⼯学系研究科修了
同年 グリー株式会社 ⼊社
消滅都市 (2014/5/26~)
ららマジ (2017/1/25~)
武器よさらば (2017/3/30~)
アナザーエデン (2017/4/12~)
ダンまち 〜メモリア・フレーゼ〜 (2017/6/19~)
VR スタジオも内包
2014年2⽉21⽇設⽴
現在5年⽬の社内ゲームスタジオ
Wright Flyer Studios
⽬次
•システム⾯から⽀えたRPG体験のための⼯夫
•膨⼤なイベントスクリプトから創られたRPG体験
システム⾯から⽀えたRPG体験の
ための⼯夫
差異の解消 ≒ 進化
スマートフォン
ゲーム
コンシューマゲーム
との差異の解消
≒
?
よりコンシューマゲームっぽい作り⽅をしてみる
スマホゲーム vs コンシューマゲーム
スマホ コンシューマ
ゲームサイクル ホーム -> ゲーム ゲーム -> 設定
運⽤形態 サービス パッケージ
更新頻度 ⾼ 低
1プレイ時間 5分から10分 数⼗分
データ通信頻度 ⾼ 低
ダウンロード 分割か逐次 ⼀括
ユーザデータ サーバ ローカル
スマホゲーム vs コンシューマゲーム
スマホ コンシューマ
ゲームサイクル ホーム -> ゲーム ゲーム -> 設定
運⽤形態 サービス パッケージ
更新頻度 ⾼ 低
1プレイ時間 5分から10分 数⼗分
データ通信頻度 ⾼ 低
ダウンロード 分割か逐次 ⼀括
ユーザデータ サーバ ローカル
コンシューマライクのために
アナザーエデン の場合
スマホ コンシューマ アナザーエデン
ゲームサイクル ホーム -> ゲーム ゲーム -> 設定 ゲーム -> 設定
運⽤形態 サービス パッケージ サービス
更新頻度 ⾼ 低 中
1プレイ時間 5分から10分 数⼗分 数⼗分
データ通信頻度 ⾼ 低 ⾼ (Background)
ダウンロード 分割か逐次 ⼀括 選択性
ユーザデータ サーバ ローカル ハイブリッド
アナザーエデン の場合
スマホ コンシューマ アナザーエデン
ゲームサイクル ホーム -> ゲーム ゲーム -> 設定 ゲーム -> 設定
運⽤形態 サービス パッケージ サービス
更新頻度 ⾼ 低 中
1プレイ時間 5分から10分 数⼗分 数⼗分
データ通信頻度 ⾼ 低
⾼
(Background)
ダウンロード 分割か逐次 ⼀括 選択性
ユーザデータ サーバ ローカル ハイブリッド
オートセーブ機能
コンシューマライクの第⼀歩
オートセーブのゴール
• プレイヤーの没⼊感を邪魔しない
• ネットワーク環境に依存しない
• いつ中断しても途中からやり直せる
• 割り込みの多いスマフォでも納得感のある挙動を
• ゲームプレイ中、左上に「Auto Saving…」と
表⽰されるタイミングがある
• アプリをkillしても、最後に表⽰されたタイミン
グの状態でゲームが復帰する
「Auto Saving…」
オートセーブのタイミング
• 各種設定UIクローズ時
• フィールドのエリア移動時
• luaイベント終了時
• シナリオ進捗時
• バトル終了時
• 1分に1回(プレイ時間が積み上がる)
ステートが変わる時にセーブ処理
ExplorerState 装備画⾯などのUI表⽰
イベントスクリプト実⾏
エリア移動中
バトル中
釣り中
プレイヤー操作中
ExplorerStateに戻る
タイミングでオートセーブ
FishingState
WarpState
BattleState
EventScriptStat
GlobalUIState
クライアントからサーバへの同期
GameServer
msgpack
AutoSave!
msgpack
Push
diff
Background
}Size = 100
Request Queue
Diff
リクエストごとローカルDBに保存
たくさんリクエストくる
スケーラビリテイだいじ
msgpack
msgpack
msgpack
msgpack
バックグラウンドで同期することで
通信していないか
のように⾒える
通信状態にプレイ
を邪魔されない
レイテンシを気にせず
DBを選択できる
プレイヤー Game Server
オートセーブまとめ
1.オートセーブ制御
2.キューイングとバックグラウンド通信の組み合わせ
アナザーエデンにおける⾮同期オートセーブを⽤いた
通信待ちストレスのないゲーム体験の実現
http://cedec.cesa.or.jp/2017/session/ENG/s58e0fb2eb6330/
https://www.slideshare.net/greetech/ss-79467627
http://gamebiz.jp/?p=192603
膨⼤なイベントスクリプトから
創られたRPG体験
イベントスクリプト
C++製 RPGエンジンのAPIをできる限り多くLuaに解放
イベントスクリプトの種類
Area Script
AreaEvent Script
Story Script
Quest Script
Lottery Script
Enemy Script
Skill Script
- 1エリア1つ。毎フレupdateされる。ランチャ機能付き
- フィールドのギミック全般 ⼀番量が多い
- メインストーリーが記述される。キャラ劇なども記述
- サブクエストが記述される。キャラ劇なども記述
- 出会いキャラ劇の実装
- バトル中の特殊キャラのギミック
- バトル中の味⽅キャラの特殊ギミック
Area Script
AreaEvent Script
- 1エリア1つ。毎フレupdateされる。ランチャ機能付き
- フィールドのギミック全般 ⼀番量が多い
フィールド系 フィールド班
AreaScript
Area EventScriptをたくさん登録してる
AreaEvent Script
部屋の中へ移動
バルーンを表⽰
タップするとプレイヤーのHPを満タンにする
Story Script
Quest Script
Lottery Script
- メインストーリーが記述される。キャラ劇なども記述
- サブクエストが記述される。キャラ劇なども記述
- 出会いキャラ劇の実装
シナリオ系 シナリオ班
QuestScript
AreaScriptからフラグをみて追加される
エルジオンまで到達していたら、
クエスト解放
if Common_isQuestStepActive(quest_step_erujion_chihatokiwokoete_step1) then
Common_registQuestEvent(quest_erujion_chihatokiwokoete, "step1", true)
Enemy Script
Skill Script
- バトル中の特殊キャラのギミック
- バトル中のスキルの特殊ギミック
EnemyScript
特定のボスでHPが⼀定以上削れたら
特殊ギミック発動 等
バトル系 バトル班
製作体制
フィールド班 シナリオ班 バトル班
- シナリオ演出
- キャラ劇の演出
- フィールド作成 (マップエディタ)
- フィールドギミック組み込み
- フィールドパラメータ調整
- fogや天候調整
- シェーダプログラム調整
- レベルデザイン
- バトルギミック設計
レベルデザインから
実装まで⾏う
演出から
実装まで⾏う
フィールドデザインから
実装まで⾏う
アートチームアートチーム アートチーム
製作体制
イベントスクリプト(Lua)を記述できる⼈が25⼈
チーム全体が70~80⼈
⼈によってそれぞれに味わい深いイベントが組まれる
イベントスクリプト事例
実装を⾒てみましょう
⼆度寝
⻤ごっこ
時間によって変化する床
フィールド効果事例
制御をみてみましょう
カメラの画⾓を毎フレーム調整
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)
特定の箇所のみキャラクターのライトを変更 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
特定の場所で全体ライトを変更 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)
余談
⻤のようなミニゲームスクリプト
運⽤とイベントスクリプト
これらの⼊稿にもはやエンジニアという職種は関わっていない
フィールド班
シナリオ班
バトル班
PC版ビルド
(Mac, Windows)
Shift + Rでリロード
イベントスクリプト修正
ok? ⼊稿
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
スクリプトの規模
リリース時(2017年4⽉) : 63万⾏
20170531 709077 +72238
20170630 804724 +95647
20170731 861798 +57074
1年で100万⾏ペース
現在(2018年3⽉) : 146万⾏
イベントスクリプトに
最⼤限の裁量を
スクリプトまとめ
•C++製 RPGエンジンのAPIをできる限り多くLuaに解放
•イベントスクリプト x オートセーブの合わせ技
•職⼈スクリプター
セキュリティの話
クライアント主導のデータ変更
サーバにロジックを置くケース
サーバにロジックを置くケース
1. サーバからクライアントへ命令送信(APIコールのレスポンスに⼊れる
• クライアントから完了通知が来るまでサーバの命令は不揮発性
2. クライアントがデータを変更
3. オートセーブ時に差分をサーバへ送信(完了済の命令idも送信
4. サーバは命令を削除
サーバからデータ更新命令を送信
Operation Builder
OperationBuilderの流れ : 図
diff
API Call
抽選
OperationBuilde
DB 変
AutoSave
出会い実⾏
命令削除完了報告
OperationBuilderのキモ
• サーバ
• クライアントから完了報告が来るまでは、処理が終わっていな
いものとみなす
• 終わったときちんと⾔ってくるまで、何度も命令を送りなおす
• クライアント側
• 処理完了をかならず差分と⼀緒に保存する
• ⼆回実⾏するのを防ぐ
• ⼆回実⾏してもいいが、実⾏前の状態に巻き戻してからだ
クライアントがデータ作っていることについて
クライアントがデータ作っていることについて
•Luaに全開放している
• データ群、スクリプト群、DB群は暗号化
• イベントスクリプトのチェックサムlogを収集
• メモリも単純なチートツールからは⾒れないよう難読化
• データの発⾏は出所がわかるように全てにタグをつける
• 何か怪しいと思ったらlogを遡る
チートリスクへの対応
• クライアント > サーバとすると、チートリスクが⼀気に増⼤する
• 制御不能になる可能性さえある
• だが、いずれにせよ「完璧に網羅して塞ぐ」はありえない
• ログを適切にとり、調査可能にする
• 個別に⼿続きを⽤意して、ひとつひとつ認証していく
署名
終わりに
•システム⾯から⽀えたRPG体験のための⼯夫
•膨⼤なイベントスクリプトから創られたRPG体験
本格スマホRPG『アナザーエデン』開発の裏側を包み隠さずお話します 〜コード
資産も無く、チームとしての経験も豊富ではない中エンジニアはどう挑んだのか〜
http://cedec.cesa.or.jp/2017/session/ENG/s591428ca963a1/
https://www.youtube.com/watch?v=dEZ31MWhC40
http://gamebiz.jp/?p=192924
引き続き、RPGに全⼒で挑みます!
『アナザーエデン 時空を超える猫』スマートフォンでのRPG体験の実現のためにしてきたこと

Weitere ähnliche Inhalte

Mehr von gree_tech

GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介gree_tech
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表gree_tech
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~gree_tech
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化gree_tech
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介gree_tech
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介gree_tech
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてgree_tech
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験gree_tech
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組みgree_tech
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違いgree_tech
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介gree_tech
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてgree_tech
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーgree_tech
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-gree_tech
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話gree_tech
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)gree_tech
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜gree_tech
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)gree_tech
 
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-gree_tech
 

Mehr von gree_tech (20)

GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
GREE VR Studio Laboratory「XR-UX Devプロジェクト」の成果紹介
 
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
REALITYアバターを様々なメタバースで活躍させてみた - GREE VR Studio Laboratory インターン研究成果発表
 
アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~アプリ起動時間高速化 ~推測するな、計測せよ~
アプリ起動時間高速化 ~推測するな、計測せよ~
 
長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化長寿なゲーム事業におけるアプリビルドの効率化
長寿なゲーム事業におけるアプリビルドの効率化
 
Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介Cloud Spanner をより便利にする運用支援ツールの紹介
Cloud Spanner をより便利にする運用支援ツールの紹介
 
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
 
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現についてSINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
SINoALICE -シノアリス- Google Cloud Firestoreを用いた観戦機能の実現について
 
海外展開と負荷試験
海外展開と負荷試験海外展開と負荷試験
海外展開と負荷試験
 
翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み翻訳QAでのテスト自動化の取り組み
翻訳QAでのテスト自動化の取り組み
 
組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い組み込み開発のテストとゲーム開発のテストの違い
組み込み開発のテストとゲーム開発のテストの違い
 
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介サーバーフレームワークに潜んでる脆弱性検知ツール紹介
サーバーフレームワークに潜んでる脆弱性検知ツール紹介
 
データエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件についてデータエンジニアとアナリストチーム兼務になった件について
データエンジニアとアナリストチーム兼務になった件について
 
シェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジーシェアドサービスとしてのデータテクノロジー
シェアドサービスとしてのデータテクノロジー
 
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
「ドキュメント見つからない問題」をなんとかしたい - 横断検索エンジン導入の取り組みについて-
 
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
「Atomic Design × Nuxt.js」コンポーネント毎に責務の範囲を明確にしたら幸せになった話
 
比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)比較サイトの検索改善(SPA から SSR に変換)
比較サイトの検索改善(SPA から SSR に変換)
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
「やんちゃ、足りてる?」〜ヤンマガWebで挑戦を続ける新入りエンジニア〜
 
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
法人向けメタバースプラットフォームの開発の裏側をのぞいてみた(仮)
 
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
基調講演 -グリーが目指すエンジニアのあり方、チームのあり方-
 

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