前段时间在做项目的过程中,需要实现一个机器人模型实时反映实际机器人的运动,因为本身在做机器人控制系统的时候,控制系统和上位机的通讯方式已经改成了面向服务的grpc通讯,因此在简化系统架构的基础上,在unity上配置grpc读取实时坐标,可以和上位机使用同样的api接口。
一、生成头文件
grpc的好处就不过多赘述,相信使用过的都清楚,相比于网上的其他教程,在本教程创建头文件时会更加方便。如果你以前使用过grpc,或者刚刚安装,那么在你C盘 C:\Program Files (x86)\grpc\bin 下,会有这么几个程序
如果你没有这些程序,可以直接去这里下载 https://packages.grpc.io/archive/2022/02/cc3de1c3eba4c342c406729649f3c39f829dcdbc-24ad316a-7a17-4194-ac29-a95eceae67c6/index.xml
很明显这是针对不同语言来生成头文件引用的,因为我们是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项目中。
二、导入包
有了这两个文件,你只需要到grpc的官网去下载unity - grpc 的package包(和上面下载的网址相同)并下载图中的文件
把这个包下载下来后,直接把里面的文件解压到 你的项目/Assets 中,打开unity,它自己就会帮你导入完成:
三、快乐地敲代码
我自己在做的过程中,由于我想要不断的更新坐标,所以要把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();//我自己封装的更新坐标函数
}
}