以前、設定だけしたので。実装してみます。
Unity Game Servicesからプロジェクト設定
Unity Relayを使うには課金設定が必要ですと。Relay、Lobbyなど使うときは必要なようです。
とりあえず、relayのパッケージをインストール.
Unity Organization – Project Name を設定
Link to Project みたいな指示に従って選択。Unity Gaming Serviceに設定したorganizationとprojectを設定。
Unity Gaming ServiceのRelayを有効化
課金設定しいるので
Relay Onに
Project > Relay > Overview で Relay On を確認
停止するときは、この右上で。
Relayで接続
一人目が接続を作成してキーを取得、二人目がそのキーを利用して接続。
このときキーを渡すのに手動でユーザー同士のやり取りが必要。
そんなイメージですが。
ロビーがあると接続待ちとか管理できそうですが、
自前のサーバーでもキーを渡すのはできるので簡単に渡してみても良いかなと
これに対戦結果、スコアを保存しても良いような気も。
まあとりあえず。
サンプルを見てみる
のLobbyのほうを
git clone https://github.com/Unity-Technologies/com.unity.services.samples.game-lobby.git
して
Lobbyに接続してから Relayに接続しているのでとりあえず
Assets/Scripts以下の Auth / Lobby / Relayにざっと目を通してみたりしてみる。。。
なかなかか理屈は難しくないような気がするのですがなかなかゼロからは面倒そう?
(サンプルというかドキュメントに載っている内容なのでどちらにしても目を通すとよさそ
Lobbyは使わないのでまずは、こちらから^^
NGO ( netcode for gameobjects )を使っていると
これでざらっといけるのかな?まったくわからりませんがいけそうな気がしますね^^
すでにnetocdeで対戦ゲームは作ってあるので(LAN対戦)これをそのまま利用。
この辺を見てください。
とりあえず、ドキュメントに沿って
Import the requirements
パッケージを入れたりはOKなので
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using UnityEngine; using Unity.Services.Core; using Unity.Services.Authentication; using Unity.Services.Relay; using Unity.Services.Relay.Http; using Unity.Services.Relay.Models; using Unity.Netcode; using Unity.Netcode.Transports.UTP; using Unity.Networking.Transport; using Unity.Networking.Transport.Relay; using NetworkEvent = Unity.Networking.Transport.NetworkEvent;
この辺をを使うと。transport utpのところはちょっと気になるところですがとりあえず進めます。
ここは別設定が必要かどうか
Set up the NetworkManager
ローカルではUNetTransportを使っていたので、Unity Transportに変更する。
NetworkManagerオブジェクトにNetworkManager / Unity Transportを追加
Unity Transportは、Protocol Typeを Relay Unity Transportを選択。
NetworkManager の General > Network Transport を Unity Transportに
NetworkWorldManagerは、インターネット接続用のオブジェクトにつけた名前です。
ローカルはNetworkLocalManagerみたいにしてUNet Transportで接続しています。
Set variables and utility functions
NetworkManager(gameobject)に追加するスクリプト(MyNetworkManager.csなど)に追記
const int m_MaxConnections = 4; public string RelayJoinCode;
Authenticate a player
同じなのですが 別のスクリプトに記載してNetworkManagerにつける。
ここは HOST / CLIENT両方同じ。
Host player
Create an allocation and request a join code
そのまま利用。とりあえず
したのUnity Authenticationを利用するという感じで接続してから次のConfgure
サンプルのままでも問題ないはず。
Configure the transport and start NGO
Relay Serverに接続できてるっぽい。指定しないと asia-southeast1が自動的に選択された。
Host が近い regionを選ぶのは良いかも。
(自分のサーバーはとりあえずアジアだけど。joining playerの所在は考慮しないので、join code が配布されたところに接続。遠くても知らない。player idで管理しても良いけど、ユーザーが増えたらかな
NetworkManager.Singleton.GetComponent().SetHostRelayData(ipv4address, port, allocationIdBytes, key, connectionData, true); NetworkManager.Singleton.StartHost();
とりあえずこれでHost接続はOKっぽい。
NGOのほうはStartHostで。StartHost以降の処理は Localと同じものが問題なく動いている模様
Client Player / Joining Player
HOSTの取得した Join Codeを利用して接続する
Join an allocation
Join Codeから接続先を取得している
Configure the transport and start NGO as a joining player
StartClient(); に成功すると接続OKなのでこのままゲーム開始できる。(Localと同じ。)
とりあえず、ステータス管理、タイムアウトとか、と自前サーバーでJoin Code受け渡しを作れば対戦できるはず。
Unity Authenticationを利用する
Host your multiplayer game in a P2P network
Use the Relay with Unity Authentication to identify individuals who are good game server hosts in a P2P environment, to implement peer-to-peer networking using authentication to build, test, and operate your multiplayer game without needing a third-party solution or a dedicated game server.
まあなんとなく。
よくわかっていませんが、、、relayを使うのにsign in Anonymouslyで行くのかな?と
Initialize the Unity Services SDK
とりあえずネットワーク対戦を選択したら、そのシーンで初期化して、接続してみます。
初期化したら、これでサインインしてみました。そのままで
成功してるっぽいです。
Session Tokenは AccessToken とは別なのかな?別のようですね
接続し直したいときは ClearSessionToken してからと
SignOutもclearsessionにできるようだけどどうかな?playerIDを永続的に使ったりもできるのかどうか
お仕事募集中
2022 – Unity, iOS(swift),などなど リモート対応にて 5500 円 / h からお受けいたしますのでお気軽に以下のフォームよりお問合せください^^
コメント