com.alicizax.unity.network/Runtime/Network/NetworkModule.cs

87 lines
2.5 KiB
C#
Raw Normal View History

2025-02-24 17:35:48 +08:00
using System.Reflection;
2025-03-24 13:17:26 +08:00
using AlicizaX;
2025-02-24 17:35:48 +08:00
using Cysharp.Threading.Tasks;
using Fantasy;
using Fantasy.Network;
2025-03-19 13:02:15 +08:00
using Fantasy.Network.Interface;
2025-02-24 17:35:48 +08:00
namespace AlicizaX.Network.Runtime
{
[UnityEngine.Scripting.Preserve]
2025-03-20 20:47:48 +08:00
internal sealed class NetworkModule : INetworkModule
2025-02-24 17:35:48 +08:00
{
private Scene _scene;
private Session _session;
2025-03-18 19:41:26 +08:00
private int _heartInterval;
2025-02-24 17:35:48 +08:00
2025-03-19 13:02:15 +08:00
public EConnectState ConnectState => _connectState;
private EConnectState _connectState;
2025-02-24 17:35:48 +08:00
void IModule.Dispose()
{
_scene?.Dispose();
_session?.Dispose();
}
2025-03-18 19:41:26 +08:00
public void SetHeartInterval(int heartInterval)
{
_heartInterval = heartInterval;
}
2025-02-24 17:35:48 +08:00
public async UniTask Initialize(params Assembly[] assemblies)
{
2025-03-18 19:41:26 +08:00
Assembly[] allAssemblies = new Assembly[assemblies.Length + 1];
for (int i = 0; i < assemblies.Length; i++)
{
allAssemblies[i] = assemblies[i];
}
2025-03-20 20:47:48 +08:00
allAssemblies[allAssemblies.Length - 1] = typeof(NetworkModule).Assembly;
2025-03-18 19:41:26 +08:00
await Fantasy.Platform.Unity.Entry.Initialize(allAssemblies);
2025-06-24 16:07:56 +08:00
_scene = await Scene.Create(SceneRuntimeMode.MainThread);
2025-02-24 17:35:48 +08:00
}
public void Connect(string remoteAddress, NetworkProtocolType networkProtocolType, bool isHttps)
{
_session = _scene.Connect(remoteAddress, networkProtocolType, OnConnectComplete, OnConnectFail, OnConnectDisconnect, isHttps);
}
2025-03-19 13:02:15 +08:00
public async UniTask<T> Call<T>(IRequest request, long routeId = 0) where T : IResponse
{
return (T)await _session.Call(request, routeId);
}
public void Send(IMessage message, uint rpcId = 0, long routeId = 0)
{
_session.Send(message, rpcId, routeId);
}
public void Send(IRouteMessage routeMessage, uint rpcId = 0, long routeId = 0)
{
_session.Send(routeMessage, rpcId, routeId);
}
2025-02-24 17:35:48 +08:00
private void OnConnectComplete()
{
2025-03-19 13:02:15 +08:00
_connectState = EConnectState.Connect;
2025-02-24 17:35:48 +08:00
_session.AddComponent<SessionHeartbeatComponent>().Start(_heartInterval);
2025-03-24 13:17:26 +08:00
Log.Info("Connect Success");
2025-02-24 17:35:48 +08:00
}
private void OnConnectFail()
{
2025-03-19 13:02:15 +08:00
_connectState = EConnectState.None;
2025-03-24 13:17:26 +08:00
Log.Info("Connect Fail");
2025-02-24 17:35:48 +08:00
}
private void OnConnectDisconnect()
{
2025-03-19 13:02:15 +08:00
_connectState = EConnectState.Disconnect;
2025-03-24 13:17:26 +08:00
Log.Info("Disconnect");
2025-02-24 17:35:48 +08:00
}
}
}