GREE Tech Conference 2022で発表された資料です。 https://techcon.gree.jp/2022/session/TrackC-4
REALITY株式会社 クライアントエンジニア 三宅広大"人がいるメタバース" を実現するREALITYのワールド機能
View Slide
• 三宅広大/yaegaki• 2020年 REALITY株式会社 入社• Unityエンジニア/テックリード• アバター関連• ビデオ通話• ワールド• etc自己紹介2
REALITYについて3
スマホひとつでアバター作成、ライブ配信による交流やゲームまで楽しめるメタバースREALITYについて4 アバター ライブ配信 コミュニケーション ゲーム ワールド
REALITYについて5
REALITYについて6
スマホひとつでアバター作成、ライブ配信による交流やゲームまで楽しめるメタバースREALITYについて7 アバター ライブ配信 コミュニケーション ゲーム ワールド
ワールドについて8
9 ワールドの概要
ワールドの概要10
ワールドの機能(特徴) まとめ● REALITYアバターで最大8人で遊べる仮想空間● 座る機能● アイテム装着● 動画配信視聴● etc11
ワールドの機能(特徴) まとめ● REALITYアバターで最大8人で遊べる仮想空間● 座る機能● アイテム装着● 動画配信視聴● etc12
ワールドの機能(特徴) まとめ● REALITYアバターで最大8人で遊べる仮想空間● 座る機能● アイテム装着● 動画配信視聴● etc13
動画配信視聴● ワールド内に設置したスクリーンで動画を再生する機能● HLS(HTTP Live Streaming)を用いたライブストリーミング視聴にも対応○ ワールドにいる人と一緒に視聴できる● タイムテーブルを用いた動画再生機能○ ライブストリーミングと静的なファイルによるCMを切り替え可能14
動画配信視聴15
動画配信視聴16 ここがスクリーンになっていて映像が流れる
ワールドの機能(特徴) まとめ● REALITYアバターで最大8人で遊べる仮想空間● 座る機能● アイテム装着● 動画配信視聴● etc17
その他機能● テーマ機能○ 同じワールドで見た目が変わる● アニメーション同期機能○ オブジェクトのアニメーション再生時間を同期する● オブジェクト状態同期機能○ オブジェクトの任意のデータを同期する● SE再生機能○ 特定のタイミングでSEを再生する機能18
”人がいるメタバース”としてのワールド● 配信とシームレスに繋がっている○ 誰かと遊びたかったら配信を開けば”人”がいる● トライアルでは延べ来場者数が400万人*を超える○ ”箱”をつくっても”人”がいないを解決● 世界中のREALITYユーザーに展開が可能● さまざまな種類のワールドをリリース19 *:2022年4月22日~2022年6月12日 自社調べ
桜ワールドこれまでにリリースしたワールド20
ミュージックフェスワールドこれまでにリリースしたワールド21
4周年記念ワールドこれまでにリリースしたワールド22
これまでにリリースしたワールド23
コラボワールドこれまでにリリースしたワールド● 他社様とのコラボワールドを複数リリース24
ワールドの実装25
ワールドの登場人物(ロール)● オーナー○ ワールドを起動した配信者● コラボゲスト○ 配信にコラボゲストとして参加しているユーザー● ビジター○ 視聴者の内、ワールドに参加しているユーザー○ 早い者勝ちで視聴者がワールド内視聴者になる● 視聴者○ ワールドには参加せず視聴だけしているユーザー26
ワールドの登場人物(ロール)● オーナー● コラボゲスト● ビジター● 視聴者27 ワールド内にアバターが出現して動き回れるユーザー全てをまとめてメンバーと呼ぶ合計で8人まで
ワールドの登場人物(ロール)● オーナー● コラボゲスト● ビジター● 視聴者28 配信を見ているだけのユーザーワールドにアバターが登場せずオーナーと同じ視点になる
ワールドの登場人物(ロール)29 オーナー コラボゲスト ビジター 視聴者
ワールドの登場人物(ロール)30 オーナー コラボゲスト ビジター 視聴者アバターが登場音声通話可能
ワールドの登場人物(ロール)31 オーナー コラボゲスト ビジター 視聴者アバターが登場のみ
ワールドの登場人物(ロール)32 オーナー コラボゲスト ビジター 視聴者自分のアバターが登場しないオーナーと同じ視点
ネットワークミドルウェア● 外部ミドルウェアは使用せず独自実装● WebSocketを用いたリアルタイム通信● サーバー側はパケットのリレーとステートの保存を行う○ ワールドのロジックを持たない33
ワールドのメッセージング● ワールドでの出来事を全ユーザーに共有する方法○ ステート更新パターン○ ブロードキャストパターン34
ワールドのメッセージング● ステート更新パターン● ブロードキャストパターン35
ステート更新パターンワールドのメッセージング● 視聴者のワールド参加の例○ 初めは全てのクライアントは同じステートを共有している○ ステートには参加しているメンバーの情報が保存されている36 オーナーステート:A視聴者ステート:AMultiGameServerステート:Aメンバーステート:A
ステート更新パターンワールドのメッセージング● オーナーにワールド参加を要求する37 オーナーステート:A視聴者ステート:AMultiGameServerステート:Aメンバーステート:A
ステート更新パターンワールドのメッセージング● 要求が正しければメンバーリストを更新する38 オーナーステート:B視聴者ステート:AMultiGameServerステート:Aメンバーステート:A
ステート更新パターンワールドのメッセージング● オーナーがサーバーにステートを登録する39 オーナーステート:B視聴者ステート:AMultiGameServerステート:Bメンバーステート:A
ステート更新パターンワールドのメッセージング● サーバーがオーナー以外にステートを送信する40 オーナーステート:B視聴者ステート:BMultiGameServerステート:Bメンバーステート:B
ステート更新パターンワールドのメッセージング● ステートの情報を用いて更新する○ 視聴者が無事メンバーになる41 オーナーステート:Bメンバーステート:BMultiGameServerステート:Bメンバーステート:B
ステート更新パターンワールドのメッセージング● オーナーのアプリが落ちた場合○ メモリ上のステートが失われる42 オーナーステート:Xメンバーステート:BMultiGameServerステート:Bメンバーステート:B
ステート更新パターンワールドのメッセージング● オーナーのアプリが落ちた場合○ メモリ上のステートが失われる43 オーナーステート:Xメンバーステート:BMultiGameServerステート:Bメンバーステート:Bメンバーリスト消失の危機
ステート更新パターンワールドのメッセージング● オーナーのアプリが落ちた場合○ 再接続時にサーバーからステートが送信される44 オーナーステート:Bメンバーステート:BMultiGameServerステート:Bメンバーステート:B
ステート更新パターンワールドのメッセージング● オーナーのアプリが落ちた場合○ サーバーに再接続時にサーバーからステートが送信される45 オーナーステート:Bメンバーステート:BMultiGameServerステート:Bメンバーステート:Bメンバーリスト消失の危機回避
ステート更新パターンワールドのメッセージング● メリット○ 全てのメンバーが同じ状態を共有できる■ 競合状態にならない○ オーナーのアプリが落ちても情報が失われない● デメリット○ オーナーが処理を行うのでレスポンスが悪い○ オーナーがいないと処理されない46
ワールドのメッセージング● ステート更新パターン● ブロードキャストパターン47
ブロードキャストパターンワールドのメッセージング● アイテム装着の例○ メンバーBがアイテムを装着する場合48 オーナー メンバーBMultiGameServerメンバーA
ブロードキャストパターンワールドのメッセージング● メンバーBが装着情報をブロードキャストする49 オーナー メンバーBMultiGameServerメンバーAアイテムAを装着
ブロードキャストパターンワールドのメッセージング● 装着情報を受け取ったメンバーは情報を更新する50 オーナー メンバーBMultiGameServerメンバーAメンバーBはアイテムA装着している
ブロードキャストパターンワールドのメッセージング● 新しく視聴者が増えた場合51 オーナー メンバーBMultiGameServerメンバーAメンバーBはアイテムA装着している視聴者C
ブロードキャストパターンワールドのメッセージング● 新しく視聴者が増えた場合52 オーナー メンバーBMultiGameServerメンバーAメンバーBはアイテムA装着している視聴者CメンバーBはなにも装着していない
ブロードキャストパターンワールドのメッセージング● 新しく視聴者が増えた場合53 オーナー メンバーBMultiGameServerメンバーAメンバーBはアイテムA装着している視聴者CメンバーBはなにも装着していないデータ不整合
ブロードキャストパターンワールドのメッセージング● 定期的に情報を再送信する54 オーナー メンバーBMultiGameServerメンバーA視聴者CアイテムAを装着
ブロードキャストパターンワールドのメッセージング● 装着情報を受け取ったメンバーは情報を更新する55 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはアイテムA装着している
ブロードキャストパターンワールドのメッセージング● 装着情報を受け取ったメンバーは情報を更新する56 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはアイテムA装着しているデータ不整合解消
ブロードキャストパターンワールドのメッセージング● メンバーBのアプリが落ちた場合57 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはアイテムA装着している
ブロードキャストパターンワールドのメッセージング● メンバーBのアプリが落ちた場合58 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはアイテムA装着しているメンバーBはなにも装着していない
ブロードキャストパターンワールドのメッセージング● メンバーBのアプリが落ちた場合59 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはアイテムA装着しているメンバーBはなにも装着していないデータ不整合?
ブロードキャストパターンワールドのメッセージング● 定期的に情報を再送信する60 オーナー メンバーBMultiGameServerメンバーA視聴者C装着なし
ブロードキャストパターンワールドのメッセージング● 装着情報を受け取ったメンバーは情報を更新する61 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはなにも装着していない
ブロードキャストパターンワールドのメッセージング● 定期的に情報を再送信する62 オーナー メンバーBMultiGameServerメンバーA視聴者CメンバーBはアイテムA装着している(情報は失われるが)データ不整合解消
ブロードキャストパターンワールドのメッセージング● メリット○ オーナーを経由しないのでレスポンスが早い○ オーナーがいなくても情報を更新できる● デメリット○ データを定期的に送信する必要がある○ アプリが落ちると情報が失われる63
位置同期● ブロードキャストパターン○ オーナーが状態を管理しない● 定期的に現在の位置、入力の情報をブロードキャストする○ 変更がなければ送らない○ 現在は100ms毎に送信する設定● データが2つ溜まった時点で位置を予測する○ 他のユーザーからは少し遅れて見える64
メッセージのシリアライズ/デシリアライズ● シリアライズ/デシリアライズにはProtocol buffersを使用○ Googleが開発○ IDLで構造を定義してコードの自動生成ができる○ バイナリ形式で出力できる65
メッセージのシリアライズ/デシリアライズ66 message WorldAvatarSyncData{int32 timestamp = 1;Habanero.ProtobufVector3 position = 2;Habanero.ProtobufVector3 rotationEuler = 3;Habanero.ProtobufVector2 velocity = 4;int32 motionState = 5;bool startEntryMotion = 6;bool startExitMotion = 7;}サンプル
Protocol buffersのメリットデメリットメッセージのシリアライズ/デシリアライズ● メリット○ テキスト形式のJSONよりサイズが小さくなる○ 互換性を保ったまま拡張できる○ Dictionary(Map)が使える● デメリット○ 定義が面倒○ ヒューマンリーダブルではない67
Protocol buffersのメリットデメリットメッセージのシリアライズ/デシリアライズ● メリット○ テキスト形式のJSONよりサイズが小さくなる○ 互換性を保ったまま拡張できる○ Dictionary(Map)が使える● デメリット○ 定義が面倒○ ヒューマンリーダブルではない68 キー名などの情報がない値がバイナリ
Protocol buffersのメリットデメリットメッセージのシリアライズ/デシリアライズ● メリット○ テキスト形式のJSONよりサイズが小さくなる○ 互換性を保ったまま拡張できる○ Dictionary(Map)が使える● デメリット○ 定義が面倒○ ヒューマンリーダブルではない69 重要なので後述
Protocol buffersのメリットデメリットメッセージのシリアライズ/デシリアライズ● メリット○ テキスト形式のJSONよりサイズが小さくなる○ 互換性を保ったまま拡張できる○ Dictionary(Map)が使える● デメリット○ 定義が面倒○ ヒューマンリーダブルではない70 Unity標準のJSONシリアライザでは使えない
Protocol buffersのメリットデメリットメッセージのシリアライズ/デシリアライズ● メリット○ テキスト形式のJSONよりサイズが小さくなる○ 互換性を保ったまま拡張できる○ Dictionary(Map)が使える● デメリット○ 定義が面倒○ ヒューマンリーダブルではない71 IDLを書いてコード生成しないといけないので少し手間開発初期はJSONを使う、生成のフロー整備でましになる
Protocol buffersのメリットデメリットメッセージのシリアライズ/デシリアライズ● メリット○ テキスト形式のJSONよりサイズが小さくなる○ 互換性を保ったまま拡張できる○ Dictionary(Map)が使える● デメリット○ 定義が面倒○ ヒューマンリーダブルではない72 データがテキストではないのでどんな値か分かりにくい
互換性の話メッセージのシリアライズ/デシリアライズ● 配信者と視聴者で別のバージョンのアプリを使用している可能性がある○ 古いバージョンと新しいバージョンの組み合わせでも動作する必要がある73 配信者バージョン: 1.1視聴者バージョン: 1.0MultiGameServer
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる● fieldの追加ができる74
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる● fieldの追加ができる75
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる76 message SampleMessage {int32 hoga = 1;}{"hoga": 999}Protobuf JSON
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる77 message SampleMessage {int32 hoga = 1;}{"hoga": 999}Protobuf JSONhogeにしたいのにhogaにしてしまった!
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる78 message SampleMessage {int32 hoge = 1;}{"hoga": 999}Protobuf JSONデータにはフィールド名が含まれず、フィールド番号のみ含まれるので変更が可能
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる79 message SampleMessage {int32 hoge = 1;}{"hoga": 999}Protobuf JSONフィールド名がデータに含まれるので変更すると古いバージョンのアプリで読み込めなくなる
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● field名の変更ができる● fieldの追加ができる80
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● fieldの追加ができる81 message SampleMessage {int32 hoga = 1;}Protobuf
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● fieldの追加ができる82 message SampleMessage {int32 hoga = 1;int32 fuga = 2;}Protobuffieldを追加できる古いバージョンのアプリでは無視される
Protocol buffersの互換性メッセージのシリアライズ/デシリアライズ● fieldの追加ができる83 message SampleMessage {int32 hoga = 1;int32 fuga = 2;}Protobuf独自バイナリフォーマットを採用するとこれができない可能性がある
新規ワールドの開発84
新規ワールドの開発● 既存機能のみを使用する場合はアセットの更新のみで新規ワールドを作成可能○ アプリのアップデートなしで新規ワールドをリリース可能○ アセット側でワールドの細かい挙動を制御できるようになっている● アセットで制御できる例○ アバターの出現位置○ ギフトの出現位置○ 装着アイテムの制御情報○ etc85
アバターの出現位置新規ワールドの開発86
アバターの出現位置新規ワールドの開発87 ワールド起動時にこの付近にアバターが出現
ギフトの出現位置新規ワールドの開発88
ギフトの出現位置新規ワールドの開発89 机の上に視聴者から送られたギフトが出現
装着アイテムの装着情報新規ワールドの開発90
プロップの装着情報新規ワールドの開発91 デバッグ情報
プロップの装着情報新規ワールドの開発92 装着情報● アニメーションあり/なし● どこに装着するか● アイコン
新規機能の開発● 既存の機能で実現不可能な場合は新規機能を実装する● 4周年記念ワールドで新規実装した機能○ ワールド内視聴者登場機能○ 座る機能○ 動画配信視聴機能○ アニメーション同期機能○ etc93
新規機能の開発● 新規機能を実装する際は互換性を注意する○ 新規ワールドをリリースした時に古いアプリで既存のワールドが遊べなくなることは避ける94
新規機能の開発● 新規機能を実装する際は互換性を注意する95
新規機能の開発● 新規機能を実装する際は互換性を注意する96 既存ワールド新アプリのリリース後でも古いアプリでも遊べる
新規機能の開発● 新規機能を実装する際は互換性を注意する97 新規機能を実装したワールド新しいアプリでしか遊べない
新規機能の開発● 古いアプリで新規機能を使用するワールドを起動する場合○ バージョンガード機能で起動を防ぐ■ Webから最低起動バージョンを指定することができる98
新規機能の開発● バージョンガードTips○ アプリリリース後すぐはアップデートしてない人がいる■ 基本的にREALITYは月曜にアプリリリース、水曜にワールドリリース○ 新規機能を必要なワールドをリリースする前に余裕をもって対応バージョンのアプリをリリースしておく99
新規ワールドのリリースフロー100
新規ワールドのリリースフロー● 企画● アセット作成● アセットの配置● ワールドの公開101
新規ワールドのリリースフロー● 企画● アセット作成● アセットの配置● ワールドの公開102
企画● どのようなワールドを作成するか● 作成するワールドのイメージを作成○ 構成や雰囲気がわかるもの103 桜ワールド初期構成案
新規ワールドのリリースフロー● 企画● アセット作成● アセットの配置● ワールドの公開104
アセットの作成● アセットの仮作成● アセットの本作成105
アセットの作成● アセットの仮作成● アセットの本作成106
アセットの仮作成アセットの作成● ワールドのレベルデザインが確認できる状態○ 歩ける状態● 企画とワールドの方針を確認する107
アセットの仮作成アセットの作成108
アセットの作成● アセットの仮作成● アセットの本作成109
アセットの本作成アセットの作成● 本番で使用するアセットを作成する● 完成したアセットは開発用リポジトリにpushする110
アセットの本作成アセットの作成111
新規ワールドのリリースフロー● 企画● アセット作成● アセットの配置● ワールドの公開112
アセットの配置● 完成したアセットをビルドしてAssetBundleにする● ビルドしたAssetBundleの情報をサーバーに登録○ AssetBundleのメタ情報を管理サーバーに登録● ビルドしたAssetBundleをGCSに配置する○ この段階ではまだアプリからアクセスできない113
アセットの配置● Jenkinsで自動化○ iOS/Androidビルド○ サーバーに登録○ GCSに配置114
新規ワールドのリリースフロー● 企画● アセット作成● アセットの配置● ワールドの公開115
ワールドの公開● ワールドの公開設定を行う● AssetBundle公開設定を行う116
ワールドの公開● ワールドの公開設定を行う● AssetBundle公開設定を行う117
ワールドの公開● ワールドの公開設定を行う○ ゲーム一覧に表示されるようにする○ Webから設定する118
ワールドの公開● ワールドの公開設定を行う119
ワールドの公開● ワールドの公開設定を行う● AssetBundle公開設定を行う120
ワールドの公開● AssetBundle公開設定を行う○ アプリからAssetBundleがダウンロードできるようになる○ Webから設定する121
ワールドの公開● AssetBundle公開設定を行う122
まとめ123
まとめ● REALITYがなぜ”人がいるメタバース”なのか○ 配信と融合したワールド○ 全世界の人と遊べる● ワールドの実装方式○ 現状はシンプルな実装○ 今後さらに拡張予定124
お知らせ125
126