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
210
『アナザーエデン 時空を超える猫』スマートフォンでの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
REALITY株式会社における開発生産性向上の取り組み: 失敗と成功から学んだこと
gree_tech
PRO
2
130
『ヘブンバーンズレッド』におけるフィールドギミックの裏側
gree_tech
PRO
2
92
セキュリティインシデント対応の体制・運用の試行錯誤 / greetechcon2024-session-a1
gree_tech
PRO
1
100
『アナザーエデン 時空を超える猫』国内海外同時運営実現への道のり ~別々で開発されたアプリを安定して同時リリースするまでの取り組み~
gree_tech
PRO
1
81
『アサルトリリィ Last Bullet』におけるクラウドストリーミング技術を用いたブラウザゲーム化の紹介
gree_tech
PRO
1
93
UnityによるPCアプリの新しい選択肢。「PC版 Google Play Games」への対応について
gree_tech
PRO
1
110
実機ビルドのエラーによる検証ブロッカーを0に!『ヘブンバーンズレッド』のスモークテスト自動化の取り組み
gree_tech
PRO
1
120
"ゲームQA業界の技術向上を目指す! 会社を超えた研究会の取り組み"
gree_tech
PRO
1
140
Jamstack でリニューアルするグリーグループのメディア
gree_tech
PRO
2
300
Other Decks in Technology
See All in Technology
AI前提のサービス運用ってなんだろう?
ryuichi1208
8
1.4k
誰も全体を知らない ~ ロールの垣根を超えて引き上げる開発生産性 / Boosting Development Productivity Across Roles
kakehashi
2
230
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
540
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
390
組織成長を加速させるオンボーディングの取り組み
sudoakiy
2
220
Zennのパフォーマンスモニタリングでやっていること
ryosukeigarashi
0
200
あなたの知らない Function.prototype.toString() の世界
mizdra
PRO
2
280
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
120
マルチモーダル / AI Agent / LLMOps 3つの技術トレンドで理解するLLMの今後の展望
hirosatogamo
37
13k
AWS Media Services 最新サービスアップデート 2024
eijikominami
0
200
DynamoDB でスロットリングが発生したとき/when_throttling_occurs_in_dynamodb_short
emiki
0
270
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
130
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Documentation Writing (for coders)
carmenintech
65
4.4k
Designing for humans not robots
tammielis
250
25k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Making Projects Easy
brettharned
115
5.9k
Become a Pro
speakerdeck
PRO
25
5k
RailsConf 2023
tenderlove
29
900
Producing Creativity
orderedlist
PRO
341
39k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Typedesign – Prime Four
hannesfritz
40
2.4k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Designing for Performance
lara
604
68k
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