-
유니티 게이밍 서비스 릴레이 마스터하기 / Master Unity Gaming Service Relay UGS유니티 2024. 12. 29. 00:39
유니티 게이밍 서비스 릴레이(UGS Relay)란?
클라이언트 간의 직접적인 연결이 어려운 상황에서 중계 역할을 수행하여 데이터 통신을 가능하게 하는 서버입니다.
서버를 유니티 측의 컴퓨터를 이용하며 유니티의 서버를 사용하기에 월 무료구간 이후 과금제로 운영됩니다.
https://unity.com/kr/products/gaming-services/pricing
에서 가격을 확인할 수 있습니다.
https://docs.unity.com/ugs/ko-kr/manual/relay/manual/introduction
에서 공식문서를 확인할 수 있습니다.
릴레이의 특징으로는
- UGS 다른 서비스와 호환이 좋고 매우 간단하게 이용가능합니다.
- 데디케이티드 서버, 호스트, 클라이언트 접속이 됩니다.
설치
Window - Package Manager - Multiplayer Services를 설치합니다.
구 버전에는 Relay를 따로 설치했으나 인증, 로비, 릴레이 등 UGS를 통합한 멀티 서비스입니다.
Edit - Project Settings... - Services에서 유니티 클라우드와 프로젝트를 연결합니다.
연결이 되었으면 Dashboard를 눌러 유니티 클라우드로 이동합니다.
제품에 Relay를 검색해 실행합니다.
관리 - 서비스 사용량에서 사용량을 알 수 있습니다.
릴레이 매니저 (RalayManager)
간단한 로그인, 호스트, 클라이언트 접속을 합니다.
씬에 빈 게임오브젝트 NetworkManager를 만들고 NetworkManager 컴포넌트를 넣습니다.
Select transport를 Unity Transport로 바꿔줍니다.
그러면 생기는 UnityTransport 컴포넌트의 ProtocolType을 Relay Unity Transport로 바꿉니다.RelayManager.cs
using System; using UnityEngine; using Unity.Services.Authentication; using Unity.Services.Core; using Unity.Services.Relay; using Unity.Services.Relay.Models; using Unity.Netcode; using Unity.Netcode.Transports.UTP; using QuickCmd; public class RelayManager : MonoBehaviour { [Command] public async Awaitable<(bool success, string playerId)> SignIn() { try { await UnityServices.InitializeAsync(); if (!AuthenticationService.Instance.IsSignedIn) { await AuthenticationService.Instance.SignInAnonymouslyAsync(); } return (true, AuthenticationService.Instance.PlayerId); } catch (Exception e) { Debug.Log($"SignIn failed. {e}"); return (false, string.Empty); } } [Command] public async Awaitable<(bool success, string joinCode)> CreateRelay(bool isServer, int maxPlayers) { try { Allocation allocation = await RelayService.Instance.CreateAllocationAsync(maxPlayers); string joinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId); NetworkManager.Singleton.GetComponent<UnityTransport>().SetRelayServerData( allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port, allocation.AllocationIdBytes, allocation.Key, allocation.ConnectionData ); if (isServer) { NetworkManager.Singleton.StartServer(); Debug.Log($"Started Relay Server with {joinCode}"); } else { NetworkManager.Singleton.StartHost(); Debug.Log($"Hosted Relay with {joinCode}"); } return (true, joinCode); } catch (Exception e) { Debug.Log($"CreateRelay failed. {e}"); return (false, string.Empty); } } [Command] public async Awaitable<bool> JoinRelay(string joinCode) { try { JoinAllocation joinAllocation = await RelayService.Instance.JoinAllocationAsync(joinCode); NetworkManager.Singleton.GetComponent<UnityTransport>().SetClientRelayData( joinAllocation.RelayServer.IpV4, (ushort)joinAllocation.RelayServer.Port, joinAllocation.AllocationIdBytes, joinAllocation.Key, joinAllocation.ConnectionData, joinAllocation.HostConnectionData ); NetworkManager.Singleton.StartClient(); Debug.Log($"Joined Relay with {joinCode}"); return true; } catch (Exception e) { Debug.Log($"JoinRelay failed. {e}"); return false; } } }
QuickCommand (https://goranitv.tistory.com/33) 에셋으로 명령어 처리를 할 수 있습니다.
- Awaitable<(bool success, string playerId)> SignIn()
익명 아이디로 로그인합니다. - Awaitable<(bool success, string joinCode)> CreateRelay(bool isServer, int maxPlayers)
isServer가 true면 서버, false면 호스트로써 릴레이에서 실행합니다.
최대 플레이어를 설정합니다.
성공여부와 참여코드를 반환합니다. - Awaitable<bool> JoinRelay(string joinCode)
서버 또는 호스트에서 릴레이로 생성된 참여코드를 넣으면 클라이언트로써 릴레이에서 실행합니다.
'유니티' 카테고리의 다른 글