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;
    }
}
相关推荐
狂人开飞机5 小时前
14、游戏手感与视觉打磨
游戏·游戏引擎·godot
狂人开飞机10 小时前
15、音频系统
游戏引擎·godot
狂人开飞机11 小时前
16、粒子线条与视觉特效
游戏引擎·godot
心前阳光1 天前
Unity发布PC软件图标不能改变
unity·游戏引擎
an86950011 天前
unity如何在visual studio中打断点debug
unity·游戏引擎·visual studio
xcLeigh1 天前
Unity基础:使用Transform控制物体移动——Translate与position详解
unity·游戏引擎
FairGuard手游加固1 天前
Unity小游戏加密:global-metadata.dat与AssetBundle保护
游戏·unity·游戏引擎
狂人开飞机1 天前
11、UI系统
游戏引擎·godot
真鬼1231 天前
【Unity AI】Untiy链接cursor与MCP
unity·游戏引擎
WarPigs1 天前
Unity设置人物位置无效的原因
unity