3. カスタムコマンドを実装する

こちらは 1. 2. のチュートリアルが完了していることが前提の内容となっております。

はじめに

続いて Diarkis のカスタマイズ性を体験するために、カスタムコマンドを実装してみましょう。

本チュートリアルでは以下のようなコマンドを実装します。

  • Room の敵に攻撃するコマンド

  • コマンドバージョン: 2 (0, 1 はビルトインコマンドで利用されています)

  • コマンド ID: 300

  • リクエスト: 攻撃タイプ (type) を指定してコマンドを送信 (1: 近接、2:遠距離)

  • レスポンス: 誰がダメージを与えたか、ダメージ値と合計ダメージ値を返却

  • ルームメンバー全員に push 通知

実装の流れは以下を想定しています。

  • puffer (Diarkis が提供するデータシリアライザ) を使ってペイロードを生成するためのコードを出

  • サーバーにカスタムコマンドを実装

  • テストクライアントにコマンドを実装

Puffer モジュール(Diarkis が提供する データシリアライザ)

Puffer は JSON からデータをシリアライズ、デシリアライズするためのコードを生成するツールです。

出力先は C++、C#、Go に対応しているため、Unreal や Unity で開発するクライアントと、Go で開発するサーバーとのパケットデータに関する実装を簡略化できます。

Puffer の詳細については API リファレンスをご確認ください。

https://docs.diarkis.io/docs/server/v1.0.0/diarkis/puffer/index.html

カスタムコマンドのデータ定義用 JSON ファイルの作成

💾 ./puffer/json_definitions/custom/attack.json を追加します。

attack はカスタムコマンドのリクエストに利用するデータです。

  • type: 攻撃タイプを uint8 型で格納できます

attackResult はレスポンス、ルームメンバーへの push 通知に使うデータです。

  • type: 攻撃タイプを uint8 型で格納できます

  • uid: 誰がダメージを与えたか。 string 型

  • damage: ダメージ値。 uint16 型

  • totalDamage: 合計ダメージ値。 uint16 型

コード生成

以下のコマンドを実行して、コードを生成します。puffer 以下の各言語のディレクトリにコードが出力されます。

サーバーに attack コマンドハンドラを実装する

サーバーに attack コマンドを実装しましょう。

💾 ./cmds/custom/attack.go を追加します。

コード内のコメントにて、どんなことを実装しているか記載していますので、合わせてお読みください。

attack コマンドを公開する

コマンドを実装したら、外部に公開する必要があります。

💾 ./cmds/custom/main.go を編集し、以下を追加します。

Expose() に対して、 diarkisexec.SetServerCommandHandler() を追加して、attack コマンドを公開します。

テストクライアントに attack コマンドを追加する

サーバーの attack コマンドを実行するためにテストクライアントに attack コマンドを追加します。

💾 ./testcli/handson/attack.go を追加します。

クライアントを実行するための setup の他、サーバーにコマンドを送信する Attack() 、レスポンスをハンドリングする onResponse()、push通知をハンドリングする onPush() を実装しています。

テストクライアントに handson attack コマンドを登録します。

💾 ./testcli/main.go を編集します。

cli.RegisterCommands(string, []cli.Command) でテストクライアントに新しいコマンドを登録できます。

バイナリを生成し、udp サーバーを再起動する

再度 make build-local を実行してバイナリを生成します。

サーバーとテストクライアントが更新されます。

エラーが無いことが確認できたら、一度 udp サーバーを停止して、再起動してください。

attack コマンドの動作確認

room create room join した後に handson attack コマンドを発行し、ダメージが加算されることを確認してください。

uid: test1 で handson attack を実行

uid: test2 で attack 結果の push 通知を受信

最終更新

役に立ちましたか?