Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
『アナザーエデン 時空を超える猫』スマートフォンでのRPG体験の実現のためにしてきたこと
Search
gree_tech
PRO
March 30, 2018
Technology
0
340
『アナザーエデン 時空を超える猫』スマートフォンでのRPG体験の実現のためにしてきたこと
GAME CREATORS CONFERENCE '18にて発表されたスライドです。
http://www.gc-conf.com/
gree_tech
PRO
March 30, 2018
Tweet
Share
More Decks by gree_tech
See All by gree_tech
コミュニケーションに鍵を見いだす、エンジニア1年目の経験談
gree_tech
PRO
0
120
REALITY株式会社における開発生産性向上の取り組み: 失敗と成功から学んだこと
gree_tech
PRO
2
1.7k
『ヘブンバーンズレッド』におけるフィールドギミックの裏側
gree_tech
PRO
2
550
セキュリティインシデント対応の体制・運用の試行錯誤 / greetechcon2024-session-a1
gree_tech
PRO
1
560
『アナザーエデン 時空を超える猫』国内海外同時運営実現への道のり ~別々で開発されたアプリを安定して同時リリースするまでの取り組み~
gree_tech
PRO
1
520
『アサルトリリィ Last Bullet』におけるクラウドストリーミング技術を用いたブラウザゲーム化の紹介
gree_tech
PRO
1
610
UnityによるPCアプリの新しい選択肢。「PC版 Google Play Games」への対応について
gree_tech
PRO
1
970
実機ビルドのエラーによる検証ブロッカーを0に!『ヘブンバーンズレッド』のスモークテスト自動化の取り組み
gree_tech
PRO
1
620
"ゲームQA業界の技術向上を目指す! 会社を超えた研究会の取り組み"
gree_tech
PRO
1
740
Other Decks in Technology
See All in Technology
CursorによるPMO業務の代替 / Automating PMO Tasks with Cursor
motoyoshi_kakaku
0
140
なぜ私はいま、ここにいるのか? #もがく中堅デザイナー #プロダクトデザイナー
bengo4com
0
480
Snowflake Summit 2025 データエンジニアリング関連新機能紹介 / Snowflake Summit 2025 What's New about Data Engineering
tiltmax3
0
310
SalesforceArchitectGroupOsaka#20_CNX'25_Report
atomica7sei
0
190
Amazon Bedrockで実現する 新たな学習体験
kzkmaeda
2
580
Lambda Web Adapterについて自分なりに理解してみた
smt7174
4
120
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
440
250627 関西Ruby会議08 前夜祭 RejectKaigi「DJ on Ruby Ver.0.1」
msykd
PRO
2
320
本が全く読めなかった過去の自分へ
genshun9
0
560
"サービスチーム" での技術選定 / Making Technology Decisions for the Service Team
kaminashi
1
150
PHP開発者のためのSOLID原則再入門 #phpcon / PHP Conference Japan 2025
shogogg
4
850
MySQL5.6から8.4へ 戦いの記録
kyoshidaxx
1
260
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Facilitating Awesome Meetings
lara
54
6.4k
Designing for Performance
lara
609
69k
Making Projects Easy
brettharned
116
6.3k
Faster Mobile Websites
deanohume
307
31k
Producing Creativity
orderedlist
PRO
346
40k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Rebuilding a faster, lazier Slack
samanthasiow
82
9.1k
Designing for humans not robots
tammielis
253
25k
Code Reviewing Like a Champion
maltzj
524
40k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Transcript
『アナザーエデン 時空を超える猫』 スマートフォンでのRPG体験の実現のためにしてきたこと 2018/3/30 ⻄⽥ 綾佑
None
⻄⽥ 綾佑 (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
None
⽬次 •システム⾯から⽀えたRPG体験のための⼯夫 •膨⼤なイベントスクリプトから創られたRPG体験
システム⾯から⽀えたRPG体験の ための⼯夫
差異の解消 ≒ 進化 スマートフォン ゲーム コンシューマゲーム との差異の解消 ≒ ? よりコンシューマゲームっぽい作り⽅をしてみる
スマホゲーム vs コンシューマゲーム スマホ コンシューマ ゲームサイクル ホーム -> ゲーム ゲーム
-> 設定 運⽤形態 サービス パッケージ 更新頻度 ⾼ 低 1プレイ時間 5分から10分 数⼗分 データ通信頻度 ⾼ 低 ダウンロード 分割か逐次 ⼀括 ユーザデータ サーバ ローカル
スマホゲーム vs コンシューマゲーム スマホ コンシューマ ゲームサイクル ホーム -> ゲーム ゲーム
-> 設定 運⽤形態 サービス パッケージ 更新頻度 ⾼ 低 1プレイ時間 5分から10分 数⼗分 データ通信頻度 ⾼ 低 ダウンロード 分割か逐次 ⼀括 ユーザデータ サーバ ローカル
コンシューマライクのために
アナザーエデン の場合 スマホ コンシューマ アナザーエデン ゲームサイクル ホーム -> ゲーム ゲーム
-> 設定 ゲーム -> 設定 運⽤形態 サービス パッケージ サービス 更新頻度 ⾼ 低 中 1プレイ時間 5分から10分 数⼗分 数⼗分 データ通信頻度 ⾼ 低 ⾼ (Background) ダウンロード 分割か逐次 ⼀括 選択性 ユーザデータ サーバ ローカル ハイブリッド
アナザーエデン の場合 スマホ コンシューマ アナザーエデン ゲームサイクル ホーム -> ゲーム ゲーム
-> 設定 ゲーム -> 設定 運⽤形態 サービス パッケージ サービス 更新頻度 ⾼ 低 中 1プレイ時間 5分から10分 数⼗分 数⼗分 データ通信頻度 ⾼ 低 ⾼ (Background) ダウンロード 分割か逐次 ⼀括 選択性 ユーザデータ サーバ ローカル ハイブリッド
オートセーブ機能 コンシューマライクの第⼀歩
オートセーブのゴール • プレイヤーの没⼊感を邪魔しない • ネットワーク環境に依存しない • いつ中断しても途中からやり直せる • 割り込みの多いスマフォでも納得感のある挙動を
• ゲームプレイ中、左上に「Auto Saving…」と 表⽰されるタイミングがある • アプリをkillしても、最後に表⽰されたタイミン グの状態でゲームが復帰する 「Auto Saving…」
None
オートセーブのタイミング • 各種設定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
None
オートセーブまとめ 1.オートセーブ制御 2.キューイングとバックグラウンド通信の組み合わせ
アナザーエデンにおける⾮同期オートセーブを⽤いた 通信待ちストレスのないゲーム体験の実現 http://cedec.cesa.or.jp/2017/session/ENG/s58e0fb2eb6330/ https://www.slideshare.net/greetech/ss-79467627 http://gamebiz.jp/?p=192603
None
膨⼤なイベントスクリプトから 創られたRPG体験
None
イベントスクリプト 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のキモ • サーバ • クライアントから完了報告が来るまでは、処理が終わっていな いものとみなす • 終わったときちんと⾔ってくるまで、何度も命令を送りなおす • クライアント側
• 処理完了をかならず差分と⼀緒に保存する • ⼆回実⾏するのを防ぐ • ⼆回実⾏してもいいが、実⾏前の状態に巻き戻してからだ
None
クライアントがデータ作っていることについて
クライアントがデータ作っていることについて •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に全⼒で挑みます!
None