Unity使用TouchSocket的RPC

服务器端

使用.NET版本为:4.6.2

安装包:TouchSocket.Dmtp

csharp 复制代码
    public partial class MyRpcServer : SingletonRpcServer
    {
        [DmtpRpc(MethodInvoke = true)]
        public int Add(int a, int b)
        {
            Console.WriteLine("调用Add");
            var sum = a + b;
            return sum;
        }
    }


    internal class Program
    {
        static async Task Main(string[] args)
        {
            var service = new TcpDmtpService();
            var config = new TouchSocketConfig()//配置
                   .SetListenIPHosts(7789)
                   .ConfigureContainer(a =>
                   {
                       a.AddDmtpRouteService();
                       //添加Rpc注册器
                       a.AddRpcStore(store =>
                       {
                           store.RegisterServer<MyRpcServer>();//注册服务
                       });

                   })
                   .ConfigurePlugins(a =>
                   {
                       //启用DmtpRpc功能
                       a.UseDmtpRpc();
                       a.Add<ConnectedPlugin>();
                       a.Add<ClosedPlugin>();
                       a.Add<MyRpcPlugin>();
                   })
                   .SetDmtpOption(options =>
                   {
                       options.VerifyToken = "Dmtp";//设定连接口令,作用类似账号密码
                       options.VerifyTimeout = TimeSpan.FromSeconds(3);//设定验证超时时间为3秒
                   });

            await service.SetupAsync(config);

            await service.StartAsync();
            Console.WriteLine("successed");

            Console.ReadLine();
        }

    }

    public class ConnectedPlugin : IDmtpConnectedPlugin
    {
        public bool DisposedValue => false;

        public void Dispose()
        {

        }

        public void Loaded(IPluginManager pluginManager)
        {

        }

        public Task OnDmtpConnected(IDmtpActorObject client, DmtpVerifyEventArgs e)
        {
            Console.WriteLine(client.DmtpActor.Id + ":连上了");
            return Task.CompletedTask;
        }

        public void Unloaded(IPluginManager pluginManager)
        {

        }
    }
    public class ClosedPlugin : IDmtpClosedPlugin
    {
        public bool DisposedValue => false;

        public void Dispose()
        {

        }

        public void Loaded(IPluginManager pluginManager)
        {

        }

        public Task OnDmtpClosed(IDmtpActorObject client, ClosedEventArgs e)
        {
            Console.WriteLine(client.DmtpActor.Id + ":断开了");
            return Task.CompletedTask;
        }

        public void Unloaded(IPluginManager pluginManager)
        {

        }
    }

    public class MyRpcPlugin : PluginBase, IDmtpRoutingPlugin
    {
        public async Task OnDmtpRouting(IDmtpActorObject client, PackageRouterEventArgs e)
        {
            if (e.RouterType == RouteType.Rpc)
            {
                e.IsPermitOperation = true;
                return;
            }

            await e.InvokeNext();
        }
    }

Unity端

群文件中下载Unity插件

导入Unity中

csharp 复制代码
public class NewMonoBehaviourScript : MonoBehaviour
{
    // Start is called once before the first execution of Update after the MonoBehaviour is created
    private TcpDmtpClient client1;
    async void Start()
    {

        client1 = new TcpDmtpClient();
        await client1.SetupAsync(new TouchSocketConfig()
              .ConfigureContainer(a =>
              {
                  a.AddConsoleLogger();
                  a.AddRpcStore(a => a.RegisterServer<MyClientRpcServer>());
              })
              .ConfigurePlugins(a =>
              {
                  //启用dmtp rpc插件
                  a.UseDmtpRpc();
                  a.UseReconnection<TcpDmtpClient>(a => a.UseSimple());
              })
              .SetRemoteIPHost("127.0.0.1:7789")
              .SetDmtpOption(options =>
              {
                  options.VerifyToken = "Dmtp";
                  options.Id = "20001";
              }));
        await client1.ConnectAsync();
    }
    async void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            var sum = await client1.GetDmtpRpcActor().InvokeTAsync<int>("Add", InvokeOption.WaitInvoke, 10, 1);
            Debug.Log(sum);
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            var aa = await client1.GetDmtpRpcActor().InvokeTAsync<int>("10001", "Sub1", InvokeOption.WaitInvoke, 10, 1);
            Debug.Log(aa);
        }
    }
    void OnDisable()
    {
        client1.CloseAsync();
        client1.Dispose();
    }
}

public partial class MyClientRpcServer : SingletonRpcServer
{
    [DmtpRpc(MethodInvoke = true)]
    public int Sub1(int a, int b)
    {
        Debug.Log("调用Sub");
        var sum = a - b;
        return sum;
    }
}
相关推荐
游乐码12 小时前
Unity基础(十四)场景异步加载
unity·游戏引擎
mxwin13 小时前
Unity Shader URP:法线在空间变换上的特殊性
unity·游戏引擎·shader
nnsix13 小时前
Unity 动态批处理、静态批处理、GPU Instaning、SRP Batcher 笔记
笔记·unity·单一职责原则
charlee4414 小时前
Unity在安卓端如何调试输出信息
android·unity·adb·游戏引擎·真机调试
TCW112115 小时前
Minetest游戏引擎源代码解析
游戏引擎
_Athie15 小时前
【开发工具】自动创建项目文件夹结构
unity·编辑器
auccy1 天前
Unity Sprite 添加法线贴图
unity·贴图·normal
一锅炖出任易仙1 天前
创梦汤锅学习日记day32
学习·ai·游戏引擎
mxwin2 天前
次世代角色 PBR 贴图制作 + Unity URP 接入 极简流程图
unity·流程图·贴图·shader