MagicOnion Unity快速入门指南:构建gRPC通信的Unity客户端

MagicOnion Unity快速入门指南:构建gRPC通信的Unity客户端

MagicOnion Unified Realtime/API framework for .NET platform and Unity. MagicOnion 项目地址: https://gitcode.com/gh_mirrors/ma/MagicOnion

前言

MagicOnion是一个基于gRPC的.NET通信框架,它简化了服务器与客户端之间的RPC通信实现。本教程将指导您如何在Unity项目中快速集成MagicOnion,实现Unity客户端与.NET服务器之间的通信。

环境准备

在开始之前,请确保您的开发环境满足以下要求:

  • 操作系统:Windows或macOS
  • .NET SDK:8.0或更高版本
  • Unity版本:2022.3或更高版本,或Unity 6(6000.0.34f1或更高)

注意:Unity 6的某些早期版本存在Source Generator问题,建议使用6000.0.34f1或更高版本。

项目结构规划

我们将创建以下项目结构:

项目根目录/
├─ 解决方案文件.sln
└─ src/
   ├─ 服务器项目/
   │  ├─ 项目文件.csproj
   │  └─ ...
   ├─ 共享库项目/
   │  ├─ 项目文件.csproj
   │  └─ ...
   └─ Unity项目/
      ├─ Unity项目文件
      └─ ...

创建基础项目

1. 创建服务器和共享库项目

使用以下命令创建基础项目结构:

# 设置项目名称变量
PROJECT_NAME=MyApp

# 创建基础项目结构
dotnet new gitignore
dotnet new grpc -o src/$PROJECT_NAME.Server -n $PROJECT_NAME.Server
dotnet new classlib -f netstandard2.1 -o src/$PROJECT_NAME.Shared -n $PROJECT_NAME.Shared

# 创建解决方案并添加项目
dotnet new sln -n $PROJECT_NAME
dotnet sln add src/$PROJECT_NAME.Server --in-root
dotnet sln add src/$PROJECT_NAME.Shared --in-root

# 配置服务器项目
pushd src/$PROJECT_NAME.Server
dotnet remove package Grpc.AspNetCore
dotnet add package MagicOnion.Server
dotnet add reference ../$PROJECT_NAME.Shared
popd

# 配置共享库项目
pushd src/$PROJECT_NAME.Shared
dotnet add package MagicOnion.Abstractions
popd

2. 创建Unity项目

通过Unity Hub创建一个新的Unity项目,选择"Universal 3D"或其他适合的模板,将其放置在src/项目名称.Unity目录下。

定义服务接口

在共享库项目中定义服务接口,这是服务器和客户端通信的契约:

// 文件路径:src/MyApp.Shared/IMyFirstService.cs
using MagicOnion;

namespace MyApp.Shared
{
    // 服务接口必须继承IService<T>
    public interface IMyFirstService : IService<IMyFirstService>
    {
        // UnaryResult表示这是一个异步方法
        UnaryResult<int> SumAsync(int x, int y);
    }
}

实现服务器端

1. 配置服务器启动

修改服务器项目的Program.cs文件:

var builder = WebApplication.CreateBuilder(args);

// 添加MagicOnion服务
builder.Services.AddMagicOnion();

var app = builder.Build();

// 映射MagicOnion服务
app.MapMagicOnionService();

app.Run();

2. 实现服务逻辑

创建服务实现类:

// 文件路径:src/MyApp.Server/Services/MyFirstService.cs
using MagicOnion;
using MagicOnion.Server;
using MyApp.Shared;

namespace MyApp.Server.Services;

public class MyFirstService : ServiceBase<IMyFirstService>, IMyFirstService
{
    public async UnaryResult<int> SumAsync(int x, int y)
    {
        Console.WriteLine($"收到参数:{x}, {y}");
        return x + y;
    }
}

3. 启动服务器

运行服务器项目,确保控制台输出监听地址(如http://localhost:5210),Unity客户端将使用此地址连接。

配置Unity客户端

1. 安装必要包

Unity项目需要安装以下包:

  1. NuGetForUnity:通过Unity Package Manager安装,URL:

    https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity
    
  2. MagicOnion.Client

    • 通过NuGetForUnity安装MagicOnion.Client
    • 通过Package Manager安装Unity扩展:
      https://github.com/Cysharp/MagicOnion.git?path=src/MagicOnion.Client.Unity/Assets/Scripts/MagicOnion.Client.Unity#7.0.2
      
  3. YetAnotherHttpHandler

    • 先安装System.IO.Pipelines(通过NuGetForUnity)
    • 然后安装主包:
      https://github.com/Cysharp/YetAnotherHttpHandler.git?path=src/YetAnotherHttpHandler#1.10.0
      

2. 引用共享库

将共享库项目中的IMyFirstService.cs文件复制到Unity项目的Assets/Scripts目录下。

3. 创建客户端连接脚本

// 文件路径:Assets/Scripts/MagicOnionClient.cs
using MagicOnion;
using MagicOnion.Client;
using MyApp.Shared;
using UnityEngine;
using Grpc.Core;
using Grpc.Net.Client;

public class MagicOnionClient : MonoBehaviour
{
    async void Start()
    {
        // 创建通道(替换为你的服务器地址)
        var channel = GrpcChannel.ForAddress("http://localhost:5210");
        
        // 创建服务客户端
        var client = MagicOnionClient.Create<IMyFirstService>(channel);
        
        try
        {
            // 调用服务方法
            var result = await client.SumAsync(10, 20);
            Debug.Log($"计算结果: {result}");
        }
        catch (RpcException ex)
        {
            Debug.LogError($"RPC错误: {ex.Status.Detail}");
        }
    }
}

4. 测试连接

  1. 将脚本附加到场景中的游戏对象
  2. 确保服务器正在运行
  3. 运行Unity项目
  4. 查看控制台输出,确认成功接收到计算结果

常见问题解决

  1. 连接失败

    • 检查服务器地址是否正确
    • 确保服务器正在运行
    • 检查防火墙设置
  2. 序列化错误

    • 确保服务接口定义在服务器和客户端完全一致
    • 检查使用的MagicOnion版本是否一致
  3. Unity版本兼容性问题

    • 确保使用兼容的Unity版本
    • 如遇Source Generator问题,升级到推荐的Unity版本

进阶建议

  1. 错误处理:完善客户端错误处理,处理网络异常和超时
  2. 性能优化:考虑使用连接池管理gRPC通道
  3. 安全配置:在生产环境中配置TLS加密通信
  4. 日志记录:添加详细的客户端和服务器日志

通过本教程,您已经成功实现了Unity客户端与MagicOnion服务器的基本通信。这为构建更复杂的实时交互功能奠定了基础。

MagicOnion Unified Realtime/API framework for .NET platform and Unity. MagicOnion 项目地址: https://gitcode.com/gh_mirrors/ma/MagicOnion

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/3d8e22c21839 随着 Web UI 框架(如 EasyUI、JqueryUI、Ext、DWZ 等)的不断发展与成熟,系统界面的统一化设计逐渐成为可能,同时代码生成器也能够生成符合统一规范的界面。在这种背景下,“代码生成 + 手工合并”的半智能开发模式正逐渐成为新的开发趋势。通过代码生成器,单表数据模型以及一对多数据模型的增删改查功能可以被直接生成并投入使用,这能够有效节省大约 80% 的开发工作量,从而显著提升开发效率。 JEECG(J2EE Code Generation)是一款基于代码生成器的智能开发平台。它引领了一种全新的开发模式,即从在线编码(Online Coding)到代码生成器生成代码,再到手工合并(Merge)的智能开发流程。该平台能够帮助开发者解决 Java 项目中大约 90% 的重复性工作,让开发者可以将更多的精力集中在业务逻辑的实现上。它不仅能够快速提高开发效率,帮助公司节省大量的人力成本,同时也保持了开发的灵活性。 JEECG 的核心宗旨是:对于简单的功能,可以通过在线编码配置来实现;对于复杂的功能,则利用代码生成器生成代码后,再进行手工合并;对于复杂的流程业务,采用表单自定义的方式进行处理,而业务流程则通过工作流来实现,并且可以扩展出任务接口,供开发者编写具体的业务逻辑。通过这种方式,JEECG 实现了流程任务节点和任务接口的灵活配置,既保证了开发的高效性,又兼顾了项目的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孔振冶Harry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值