using System.Reflection; using AlicizaX.Runtime; using Cysharp.Threading.Tasks; using Fantasy; using Fantasy.Network; using Log = AlicizaX.Runtime.Log; namespace AlicizaX.Network.Runtime { [UnityEngine.Scripting.Preserve] internal sealed class NetworkManager : INetworkManager { private Scene _scene; private Session _session; private int _heartInterval; private bool isConnect; void IModule.Dispose() { _scene?.Dispose(); _session?.Dispose(); } public void SetHeartInterval(int heartInterval) { _heartInterval = heartInterval; } public async UniTask Initialize(params Assembly[] assemblies) { Assembly[] allAssemblies = new Assembly[assemblies.Length + 1]; for (int i = 0; i < assemblies.Length; i++) { allAssemblies[i] = assemblies[i]; } allAssemblies[assemblies.Length - 1] = typeof(NetworkManager).Assembly; await Fantasy.Platform.Unity.Entry.Initialize(allAssemblies); _scene = await Scene.Create(SceneRuntimeType.MainThread); } public void Connect(string remoteAddress, NetworkProtocolType networkProtocolType, bool isHttps) { if (isConnect) return; _session = _scene.Connect(remoteAddress, networkProtocolType, OnConnectComplete, OnConnectFail, OnConnectDisconnect, isHttps); } private void OnConnectComplete() { isConnect = true; Log.Debug("连接成功"); // 添加心跳组件给Session。 // Start(2000)就是2000毫秒。 _session.AddComponent().Start(_heartInterval); } private void OnConnectFail() { isConnect = false; Log.Debug("连接失败"); } private void OnConnectDisconnect() { isConnect = false; Log.Debug("连接断开"); } } }