LoginSignup
5
5

GodotでMagicOnionやってみる

Last updated at Posted at 2023-12-18

こちらは Applibot Advent Calendar 2023 18日目の記事になります。前回の記事はコチラです。

はじめに

Cysharp 河合さんのポストを見て自分でもやってみようと思ったので手順を紹介します。

※初めてGodotを触ります。Godot自体の説明はしません。

プロジェクト作成

サーバー

基本的にはMagicOnionのREADMEにあるQuick Start通りにやっていきます。

Web Applicationテンプレートでソリューションとプロジェクトを作成します。
※画像はRiderで作成する場合のものです。

Screenshot 2023-12-18 at 9.34.52.png

共通

続いてサーバーとGodot側共通で使いたいもの(interfaceなど)用にプロジェクトを追加します。
先ほど作成したソリューションにClass Libraryテンプレートでプロジェクト追加します。
Godot側でも使うためにFramework部分はnet6.0を指定してください。

Screenshot 2023-12-18 at 9.49.25.png

サーバープロジェクトに共通プロジェクトへの参照を追加します。

TamanegiServer.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
    <ItemGroup>
      <ProjectReference Include="..\TamanegiShared\TamanegiShared.csproj" />
    </ItemGroup>
</Project>

Godot

ソリューションを作成したディレクトリ直下にGodotプロジェクトを作成します。

Screenshot 2023-12-18 at 9.55.53.png
※既に作成済みのため画像では空のディレクトリを指定するように怒られています。

Godotプロジェクトで適当なC#スクリプトを作成後、Godotプロジェクト直下のソリューションをエディタで開いて先ほど作成した共通用プロジェクトをソリューションに追加、Godotプロジェクトに共通プロジェクトへの参照を追加します。

TamanegiGodot.csproj
<Project Sdk="Godot.NET.Sdk/4.2.1">
    <ItemGroup>
      <ProjectReference Include="..\TamanegiShared\TamanegiShared.csproj" />
    </ItemGroup>
</Project>

Sharedプロジェクト

NuGetでMagicOnion.Abstractionsを追加します。

TamanegiShared.csproj
<Project Sdk="Microsoft.NET.Sdk">
    <ItemGroup>
      <PackageReference Include="MagicOnion.Abstractions" Version="5.1.8" />
    </ItemGroup>
</Project>

READMEを参考にinterfaceを定義します。

ITamanegiService.cs
using MagicOnion;

namespace Tamanegi.Shared;

public interface ITamanegiService : IService<ITamanegiService>
{
    UnaryResult<int> SumAsync(int x, int y);
}

サーバープロジェクト

NuGetでGrpc.AspNetCoreMagicOnion.Serverを追加します。

TamanegiServer.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
    <ItemGroup>
      <PackageReference Include="Grpc.AspNetCore" Version="2.59.0" />
      <PackageReference Include="MagicOnion.Server" Version="5.1.8" />
    </ItemGroup>
</Project>

Macの場合README通りでは通信できない場合があるので
MacOS で ASP.NET Core gRPC アプリを起動できないを参考にProgram.csのConfigureKestrel箇所を追記してください。

Program.cs
using MagicOnion;
using MagicOnion.Server;
using Microsoft.AspNetCore.Server.Kestrel.Core;

var builder = WebApplication.CreateBuilder(args);

// macOSで開発時に必要
builder.WebHost.ConfigureKestrel(options =>
{
    // portはサーバー起動時のものを指定してください、launchSettings.jsonを参照
    options.ListenLocalhost(5001, o => o.Protocols = HttpProtocols.Http2);
});

builder.Services.AddGrpc();
builder.Services.AddMagicOnion();

var app = builder.Build();

app.MapMagicOnionService();

app.Run();
TamanegiService.cs
using MagicOnion;
using MagicOnion.Server;
using Tamanegi.Shared;

namespace Tamanegi.Server;

public class TamanegiService : ServiceBase<ITamanegiService>, ITamanegiService
{
    public async UnaryResult<int> SumAsync(int x, int y)
    {
        Console.WriteLine($"Received:{x}, {y}");
        return x + y;
    }
}

Godotプロジェクト

NuGetでMagicOnion.Clientを追加します。

TamanegiGodot.csproj
<Project Sdk="Godot.NET.Sdk/4.2.1">
    <ItemGroup>
        <PackageReference Include="MagicOnion.Client" Version="5.1.8" />
    </ItemGroup>
</Project>

以下のC#スクリプトを適当なNodeにアタッチしてください。

TamanegiClient.cs
using Godot;
using Grpc.Net.Client;
using MagicOnion.Client;
using Tamanegi.Shared;

public partial class TamanegiClient : Node
{
	public override async void _Ready()
	{
		var channel = GrpcChannel.ForAddress("http://localhost:5001");

		var client = MagicOnionClient.Create<ITamanegiService>(channel);

		var result = await client.SumAsync(123, 456);
		GD.Print($"Result: {result}");
	}
}

サーバーを起動後にGodot側を実行すると無事サーバーと通信できました!

Screenshot 2023-12-18 at 10.53.15.png

おわりに

GodotでMagicOnionを動作させることができました!

Unityの場合はIL2CPPのためにmoc(MagicOnion用)、mpc(MessagePack用)のツールで事前にコード生成する必要があったり、Unity用のGrpc.CoreパッケージをGitHubに上げるためにサイズ削減したり、Appleシリコン版Macで動作させるためにYetAnotherHttpHandlerを導入する必要があったり細かい部分で煩わしさがありましたが、Godotではそれらと比べると簡単に導入できると感じました。

以上、Applibot Advent Calendar 2023 18日目の記事でした。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5