using System; using System.Collections; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; using Net; using Net.Client; using Net.Component; using Net.Share; namespace BITKit { /// /// 基于GDNet的网络服务 /// [Serializable] public class GDNetService:MonoBehaviour, INetProvider,INetClient { //服务器地址与端口号 [Header(Constant.Header.Settings)] [SerializeField] private string address; [SerializeField] private ushort port; [Header(Constant.Header.Components)] //绑定GDNet的ClientManager [SerializeField,SerializeReference,SubclassSelector] private INetClientProvider clientProvider; //内部事件系统 private readonly GenericEvent eventSystem = new(); //内部变量 [Header(Constant.Header.InternalVariables)] //已保存的Rpc对象 private readonly List rpcHandles = new(); //GDNet的网络客户端 private ClientBase client; /// /// 是否已连接到服务端 /// public bool IsConnected => client.Connected; /// /// 连接服务端的延迟 /// public int Ping { get; private set; } //客户端的基本回调 public event Action OnStartConnect; public event Action OnConnected; public event Action OnDisconnected; public event Action OnConnectedFailed; public void ServerCommand(T command=default) { SendRT("CallServerCommand",command); } public void RpcClientCommand(T command=default) { SendRT("CallRpcClientCommand",command); } public void ClientCommand(int id,T command=default) { SendRT("CallClientCommand",id,command); } public UniTask GetFromServer(string addressablePath = "Internal") { throw new NotImplementedException(); } public UniTask GetFromClient(int id, string addressablePath = "Internal") { throw new NotImplementedException(); } public void AddRpcHandle(object rpcHandle) { rpcHandles.Add(rpcHandle); } public void AddCommandListener(Action handle) { eventSystem.AddListener(handle); } public void RemoveCommandListener(Action handle) { eventSystem.RemoveListener(handle); } public void SendRT(string rpcName, params object[] pars) { client.SendRT(rpcName,pars); } public void SendTargetRT(int id, string rpcName, params object[] pars) { SendRT("CallTargetRT",id,rpcName,pars); } public void SendAllRT(string rpcName, params object[] pars) { SendRT("CallSendAllRT",rpcName,pars); } public async UniTask Connect(string _address = "localhost", ushort _port = 27014) { if (client.Connected) return true; client.host = _address; client.port = _port; foreach (var x in rpcHandles) { client.AddRpcHandle(x); } OnStartConnect?.Invoke(); if (await client.Connect()) { OnConnected?.Invoke(); } OnConnectedFailed?.Invoke(); return false; } public void Disconnect() { if (!IsConnected) return; client.Close(); OnDisconnected?.Invoke(); } private void OnReceiveCommand(object command) { eventSystem.Invoke($"{command.GetType().FullName}.{Constant.System.Internal}",command); } private void Start() { client = clientProvider.GetClient(); } } }