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
94
『アナザーエデン 時空を超える猫』スマートフォンでの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
kustomizeをいい感じに使う方法
gree_tech
PRO
3
970
スケーラビリティとコスト管理 Google Cloud Spanner 費用最適化の取り組み
gree_tech
PRO
0
520
「アナザーエデン 時空を超える猫」の5年前のログを引っ越してデータドリブンで事業運用プロセスを改善した話
gree_tech
PRO
0
360
Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築
gree_tech
PRO
0
810
全社総会における「REALITY Spaces」の活用と、Addressableを用いたコンテンツ配信技術について
gree_tech
PRO
0
470
AWSのEKS環境でログ機能を構築/リリースしたお話
gree_tech
PRO
0
360
「ヘブンバーンズレッド」の大規模アップデートにおける国内及び翻訳QAの取り組み
gree_tech
PRO
0
440
アプリ「REALITY」の12言語対応プロセスの仕組みと品質向上の取り組み
gree_tech
PRO
0
680
REALITYアプリのメンテナンスなしでの機能リリースを実現する、Istio導入とB/Gデプロイ実現の取り組み
gree_tech
PRO
0
550
Other Decks in Technology
See All in Technology
LayerXにおけるLLMプロダクト開発の今までとこれから
layerx
PRO
4
940
Building a RAG-poweredAI chat appwith Python and VS Code
pamelafox
0
170
AWSやJAWS-UGとの出会いを振り返る
yoyoyopg
1
160
AWSに詳しくない人でも始められるコスト最適化ガイド
yuhta28
2
410
高専で制御を、大学でセンシングを学び、次は脳みそ
satoshirobatofujimoto
0
120
競技としてのKaggle、役に立つKaggle
yu4u
7
2.5k
「知的単純作業」を自動化する、地に足の着いた大規模言語モデル (LLM) の活用
nrryuya
1
860
Gradle Build Scanを使ってビルドのことを知ろう potatotips #87
tomorrowkey
2
160
Max out Local LLM in Challenging Environments
sashimimochi
2
200
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2.1k
同じ様なUIをiOS/Android間で合わせるヒントNo.2
fumiyasac0921
1
110
How to Lead? Testimonial of a Lead Android Engineer
oleur
1
120
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Optimizing for Happiness
mojombo
370
69k
Principles of Awesome APIs and How to Build Them.
keavy
121
16k
Documentation Writing (for coders)
carmenintech
60
4k
Intergalactic Javascript Robots from Outer Space
tanoku
266
26k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
228
16k
The Straight Up "How To Draw Better" Workshop
denniskardys
228
130k
KATA
mclloyd
16
12k
Six Lessons from altMBA
skipperchong
22
3k
Making the Leap to Tech Lead
cromwellryan
125
8.5k
Writing Fast Ruby
sferik
622
60k
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