【MagicOnion】ちょっとしたアプリを作った際に躓いた点

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【MagicOnion】ちょっとしたアプリを作った際に躓いた点

2022-5-30 | ,

MagicOnionとUnityでちょっとした業務用のアプリを作った際に私の凡ミスなどのせいで躓いた点の覚書です。

概要

この記事では、私がMagicOnionとUnityでちょっとした業務用のアプリを作った際に躓いた点をいくつか覚書として掲載する。

仕様書

環境

  • Unity 2021.3.0f1
  • MagicOnion 4.4.0

覚書

MessagePack.CodeGenerator.MessagePackGeneratorResolveFailedException

MessagePackの例外なのですが、基本的には該当のクラスに[MessagePackObject]を設定し忘れてるときに発生する。

私の場合ですが、やり方が悪いのかList<>を継承したクラスに対して例外が発生した。

[MessagePackObject]
public class StatePack
{
    [Key(0)] public States states { get; set; }
    [Key(1)] public int X { get; set; }
    [Key(2)] public int Y { get; set; }
}

[MessagePackObject(keyAsPropertyName: true)] //[MessagePackObject]でもエラー
public class States : List<State> {}

[MessagePackObject]
public class State
{
    [Key(0)] public int HP { get; set; }
    [Key(1)] public int MP { get; set; }
}

下記のようにList<>を継承したクラスを使わず、直接、List<>した型をクラスに含める場合は例外は発生しない。

[MessagePackObject]
public class StatePack
{
    [Key(0)] public List<State> States { get; set; }
    [Key(1)] public int X { get; set; }
    [Key(2)] public int Y { get; set; }
}

[MessagePackObject]
public class State
{
    [Key(0)] public int HP { get; set; }
    [Key(1)] public int MP { get; set; }
}

FormatterNotRegisteredException

この例外が発生したケースが2通りあった。

実行時に発生するケース

これは私の凡ミスなのですが、Unityのエディター上で行う「MessagePack」の「CodeGenerator」で、MessagePackObjectとして使うソースファイルが「input path」で設定したパスの外にあると実行時に該当のクラスがシリアライズできないので例外が発生する。

「MessagePack」の「CodeGenerator」の「input path」では複数のパスは設定できないようなので、該当のソースファイルは「input path」で設定したパスの中にまとめておく。

Android実機での実行時のみ発生するケース

「Project Settings」->「Player」の中にある「Configuration」->「Scripting Backend」が「IL2CPP」以外になってると実行時に例外が発生する。

Unityのエディター上では発生しないのと、List<>型の「MessagePackObject」を使わなかったビルドでの実行では例外が発生しなったので、嵌まりかけた。

Android実機で約5分実行するとgRPCサーバーとの通信が切断される(切断されない端末もある)

通信する関数を実行する際にObjectDisposedExceptionをキャッチして、サーバーに再接続する。
もしくは、定期的(15秒~30秒)に「StreamingHub」で通信することでそもそも切断されなくなった。

Android実機で約5分以上アプリをバックグラウンドにした後にアクティブにすると例外が発生せず通信が切断される

例外が発生せずに症状が出てしまう。

アプリがアクティブに復帰際にサーバーに再接続しようとしてもなぜかうまくいかなかったが、復帰際に強制的にアプリを再起動することでサーバーに再接続できた。

アプリの再起動については下記の記事を参照して下さい。

この方法はアプリの種類によっては使えなさそうな予感。
バックグラウンドになった時間で再接続するかアプリを再起動するか処理を分けた方が良いかもね!

まとめ(感想文)

私のMagicOnionやgRPCなどに対する勉強不足感が否めませんが、またやらしそうな気がするので記録として残すよ!

これはちゃんと勉強すれば、いろいろできそうで楽しい。

低価格、低スペックなVPSでサーバーを稼働させてるのですが、サクサク動いてる。

引用・参考文献

下記のページを参考にさせていただきました。
ありがとうございました。