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