$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
『アナザーエデン 時空を超える猫』スマートフォンでのRPG体験の実現のためにしてきたこと
Search
gree_tech
PRO
March 30, 2018
Technology
0
430
『アナザーエデン 時空を超える猫』スマートフォンでの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
変わるもの、変わらないもの :OSSアーキテクチャで実現する持続可能なシステム
gree_tech
PRO
0
2.1k
マネジメントに役立つ Google Cloud
gree_tech
PRO
0
25
今この時代に技術とどう向き合うべきか
gree_tech
PRO
3
2.4k
生成AIを開発組織にインストールするために: REALITYにおけるガバナンス・技術・文化へのアプローチ
gree_tech
PRO
0
150
安く・手軽に・現場発 既存資産を生かすSlack×AI検索Botの作り方
gree_tech
PRO
0
140
生成AIを安心して活用するために──「情報セキュリティガイドライン」策定とポイント
gree_tech
PRO
1
1.3k
あうもんと学ぶGenAIOps
gree_tech
PRO
0
260
MVP開発における生成AIの活用と導入事例
gree_tech
PRO
0
290
機械学習・生成AIが拓く事業価値創出の最前線
gree_tech
PRO
0
200
Other Decks in Technology
See All in Technology
AWS Trainium3 をちょっと身近に感じたい
bigmuramura
1
140
多様なデジタルアイデンティティを攻撃からどうやって守るのか / 20251212
ayokura
0
430
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
600
OCI Oracle Database Services新機能アップデート(2025/09-2025/11)
oracle4engineer
PRO
1
110
生成AI時代におけるグローバル戦略思考
taka_aki
0
120
eBPFとwaruiBPF
sat
PRO
4
2.6k
MapKitとオープンデータで実現する地図情報の拡張と可視化
zozotech
PRO
1
130
ガバメントクラウド利用システムのライフサイクルについて
techniczna
0
190
手動から自動へ、そしてその先へ
moritamasami
0
300
Sansanが実践する Platform EngineeringとSREの協創
sansantech
PRO
2
800
世界最速級 memcached 互換サーバー作った
yasukata
0
340
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
350
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Building Flexible Design Systems
yeseniaperezcruz
330
39k
Rails Girls Zürich Keynote
gr2m
95
14k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.6k
Producing Creativity
orderedlist
PRO
348
40k
Music & Morning Musume
bryan
46
7k
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
KATA
mclloyd
PRO
32
15k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.2k
The Invisible Side of Design
smashingmag
302
51k
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