AWS for Unity Developers
下田 純也 エンジニアリングマネージャー
Fan Liang ソリューションアーキテクト
Amazon Web Service Japan K.K.
Agenda
3
Development On Cloud With Unity & AWS
DevOnCloud概要
DevOnCloud検証
Game Development with Unity & AWS
ゲームにおけるAWSとUnityの活用例
AWSとUnityを活用しマルチプレイヤーゲームの作り方
AWSとUnityと連携する際のTips
自己紹介
4
シモダジュンヤ (Jun Shimoda) twitter @junyash
アマゾンウェブサービスジャパン株式会社
Amazon Game Services & Studios
Japan Engineering Manager
好きなAWSサービス:Amazon EC2
好きなUnity機能:C#が使える事!
(実はC# 1.0からのC#使い、使えるとは言っていない)
自己紹介
5
Fan Liang(ハン リャン)
ソリューションアーキテクト
ゲームのお客様を担当
好きな AWS サービス:Amazon GameLift
好きな Unity機能:Addressable Asset System
Development On Cloud With
Unity & AWS
6
開発環境の課題
7
• プロジェクトの規模の拡大
• 複雑でメンテナンスも大変になる
• 規模拡大に伴う複数拠点化や外部との連携へのニーズ
大規模化するプロジェクト
• プロジェクトの大規模化によるコードのビルドやアセットのビルド時間増大と労力増
• プロジェクト毎に1つしかないパイプライン
ビルドパイプラインに費やされる時間と労力
• 品質を高めるためのテストの時間が増大している
• テストの人員を増やすにも限界がある
テストの手間の増大
開発環境のAWS移行の目標
• 開発中のビルドにかかる時間やテストにかかる手間をコンピューテ
ィングリソースのスケール・並列化削減
• 開発者はクリエイティブな活動に集中でき、作品の質を高める事に
注力可能となる
開発者の時間はクリエイティブな仕事に注力
• ビルや開発機器への設備投資を抑えつつ
• 開発拠点の拡大やグローバル展開が可能となる
設備投資を抑えつつ、拠点拡大、グローバル展開
クラウド化のメリット・AWS化のメリット
Cloud
・俊敏性
・スケーラビリティ
・可用性
(物理的なトラブルや
メンテナンスからの開放)
AWS Step Functions:
• AWS CodePipeline:
フルマネージド CI/CD
• AWS CloudFormation:
容易にパイプラインをコピー
• Amazon EC2:
Spot Instance/GPU instance
• AWS Device Farm:
デバイステスト (iOS/Android)
• Amazon WorkSpaces:
セキュアなVDI
AWS Device Farm
Pipelineを自由に組み合わせて呼び出せる柔軟性
• 各パイプラインをCloudFormationでのテンプレート化や、CodePipeline等から自由に組
み合わせて呼び出したり、複数並列で起動したりできる.
• これまでのオンプレのパイプラインだと、プロジェクト毎に1つ、かつドキュメント化されてい
なかったり…これをシンプルにし並列でビルドさせたりもろもろできるようになる。
Unityのクラウド利用に関するライセンス変更
11
https://blogs.unity3d.com/jp/2019/01/16/updated-terms-of-service-and-commitment-to-being-an-open-platform/
VPN
Direct
Connect
Office
ビルドマシン
(Mac)
AWS Cloud
VPC
S3
CI サーバ
ビルド時のみ EC2 を起動する事でコストを最適化
Androidビルド
アセットバンドルビルド
コー
ド/
ア
セ
ット取
得
成果物
転送
ビルドサーバ
GHE/Perforce
Unity ビルドon EC2
1台で10時間
10時間のビルド
1時間の
ビルド
+9時間の開発時間
$1.58 x 10台 x 1時間 = $15.8
$1.58 x 1台 x 10時間 = $15.8
=
g3.4xlarge
10台で1時間
g3.4xlarge
ビルドを加速ためのScale UpとScale Out
ビルドタスクの並列化
c5.xlarge
• vCPU 4個
• メモリ 8GiB
c5.24xlarge
• vCPU 96個
• メモリ 375GiB
高性能サーバ使用
Unity ビルドon EC2 Scale Up検証
検証内容:
1.クラウドでビルドできるか?
2.ハイスペックのインスタンスを利用して、ビルドは早
くなるかどうか?
計測方法:
アセットバンドル、ゲーム本体をそれぞれ2回ビルドし、
平均時間を計測する。
Unity ビルドon EC2 Scale Up検証
Unityの検証サンプルプロジェクト:
• バージョン:Unity 2018.4.6
• アセット数:約4000件(画像、ビデオ、音声)
• Cs ファイル数:約2000件(プラグインも含めて)
AWSの検証環境: windows server 2018
• c5.xlarge: vCPU 4個 / メモリ 8GiB
• c5.4xlarge: vCPU 16個 / メモリ 32GiB c5.xlargeの約4倍
• c5.12xlarge: vCPU 48個 / メモリ 96GiB c5.xlargeの約12倍
アセットのビルド時間(windows)
757 738 732
0
200
400
600
800
1000
c5.xlarge c5.4xlarge c5.12xlarge
ビルド時間(秒)
秒数
アセットバンドルビルド考察
17
マルチスレッドはサポートしていないため、コア数やメ
モリが増やしても、アセットバンドルビルド自体は早くな
りません(2019/9/25時点)
分散ビルドを検討する必要があります
ゲーム本体のビルド時間(windows)
832
287
206
92 42 36
0
200
400
600
800
1000
c5.xlarge c5.4xlarge c5.12xlarge
ビルド時間(秒)
IL2CPP Mono
IL2CPPビルド時間の考察(windows)
19
インスタンスの性能を上げると、ビルド時間が減少する
効果は線形ではないるので、利用する際に一番コストパ
フォーマンス良いインスタンスを探す必要がある
20
C++ Compilerはマルチコアを利用することによって、
本体のビルドを高速化できた
IL2CPPビルド時間の考察(windows)
プラットフォームごとに並列化(IOS/Android)
アセットの依存関係を注意しながら並列化
Cygames/ DeNAの資料をご参考していただければ
21
Unity ビルドon EC2 Scale Out注意点
https://www.slideshare.net/dena_tech/build-87960933
https://speakerdeck.com/cygames/yun-ying-zhong-kontentuniokeruda-xing-atupudetocheng-
gong-falsetamefalsekao-efang-tounityzui-shi-hua-shou-fa?slide=67
Game Development with
Unity & AWS
22
ゲームにおける
AWSとUnityの活用例
23
ゲームにおけるAWSとUnityの活用例
24
APIサーバとしてゲームバックエンドでの利用
SDKを活用し、サーバなしで簡単な機能を実装する
ゲームサーバとしてマルチプレイヤーゲームでの利用
ゲームにおけるAWSとUnityの活用例
25
APIサーバとしてゲームバックエンドでの利用
SDKを活用し、サーバなしで簡単な機能を実装する
ゲームサーバとしてマルチプレイヤーゲームでの利用
AZ AZ
CloudFront
S3
ALB
API(EC2/ECS)
ElastiCache
RDS(master)
VPC
API(EC2/ECS)
ElastiCache
RDS(slave)
APIサーバとしてゲームバックエンドン構成
ロードバランサー
APIサーバ
キャッシュ
データベース
アセットバンドル配信
ゲームにおけるAWSとUnityの活用事例
27
DELiGHTWORKS様(開発・運営)過去のセッション
「Fate/Grand Orderにおける、ディライトワークス流Unity活
用術」 Unite2016
「Fate/Grand Orderにおける大規模なデータベース移行と負荷
試験」 AWSSummit 2019
『Fate/Grand Order』
1700万ダウンロードを突破した
ヒットゲームにおけるAWSとUnity活用
©TYPE-MOON / FGO PROJECT
ゲームにおけるAWSとUnityの活用例
28
APIサーバとしてゲームバックエンドでの利用
SDKを活用し、サーバなしで簡単な機能を実装する
ゲームサーバとしてマルチプレイヤーゲームでの利用
UnityからAWSを利用する方法例
29
165個以上のAWSサービスに対し、SDKを利用
して、簡単にAPIレベルで活用するができる
ゲーム内で写真をS3に簡単アップロード
Amazon Pollyを利用して音声合成
…
AWSとUnityの組み合わせ
30
ゲーム内で写真が撮影されると、サーバに画像が送られ、サー
バ上でサムネイル画像の作成の加工が行われます。
AWS Cloud
Amazon S3 AWS Lambda
ゲームにおけるAWSとUnityの活用
31
APIサーバとしてゲームバックエンドでの利用
SDKを活用し、サーバなしで簡単な機能を実装する
ゲームサーバとしてマルチプレイヤーゲームでの利用
API
サーバ
• 新規登録/ログイン
• 認証認可, セッション管理
• ロビー/イベント
• ステータス /リーダーボード
• ゲームモード, オプション
• マッチング
• ゲーム終了, チート対策
ゲーム
サーバ
• ゲームマップホスト
• セッション管理
• ゲームプレイ、マップ更新
• データ同期
• ユーザ機能; チート対策
• ゲーム終了レポート
典型的なマルチプレイヤーのゲームフロー
マルチプレイヤーオンラインゲームの実装
33
マルチプレイヤーのゲームサーバ
実装は?
マッチメイキングはどうする?
ステージ
AWSサービス
ステージ
ステージ
Amazon GameLift
34
セッションベースのマルチプレイヤーゲーム専用のゲ
ームサーバをデプロイ、運用、スケーリングするための
マネージドサービスです
マルチプレイヤーオンラインゲームの実装
35
GameLiftでマネージド
のマッチメイキングとサ
ーバ管理を利用
ステージ
AWSサービス
ステージ
ステージ
Amazon GameLift
Amazon GameLift
36
手間のかかる作業は完了済
ソフトウェアをビルドするための
エンジニア作業+GameLiftによ
る信頼性の高い運用
低レイテンシの実現
16のAWSリージョンの中でプレ
イヤーにとって最も近いゲーム
サーバにセッションを割り当て
キャパシティプランニングな
しでローコスト&ハイスケール
ユーザが必要なキャパシティを自
動でスケールアップ・ダウン、実際
に利用した分だけお支払い
FlexMatchのカスタムマッ
チメイクで高機能なゲーム
プレイを実現
レイテンシのバランス、Wait時間、
対戦レベルに適した独自のマッ
チメイキングロジックを実装
Unity上でのGameLift実装パターン
Amazon GameLift
Server SDK for Unity
カスタム
ゲームサーバ
リアルタイム
サーバ
接続
Amazon
GameLift
Amazon
GameLift
Amazon GameLift
Realtime Client SDK
クライアント
クライアント
ゲームサーバ
ゲームサーバ
ゲームサーバ
14
Unity上でのGameLift実装パターン
Amazon GameLift
Server SDK for Unity
カスタム
ゲームサーバ
リアルタイム
サーバ
接続
Amazon
GameLift
Amazon
GameLift
Amazon GameLift
Realtime Client SDK
クライアント
クライアント
ゲームサーバ
ゲームサーバ
ゲームサーバ 14
Node.jsベースのゲームサーバ
Javascriptを使ってゲームサーバの振る舞いを定義
ステートフル or ステートレス
TCP/UDP対応
1プレイヤーにつき1ヶ月あたり数円のコスト
Amazon GameLift
Realtime Servers
GameLift Realtime Server
Unity with GameLift Realtime
40
• プレイヤー間で少量の
データを交換
• 複雑度が低い処理
Role
Playing
Card
Games
Mobile
Match 3
Turn
based
strategy
Real time
strategy
C#をサポート
クライアントコール
は同期アクションと
非同期コールバック
をサポート
41
Game client integration
参考ユースケース
簡単なゲームサーバロジック
プレイヤーの確認
チート検出
ペアメッセージング
スクリプトのハンドリング
サーバの初期化時
プレイヤー受け入れ時
プレイヤーの接続/切断時 42
Realtime Scripts
依存するライブラリを含めたス
クリプトをzipでかためてパッ
ケージング
AWSコンソールにアップロード
もしくはS3バケットを指定
43
Realtime Scripts
AWSとUnityを活用し
マルチプレイヤーゲームの作り方
44
45
ゲームの設計
対戦機能のあるテトリス
を作成したい
相手に邪魔ブロックを
投げることができる
46
Demo
サーバの準備とSDKの導入
ロビーの部分実装
部屋の作成/加入/検索
ゲームの部分実装
ゲーム準備OK/ゲーム開始
盤面の情報を共有
1行削除したら、相手にランダムブロック47
マルチプレイ対戦機能を実装するために
サーバの準備とSDKの導入
ロビーの部分実装
部屋の作成/加入/検索
ゲームの部分実装
ゲーム準備OK/ゲーム開始
盤面の情報を共有
1行削除したら、相手にランダムブロック48
マルチプレイに改装するため
GameLift Realtime Server Setup
49
Server scriptsを
GameLiftにアップロード
する
サーバの数とスペック
を決めて、起動する
その他サーバの設定
Unity側の準備
50
公式サイトからAWS .NET SDKとGamelift Realtime Client
SDK2つをダウンロードする
パッケージをビルド、/Pluginsに追加する
Unity2018.1.x と.Net4.5以上の必要がある
サーバの準備とSDKの導入
ロビーの部分実装
部屋の作成/加入/検索
ゲームの部分実装
ゲーム準備OK/ゲーム開始
盤面の情報を共有
1行削除したら、相手にランダムブロック51
マルチプレイに改装するため
52
部屋の作成/加入/検索
部屋の作成
53
部屋作成の裏どのように動いている
54
部屋の加入
55
部屋加入の裏どのように動いている
56
部屋の検索
57
サーバの準備とSDKの導入
ロビーの部分実装
部屋の作成/加入/検索
ゲームの部分実装
ゲーム準備OK/ゲーム開始
盤面の情報を共有
1行削除したら、相手にランダムブロック58
マルチプレイに改装するため
59
ゲーム準備OK/ゲーム開始
コネクションを作る
クライアントからOKを送信
サーバからゲーム開始をクライエントに送る
クライエントから受信し、関連動作を行う
60
ゲーム準備OK/ゲーム開始のプロセス
TCPとUDP両方通信可能
61
コネクションを作成
クライアント Realtime Server 他のセッションの管理
RTMessage
通信
GameLift Service
RTMessageの構造(Protobufを利用して送信)
opcode
payload:
targetGroup
targetPlayer
deliveryIntent TCP/UDP)
62
RTMessageの構造
63
サンプルテトリスのopcode定義
64
クライエントからOKを送信
クライアント
ゲームサーバ
65
サーバからゲーム開始をクライエントに送る
クライアント
ゲームサーバ
66
サーバからデータ受信
一部APIはMainThreadで動かす必要があります
サーバの準備とSDKの導入
ロビーの部分実装
部屋の作成/加入/検索
ゲームの部分実装
ゲーム準備OK/ゲーム開始
盤面の情報を共有
1行削除したら、相手にランダムブロック67
マルチプレイに改装するため
68
LogicとViewを分離する
疎接合なモジュール設計、仕様変更でも柔軟に対応できる
マルチプレイ改造するための工数を最小化
違うフレームレイトで情報同期することが可能
盤面情報キャプチャ
Viewerにセット
69
LogicとViewを分離する
GridManager.cs:テトリス盤面の情報を記録する
70
LogicとViewを分離する
Viewer.cs:情報された情報を表示する
71
LogicとViewを分離する
送信側
受信側
同じロジックで対応できる
サーバの準備とSDKの導入
ロビーの部分実装
部屋の作成/加入/検索
ゲームの部分実装
ゲーム準備OK/ゲーム開始
盤面の情報を共有
1行削除したら、相手にランダムブロック72
マルチプレイに改装するため
73
サーバロジック追加(相手にランダムブロック)
opCodeごとにロジック追加
定期的に更新する・ロジックをバレたくない
SDKを利用し、数行のコードだけで、セッションとマ
ッチングの管理ができる
通信フレームワークが定義されているので、ゲーム
ロジックを専念できる
わずかなコストで数百万のプレイヤーにスケーリン
グできる
74
UnityでAmazon GameLift利用するメリット
AWSとUnityと連携する際のTips
75
GameLift Realtime Serverはローカルのデバッグができない
ので、一番楽かつ安い選択はスポットインスタンス。c4.large
の場合月当たり約8ドルぐらい。
同時接続設定された場合、ゲームセッションのクローズは
GameLift Server側で管理されないと、リソース開放されない
ため、新規接続できなくなります
76
GameLift 開発経験 環境配置
参考:https://docs.aws.amazon.com/ja_jp/gamelift/latest/developerguide/fleets-multiprocess.html
GameLiftの通信エラーは通常400エラーとして返して、具
体的なエラーはInnerExceptionにある. Unityを利用の場
合、Debug.LogExceptionよりLogErrorのほうが見やすい
77
GameLift 開発経験 クライエントログ
FleetIdを指定しない場合:
LogError: At least one of fleetId or aliasId must be specified
LogException: The remote server returned an error: (400) Bad Request
78
GameLift 開発経験 サーバログ
セッション終了後、コンソールからダウンロードするこ
とが可能です。直接サーバにSSHでログインして確認
することもできます
基本の通信はTCPですが、メッセージ配信はデフォルトで UDP
に設定されています。
UDPポートを動的に探すことが可能ですが、プラットフォームごと
に探す方法が違います。UDP利用できない場合、フォールバック
として TCP を使用して送信されます。
ネットワークのコールバックはMainThreadではないので、一部
のAPIコールはMainThreadに戻す必要があります。
79
GameLift開発経験 通信
最後に
80
AWS上でゲームの構成相談
Amazon GameLiftの利用相談
マルチプレイゲーム価格試算や見積もり
なんでも相談してください
81
相談ウェルカム
Thank You
82

【Unite Tokyo 2019】AWS for Unity Developers