🎮

Godot で Photon Realtime を使ってみる

2023/12/14に公開

この記事は Godot Engine Advent Calendar 2023 14日目の記事です。

はじめに

ちょっとした小ネタです。
書いてみたら思ったほど書くことが無かったので Godot で Photon Realtime が動くということだけ先に書いておきます。
ここまでで読むのを止めても良いでしょう。

Godot では、公式に C# バインディングがサポートされており、 .NET 6.0 に対応しています。
(コミュニティによって Rust バインディングなども提供されています。)

つまり、 .NET 6 で利用できるライブラリなら大体何でも動きそうですね。

Photon Realtime

Unity でマルチプレイヤーオンラインゲームを開発したことがある人ならご存じの人が多いと思いますが、マルチプレイの通信に利用できる SaaS として Photon というものがあります。

Photon にも色々サービスの種類(Fusion や Quantum など)がありますが、今回は Photon Realtime という最もプレーンなリアルタイム通信サーバーを利用する例を紹介します。

Godot で Photon Realtime SDK を導入する

Photon の Fusion や PUN2 などは、 Unity に依存しているため Godot では利用できませんが、 Realtime は .NET 用の SDK が提供されており、利用可能なことが期待できます。

.NET 用の SDK は こちら からダウンロードできます。

ダウンロードした SDK をプロジェクトの適切な場所に配置したら、 csproj に以下のように SDK の dll を指定してあげるだけです。以上!

  <ItemGroup>
    <Reference Include="Photon-NetStandard Version=4.1.7.0">
      <HintPath>./Photon/libs/Release/netstandard2.0/Photon-NetStandard.dll</HintPath>
    </Reference>
  </ItemGroup>

あとは Unity で利用するときと同じように、 Photon の IConnectionCallbacksIMatchmakingCallbacks を実装したクラスを用意し、利用時に _Process など毎フレーム呼ばれるメソッドで Photon.Realtime.LoadBalancingClient.Service メソッドを呼び出すようにするだけです。

例えばこんな感じです。

using Godot;
using Photon.Realtime;

public partial class MyNode : Node, IConnectionCallbacks
{
    private readonly LoadBalancingClient _client = new();

    public override void _Ready()
    {
        _client.AddCallbackTarget(this);
        _client.ConnectUsingSettings(new AppSettings
        {
            AppIdRealtime = "YourAppId"
        });
    }

    public override void _Process(double delta)
    {
        _client.Service();
    }

    #region IConnectionCallbacks implementation

    public void OnConnected()
    {
        GD.Print("OnConnected!");
    }

    public void OnConnectedToMaster()
    {
        GD.Print("OnConnectedToMaster!");
        _client.OpJoinOrCreateRoom(new EnterRoomParams
        {
            RoomName = "MyRoom",
            RoomOptions = new RoomOptions
            {
                PublishUserId = true
            }
        });
    }

    public void OnDisconnected(DisconnectCause cause)
    {
        GD.Print("OnDisconnected!");
    }

    // 省略
    #endregion
}

まとめ

Godot でも Photon Realtime を利用できます。

GitHubで編集を提案

Discussion