前段时间在做项目的过程中,需要实现一个机器人模型实时反映实际机器人的运动,因为本身在做机器人控制系统的时候,控制系统和上位机的通讯方式已经改成了面向服务的grpc通讯,因此在简化系统架构的基础上,在unity上配置grpc读取实时坐标,可以和上位机使用同样的api接口。

一、生成头文件

        grpc的好处就不过多赘述,相信使用过的都清楚,相比于网上的其他教程,在本教程创建头文件时会更加方便。如果你以前使用过grpc,或者刚刚安装,那么在你C盘 C:\Program Files (x86)\grpc\bin 下,会有这么几个程序

unity项目导sdk_unity项目导sdk

        如果你没有这些程序,可以直接去这里下载 https://packages.grpc.io/archive/2022/02/cc3de1c3eba4c342c406729649f3c39f829dcdbc-24ad316a-7a17-4194-ac29-a95eceae67c6/index.xml

unity项目导sdk_客户端_02

        很明显这是针对不同语言来生成头文件引用的,因为我们是C#,所以在此文件夹下右键 在windows终端中打开,输入如下代码(其中最后面是我自己写的proto文件):

PS C:\Program Files (x86)\grpc\bin> .\protoc.exe --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=.\grpc_csharp_plugin.exe .\DemConDataTransfer.proto

        然后就会生成如下文件,把这两个文件导入到你的Unity项目中。

                                            

unity项目导sdk_客户端_03

        

二、导入包

        有了这两个文件,你只需要到grpc的官网去下载unity - grpc 的package包(和上面下载的网址相同)并下载图中的文件

        

unity项目导sdk_unity项目导sdk_04

         把这个包下载下来后,直接把里面的文件解压到   你的项目/Assets 中,打开unity,它自己就会帮你导入完成:

                                                  

unity项目导sdk_ci_05

三、快乐地敲代码

        我自己在做的过程中,由于我想要不断的更新坐标,所以要把api写在update函数里,因此创建了一个类,并用这个类管理所有我需要从控制器获取的数据,并且用这个类来创建grpc的客户端。这里有一个细节,要自行创建析构函数,把关闭客户端放在里面(很多例程不会这样做,别问为什么,问就是踩过坑),这样你在创建了一个对象的时候,这个对象就可以反复使用,反复调用里面的api了。

        在这个类里面,你可以自己创建函数,对你proto文件定义的函数做一层封装,这样你在使用的时候就可以对象名+函数名来实现调用远程服务器上的函数了。

using UnityEngine;
using Grpc.Core;
using ExternalDataTransfer;//我自己proto文件生成的名称
using System;
public class myclient//客户端类
{
    public myclient()
    {
        channel = new Channel("ip+端口", ChannelCredentials.Insecure);
        client = new RPCDemConData.RPCDemConDataClient(channel);
    }
    public ~myclient()
    {
        channel.ShutdownAsync().Wait();
    }
}

        我自己专门创建了一个更新的函数绑定在摄像机上,这样启动时就可以加载运行,并且不断更新了。

public class textofgrpc : MonoBehaviour
{
    public myclient ourcient;//声明一个客户端对象
    void Start()
    {
        ourcient = new myclient();//实例化
    }
    void Update()
    {
        ourcient.getaxis();//我自己封装的更新坐标函数
    }
}