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;
    }
}
相关推荐
Aman19846 小时前
Claude Code做Unity项目移植(二): 自动执行只读操作,告别频繁的
unity·游戏开发·vibe coding·claude code
暴走约伯15 小时前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
郝学胜-神的一滴16 小时前
游戏设计:原型与开发 18:Unity入门的第一课
人工智能·程序人生·游戏·ui·unity·游戏引擎
淡海水18 小时前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc
小此方19 小时前
C++ 工程组件与基础设施(三)详解RPC服务的概念与安装,图片介绍Brpc服务器和客户端的搭建过程
服务器·c++·rpc
Solange__21 小时前
AI世界模型、3D场景生成和游戏引擎怎么选?按5类任务比较交互、物理与导出
开发语言·人工智能·游戏·平面·3d·自然语言处理·游戏引擎
LF男男1 天前
Flower Defense—UIFacade
unity
呆呆敲代码的小Y1 天前
【实战精选面试题】Unity精选面试题详细解答,按模块整理汇总
人工智能·游戏·unity·游戏引擎
小贺儿开发1 天前
《流光绘忆》Unity 沉浸式光影互动
科技·unity·ai·程序员·工具·互动·光影
Aman19842 天前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移