0
0

UnityでのMessagePack導入とIl2CPP環境での対応方法【Mac環境対応】

Posted at

こんにちは!
この記事では、UnityプロジェクトにMessagePackを導入し、Il2CPP環境で動作確認する手順を解説します。
同様の記事はいくつもありますが、
最新環境だとうまくいかないケースやMac環境であったり、私自身も環境構築の際に苦労した部分もあったため、同じ問題に直面している方の参考になれば幸いです。

この記事の目的

この記事を読むことで、以下のことができるようになります。

•	UnityプロジェクトにNuGetを導入し、MessagePackをインストール
•	Il2CPP環境で動作するようにMessagePackの設定
•	Mac環境での特有の問題に対処

対象読者: Unity初心者から中級者で、MessagePackの導入やIl2CPP環境での対応に悩んでいる方

概要

この記事では、以下の手順を説明します。

1.	MessagePackをUnityプロジェクトに導入
	•	NuGetの導入
	•	NuGetを使用したMessagePackのインストール

2.	Il2CPP環境での対応
	•	ソースジェネレータの環境構築
	•	コードの生成とUnityプロジェクトへの反映

環境情報

•	OS: macOS Sonoma バージョン14.5
•	Unity: 2022.3.27f1

1. MessagePackをUnityプロジェクトに導入

NuGetの導入

まず、UnityプロジェクトでNuGetを利用できるようにします。

1.	NuGetForUnityのリポジトリから、NuGetForUnity.4.1.1.unitypackageをダウンロードします。
2.	ダウンロードしたunitypackageをUnityプロジェクトにインポートします。
3.	Unityのメニューに「NuGet」が表示されていることを確認します。

NuGetForUnityのリポジトリ:https://github.com/GlitchEnzo/NuGetForUnity

NuGetを使用したMessagePackのインストール

次に、NuGetを使用してMessagePackをインストールします。

1.	UnityのメニューからNuGet -> Manage NuGet Packagesを選択します。
2.	検索欄に「MessagePack」と入力し、バージョン2.4.35を選択してインストールします。	

※ 注意: 私は、最新バージョンをインストールした際にエラーが発生してしまったため、今回は安定して動作するバージョンを選びました。
このバージョン選択の理由や、他のバージョンでの問題はまだ十分に調査していないため、注意してください。
これで、Unityエディター上でMessagePackが利用可能になります。

2. Il2CPP環境での対応

ソースジェネレータの環境構築

Il2CPP環境でMessagePackを使用する際には、ソースジェネレータを利用する必要があります。
しかし、私の場合はUnity上でソースジェネレータをうまく動作させることが難しかったです。
外部ツールを使用してコードを生成する方法を取りました。

こちらの記事が参考になりました。
https://qiita.com/nekomimi-daimao/items/cd1e59c71b78bf5afda8
記事内で推奨されている手順に従えば、スムーズに進められます。
私は、生成したコードをMessagePackGenerated.csとして保存しました。

コードの生成とUnityプロジェクトへの反映

生成したコードをUnityプロジェクトに組み込みます。

  1. MessagePackGenerated.csをAssets/Scripts/Generatedフォルダに配置します。
    これは例です。プロジェクトの構成に応じて適切な場所を選んでください。

  2. 次に、以下のスクリプトをStartup.csとして作成し、Unityプロジェクトに追加します。
    以下公式でも同様の記載になっています。
    https://github.com/MessagePack-CSharp/MessagePack-CSharp/blob/master/README.md

using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;

public class Startup
{
    static bool _serializerRegistered;

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void Initialize()
    {
        if (!_serializerRegistered)
        {
            // リゾルバの登録
            StaticCompositeResolver.Instance.Register(
                GeneratedResolver.Instance,
                StandardResolver.Instance
            );

            // デフォルトオプションの設定
            var option = MessagePackSerializerOptions.Standard.WithResolver(StaticCompositeResolver.Instance);
            MessagePackSerializer.DefaultOptions = option;
            _serializerRegistered = true;
        }
    }
}

コードの補足説明
・RuntimeInitializeOnLoadMethod属性を使用することで、シーンがロードされる前に一度だけ初期化処理が実行されるようになります。
・StaticCompositeResolver.Instance.Register(...)では、生成されたリゾルバと標準リゾルバを登録します。これにより、シリアライズやデシリアライズの際に正しいリゾルバが使用されます。
これにより、プロジェクト全体でMessagePackの設定が有効になります。
この設定により、Il2CPP環境でもMessagePackが正しく動作するようになります。

まとめ

以上の手順を実施することで、UnityプロジェクトにMessagePackを導入し、Il2CPP環境でも動作するように設定することができます。私自身も手探りで進めた部分が多くありましたが、この記事が同じ悩みを持つ方の助けになれば幸いです。

免責事項

この記事で紹介したサンプルコードは、私自身の学習と経験をもとに作成したものです。このコードを使用することで生じたトラブルや損害については、一切の責任を負いかねます。自己責任のもとでご利用ください。

0
0
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
0
0