본문 바로가기
gRPC

gRPC on Unity 3D (Test Example)

by GiantKing 2021. 6. 14.

아주 간단한 Unity 3D에서 gRPC 통신 테스트

1. gRPC 다운로드

1-1. 다운로드 사이트접속. (https://packages.grpc.io/)

      최신 버전의 Build ID를 클릭 .

 

 

 

1-2. gRPC protoc Plugins에서 OS에 맞는 파일 다운로드.

      C#에서 grpc_unity_package...~...zip 다운로드.

 

 

 

1-3. 압축 해제한 grpc-protoc 파일은 .proto 파일을 컴파일할 때 계속 사용하게 되므로 적당한 곳에 압축을 풀어 보관.

      grpc_unity_package 파일은 압축 해제 후 Plugins 폴더 생성 그대로 유니티 프로젝트 Assets 폴더 하위 이동.

 

 

 

 

2. .proto 작성 및 컴파일

2-1. proto 파일 작성

      사용하는 IDE, Editor, 메모장 등을 사용. 작성한 후 .proto 파일로 grpc-protoc 보관 파일 이동.


test.proto 내용

 

syntax = "proto3";

package MyProject.Test;

 

service EchoTest { rpc Ping (PingRequest) returns (PongResponse) {} }

 

message PingRequest { string message = 1; }

message PongResponse { string message = 1; }


 

 

 

2-2. proto 파일 컴파일

 

컴파일 명령어

OS: MAC, Linux 

protoc -I ./ --csharp_out=. [name.proto] --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin

 

OS: Windows

./protoc -I ./ --csharp_out=. [name.proto] --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe

 

Windows Ex) ./protoc -I ./ --csharp_out=. test.proto --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe

 

cmd로 해당 경로로 들어가 위 명령어를 입력하면 자동 컴파일.

 

test.proto 파일 컴파일 후 Test.cs, TestGrpc.cs 파일이 생성.

 

 

 

 

3. Unity 3D 실습

3-1. 컴파일해서 나온 .cs 파일 두 개 모두 Unity3D 프로젝트로 이동.

      server, client 통신 테스트를 위해 server, client 두 개의 프로젝트를 생성.

 


//---------------Server 스크립트-----------------//

using System.Threading.Tasks;
using UnityEngine;
using Grpc.Core; 
using MyProject.Test; // .proto파일 만들 때 만든 namespace

public class GrpcServerTest : MonoBehaviour
{
    Server server;
    const string IP = "localhost";
    const int Port = 88888;
    // Start is called before the first frame update
    void Start()
    {
        server = new Server
        {
            Services = { EchoTest.BindService(new EchoTestPingGRPC())},       //서비스 생성           
            Ports = { new ServerPort(IP, Port, ServerCredentials.Insecure) }    
        };
        server.Start();   // 서버 오픈
    }
}
public class EchoTestPingGRPC : EchoTest.EchoTestBase
{
    public override Task<PongResponse> Ping(PingRequest request, ServerCallContext context)
    {
        Debug.Log(request.Message);
        return Task.FromResult(new PongResponse { Message = "Echo: " + request.Message });  //들어온 메시지를 반환
    }
}


 

 

 


//--------------------Clinet 스크립트------------------//

using UnityEngine;
using Grpc.Core;
using MyProject.Test;  // .proto파일 만들 때 만든 namespace

public class GrpcClientTest : MonoBehaviour
{
    const string IP = "localhost:";
    const int Port = 88888;

    string mes = "Hi!! Test Echo";
    Channel channel;

    void Start()
    {
        channel = new Channel(IP + Port, ChannelCredentials.Insecure);  //채널 생성
        var client = new EchoTest.EchoTestClient(channel);  //클라이언트 생성
        var repley = client.Ping(new PingRequest { Message = mes });  // 메시지 보내고 응답받기
        Debug.Log(repley.Message); 
    }
}

 


3-2. 각 server/client에 위 스크립트 생성 후 오브젝트에 스크립트를 넣어 server부터 실행.

'gRPC' 카테고리의 다른 글

gRPC란 ?  (0) 2021.06.17
gRPC on Unity 3D (C# proto, server, client Example)  (0) 2021.06.15