123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- // edgegap relay transport.
- // reuses KcpTransport with custom KcpServer/Client.
- //#if MIRROR <- commented out because MIRROR isn't defined on first import yet
- using System;
- using System.Text.RegularExpressions;
- using UnityEngine;
- using Mirror;
- using kcp2k;
- namespace Edgegap
- {
- [DisallowMultipleComponent]
- public class EdgegapKcpTransport : KcpTransport
- {
- [Header("Relay")]
- public string relayAddress = "127.0.0.1";
- public ushort relayGameServerPort = 8888;
- public ushort relayGameClientPort = 9999;
- // mtu for kcp transport. respects relay overhead.
- public const int MaxPayload = Kcp.MTU_DEF - Protocol.Overhead;
- [Header("Relay")]
- public bool relayGUI = true;
- public uint userId = 11111111;
- public uint sessionId = 22222222;
- // helper
- internal static String ReParse(String cmd, String pattern, String defaultValue)
- {
- Match match = Regex.Match(cmd, pattern);
- return match.Success ? match.Groups[1].Value : defaultValue;
- }
- protected override void Awake()
- {
- // logging
- // Log.Info should use Debug.Log if enabled, or nothing otherwise
- // (don't want to spam the console on headless servers)
- if (debugLog)
- Log.Info = Debug.Log;
- else
- Log.Info = _ => {};
- Log.Warning = Debug.LogWarning;
- Log.Error = Debug.LogError;
- // create config from serialized settings.
- // with MaxPayload as max size to respect relay overhead.
- config = new KcpConfig(DualMode, RecvBufferSize, SendBufferSize, MaxPayload, NoDelay, Interval, FastResend, false, SendWindowSize, ReceiveWindowSize, Timeout, MaxRetransmit);
- // client (NonAlloc version is not necessary anymore)
- client = new EdgegapKcpClient(
- () => OnClientConnected.Invoke(),
- (message, channel) => OnClientDataReceived.Invoke(message, FromKcpChannel(channel)),
- () => OnClientDisconnected.Invoke(),
- (error, reason) => OnClientError.Invoke(ToTransportError(error), reason),
- config
- );
- // server
- server = new EdgegapKcpServer(
- (connectionId) => OnServerConnected.Invoke(connectionId),
- (connectionId, message, channel) => OnServerDataReceived.Invoke(connectionId, message, FromKcpChannel(channel)),
- (connectionId) => OnServerDisconnected.Invoke(connectionId),
- (connectionId, error, reason) => OnServerError.Invoke(connectionId, ToTransportError(error), reason),
- config);
- if (statisticsLog)
- InvokeRepeating(nameof(OnLogStatistics), 1, 1);
- Debug.Log("EdgegapTransport initialized!");
- }
- protected override void OnValidate()
- {
- // show max message sizes in inspector for convenience.
- // 'config' isn't available in edit mode yet, so use MTU define.
- ReliableMaxMessageSize = KcpPeer.ReliableMaxMessageSize(MaxPayload, ReceiveWindowSize);
- UnreliableMaxMessageSize = KcpPeer.UnreliableMaxMessageSize(MaxPayload);
- }
- // client overwrites to use EdgegapClient instead of KcpClient
- public override void ClientConnect(string address)
- {
- // connect to relay address:port instead of the expected server address
- EdgegapKcpClient client = (EdgegapKcpClient)this.client;
- client.userId = userId;
- client.sessionId = sessionId;
- client.connectionState = ConnectionState.Checking; // reset from last time
- client.Connect(relayAddress, relayGameClientPort);
- }
- public override void ClientConnect(Uri uri)
- {
- if (uri.Scheme != Scheme)
- throw new ArgumentException($"Invalid url {uri}, use {Scheme}://host:port instead", nameof(uri));
- // connect to relay address:port instead of the expected server address
- EdgegapKcpClient client = (EdgegapKcpClient)this.client;
- client.Connect(relayAddress, relayGameClientPort, userId, sessionId);
- }
- // server overwrites to use EdgegapServer instead of KcpServer
- public override void ServerStart()
- {
- // start the server
- EdgegapKcpServer server = (EdgegapKcpServer)this.server;
- server.Start(relayAddress, relayGameServerPort, userId, sessionId);
- }
- void OnGUIRelay()
- {
- // if (server.IsActive()) return;
- GUILayout.BeginArea(new Rect(300, 30, 200, 100));
- GUILayout.BeginHorizontal();
- GUILayout.Label("SessionId:");
- sessionId = Convert.ToUInt32(GUILayout.TextField(sessionId.ToString()));
- GUILayout.EndHorizontal();
- GUILayout.BeginHorizontal();
- GUILayout.Label("UserId:");
- userId = Convert.ToUInt32(GUILayout.TextField(userId.ToString()));
- GUILayout.EndHorizontal();
- if (NetworkServer.active)
- {
- EdgegapKcpServer server = (EdgegapKcpServer)this.server;
- GUILayout.BeginHorizontal();
- GUILayout.Label("State:");
- GUILayout.Label(server.state.ToString());
- GUILayout.EndHorizontal();
- }
- else if (NetworkClient.active)
- {
- EdgegapKcpClient client = (EdgegapKcpClient)this.client;
- GUILayout.BeginHorizontal();
- GUILayout.Label("State:");
- GUILayout.Label(client.connectionState.ToString());
- GUILayout.EndHorizontal();
- }
- GUILayout.EndArea();
- }
- // base OnGUI only shows in editor & development builds.
- // here we always show it because we need the sessionid & userid buttons.
- #pragma warning disable CS0109
- new void OnGUI()
- {
- #if UNITY_EDITOR || DEVELOPMENT_BUILD
- base.OnGUI();
- #endif
- if (relayGUI) OnGUIRelay();
- }
- public override string ToString() => "Edgegap Kcp Transport";
- }
- #pragma warning restore CS0109
- }
- //#endif MIRROR <- commented out because MIRROR isn't defined on first import yet
|