Unity オンライン接続調査

調査1

  - Unity 標準のネットワークライブラリ開発を待つべき?いつ開発が終わるかわからないが
  - MagicOnion
    - .NET 5.0+ / .NET Core 3.1
    - 入門 https://www.slideshare.net/torisoup/magiconion-174973732
    - https://qiita.com/mitchydeath/items/cecf01493d1efeb4ae55
  - OpenAyame https://github.com/OpenAyame/ayame/blob/develop/docs/USE.md
    - Unity公式でWebRTCのパッケージがある
    - goなのでサーバー選定に制約
    - 1ルーム2名とあるが、用途として十分
  - SkyWay https://webrtc.ecl.ntt.com/
    - URLにある通り、NTTのサービス
    - 無料サーバー
      - 接続回数  50万回/月まで
        - 1対戦毎に切断するならこっちがネックになりそう
          - 10分に1回×8時間×土日×4週=384なので、月1300人ぐらい
        - シグナリングサーバーとの接続回数の可能性
          - 接続を維持する実装が必要
            - ロビーからのデュエルは報酬画面後にロビーに戻る
          - 1時間連続して遊ぶ×8回×土日×4週=64なので、月7800人ぐらい
      - サーバ通信量(※)  500GB/月まで
    - TURN がある
    - Android/iOS/JavaScriptはSDKがある
    - Unityについては明言はあるものの実装が分からない
      - ダウンロードにwindows用バイナリがある。
        - 実行後待機状態になる。port 8000 とあるので、これが WebRTC Gateway らしい
          - ということは、Unity とは別に起動しておくプログラムのようだ。よってAndroidはAndroidでSDKを使うし、Windows向けは別途配布が必要
        - 実行ファイルに引数はなく、実行ファイルと同じ並びに設定ファイルを置くことで変更
          - https://github.com/skyway/skyway-webrtc-gateway/blob/master/docs/config.md
        - https://github.com/skyway/skyway-webrtc-gateway/blob/master/samples/util.rb にあるように、/peers にJSONでAPIキー等を渡すと開始
      - 出来そうだが、いずれにしても保留
        - 結果的にAndroid/iOS/Web の相互接続のみ対応するならこれでもいい
  - Azure
    - 料金  https://azure.microsoft.com/ja-jp/free/
      - App Service
      - 他と違って VM は無さそう
    - 上記 MagicOnion を使うなら
      - Unity+MagicOnionのサンプルプログラムをコンテナ化してAzureContainerInstancesで簡単に動かす方法 https://qiita.com/_y_minami/items/aa57873bbb9ea0b36dd2
        - Dockerを含むので冗長
    - 上記 OpenAyame を使うなら
      - VM がないので無料は不可
      - Azure SDK for Go  https://docs.microsoft.com/ja-jp/azure/developer/go/
        - 1.8 以上と互換性、とある
        - バージョン指定はコードの修正が必要かも https://github.com/Azure/azure-sdk-for-go/#versioning
  - AWS
    - 料金 https://aws.amazon.com/jp/free/free-tier/
      - 常に無料、にチェック
        - Amazon EC2 は候補に出てこない
      - 12か月間無料(手続き必要)
        - Amazon EC2 は月ごとに750時間稼働が無料
    - 上記 MagicOnion を使うなら
      - Amazon Linux 2 上に .NET 5 と MagicOnion を使ったゲームサーバー開発環境作ってみた https://dev.classmethod.jp/articles/create-dev-env-for-dotnet-5-and-magiconion-on-amazon-linux-2-ec2/
        - Amazon EC2 を使う
    - 上記 OpenAyame を使うなら
      - AWS SDK for Go  https://aws.amazon.com/jp/sdk-for-go/
        - Amazon Elastic Compute Cloud(Amazon EC2) を使うらしい
        - go は 1.15なので要件を満たす
    - → 結果、無料で続ける事は出来なそう
  - GCP
    https://open-match.dev/site/docs/overview/
Unityが協力しているので親和性はありそう
Openとあるように、他のクラウドでも動かせる可能性
k8s上にセットアップ
https://cloud.google.com/kubernetes-engine/pricing
無料枠は $74 。最初のうちは使い切る事は無さそう
PlayFabと比較すると、Unityプラグインがないようだ https://github.com/googleforgames/open-match/issues/1221
自力実装の部分が多いのはつらい
  - 料金  https://cloud.google.com/free/docs/gcp-free-tier?hl=ja
    - 上記 MagicOnion を使うなら
      - App Engine  https://cloud.google.com/appengine/docs/flexible/dotnet?hl=ja
        - .Net Core 3.1で作る
        - Visual Studio の拡張がある。2019も対応
      - Compute Engine  https://cloud.google.com/compute/docs?hl=ja
        - チュートリアルだと .Net Framework を選ぶ、とある点が気になる。
    - 上記 OpenAyame を使うなら
      - App Engine
        - go の推奨バージョンは1.15となっているが、App Engineは1.12なので見送り
      - Compute Engine
  - PlayFab  https://playfab.com/
    - Azure上のサービス
    - 料金 https://playfab.com/pricing/
      - 開発モードである間は無料。デフォルト
        - 10万ユーザーまで
      - パーティ  https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/networking/
        - チャットとデータ通信とある
        - Free だと「PlayFab Party Connectivity andVoiceの合計最大10,000分が含まれます。」とある
        - Unityプラグイン  https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/networking/party-unity-plugin-quickstart
        - P2Pの記述がある https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/networking/concepts-direct-peer-connectivity
          - Win10およびXBoxのみ
          - 直接接続をしたらカウントされない
          - 接続できなかったら自動的にサーバー経由になる
        - 招待  https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/networking/concepts-invitations-security-model
          - これそのまま使えそう
        - Androidだとマイク許可が必要とある。
          - コード修正で無効化できる
      - マッチメイキング https://docs.microsoft.com/ja-jp/gaming/playfab/features/multiplayer/matchmaking/
        - プレビュー
      - マルチプレイヤーサーバー
        - サーバーサイドの処理が必要な時
        - 最大750時間の無料コンピューティング時間でのホスティング
        - 地域が 米国東部、北ヨーロッパ しかない。
          - 無料の場合の可能性
    - クイックスタート: Unity の PlayFab クライアントライブラリ (C#)  https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart
    - →ユーザーデータ管理だけ使うのもアリでは
  - gamelift  https://aws.amazon.com/jp/gamelift/
    - AWS上のサービス
    - 料金  https://aws.amazon.com/jp/gamelift/pricing/
      - AWS と同じく12か月制限
  - agones  https://agones.dev/site/docs/getting-started/
    - GCP上のサービス
    - Kubernetes を使う
    - 料金は Kubernetes も含め無料範囲内
    - Dockerを使うなら、GCPの単独で十分
    - Unity SDK https://agones.dev/site/docs/guides/client-sdks/unity/
    - →サーバー側を自分で書く場合なら使ってもよさそう
  - Unity プロジェクトに Firebase を追加する  https://firebase.google.com/docs/unity/setup?hl=ja
    - データ永続化だけ任せるなら

調査2

最低要件
知識
基礎  https://medium.com/@shivamrawat_756/guide-to-p2p-over-internet-9f7cf41470bd
libp2p  https://libp2p.io/
WebRTC  https://webrtc.org/
peerjs  https://github.com/peers/peerjs
localturnnel  https://github.com/localtunnel/localtunnel
調査