Unity Relay で接続、対戦する実装編

Unity

以前、設定だけしたので。実装してみます。

Unity : sample Boss Room x Photon realtime, Unity Relay を試してみる。
Boss Room : unity samplePhotonとUnity Relayどちらを使えば良いのかな?というところでとりあえず動かしてみます。co-op sample こちらをダウンロードしました。...

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で接続

一人目が接続を作成してキーを取得、二人目がそのキーを利用して接続。
このときキーを渡すのに手動でユーザー同士のやり取りが必要。
そんなイメージですが。

ロビーがあると接続待ちとか管理できそうですが、
自前のサーバーでもキーを渡すのはできるので簡単に渡してみても良いかなと
これに対戦結果、スコアを保存しても良いような気も。

まあとりあえず。

サンプルを見てみる

GitHub - Unity-Technologies/com.unity.services.samples: A collection of working examples of Unity Gaming Services.
A collection of working examples of Unity Gaming Services. - Unity-Technologies/com.unity.services.samples

のLobbyのほうを

git clone https://github.com/Unity-Technologies/com.unity.services.samples.game-lobby.git

して

Lobbyに接続してから Relayに接続しているのでとりあえず

Assets/Scripts以下の Auth / Lobby / Relayにざっと目を通してみたりしてみる。。。

なかなかか理屈は難しくないような気がするのですがなかなかゼロからは面倒そう?
(サンプルというかドキュメントに載っている内容なのでどちらにしても目を通すとよさそ

Lobbyは使わないのでまずは、こちらから^^

Unity logo

NGO ( netcode for gameobjects )を使っていると

これでざらっといけるのかな?まったくわからりませんがいけそうな気がしますね^^

すでにnetocdeで対戦ゲームは作ってあるので(LAN対戦)これをそのまま利用。
この辺を見てください。

Unity Netcode for GameObjects ローカル対戦ゲームを作ってみる!
Netcode for GameObjects を追加自分のプロジェクトに Netcodeを追加2020.3.x の場合Package Manager > + Add packages from git ur...

とりあえず、ドキュメントに沿って

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を利用する

Unity logo

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で行くのかな?と

Unity logo

Initialize the Unity Services SDK

Unity logo

とりあえずネットワーク対戦を選択したら、そのシーンで初期化して、接続してみます。

Unity logo

初期化したら、これでサインインしてみました。そのままで

成功してるっぽいです。

Unity logo

Session Tokenは AccessToken とは別なのかな?別のようですね
接続し直したいときは ClearSessionToken してからと

SignOutもclearsessionにできるようだけどどうかな?playerIDを永続的に使ったりもできるのかどうか

お仕事募集中

2022 – Unity, iOS(swift),などなど リモート対応にて 5500 円 / h からお受けいたしますのでお気軽に以下のフォームよりお問合せください^^

お問い合わせ - Ground Road Technology, LLC

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました