🔖

Unity+MagicOnion4.1.xを試す IL2CPPでスマホ実機ビルド編

6 min read

チャプター

まえがき

  • サーバーをEC2環境で動かす編の続きになります
  • 実機ビルドした際に通信結果をみたいのでAWSなどサーバーがあると確認的には便利
  • 環境構築、前提等は上記の記事を参照してください
  • README記載のとおりだとMessagePackのCode Generateが動かなかったのでメモ
  • Android / iOSアプリそのものの実機ビルドに関する詳細は記載しません
  • iOSは強制でIL2CPP
  • AndroidはPlayerSettingsから変更するとIL2CPP

MyApp-Server(MyApp-Shared)でMagicOnionのコード生成

MagicOnion.MSBuild.Tasksを追加

  • NuGetでMagicOnion.MSBuild.TasksをMyApp-Sharedに対して追加

MessagePack.MSBuild.Tasksを追加

  • NuGetでMessagePack.MSBuild.TasksをMyApp-Sharedに対して追加

MyApp-Shared.csprojにタスクを追加

2021.02.25時点ではREADME記載だとMessagePackの記述も追記するようになっていますが、
MessagePackGeneratorの引数が異なっており、そのままだとエラーになるので省いています

  <ItemGroup>
    <Compile Include="..\MyApp-Client\Assets\Scripts\MyApp\Shared\**\*.cs" />
  </ItemGroup>

+ <Target Name="GenerateMagicOnion" AfterTargets="Compile">
+  <MagicOnionGenerator Input=".\MyApp-Shared.csproj" Output="..\MyApp-Client\Assets\Scripts\MyApp\Generated\MagicOnion.Generated.cs" />
+ </Target>

この状態でMyApp-ServerをビルドするとMyApp-Client\Assets\Scripts\MyApp\Generated\MagicOnion.Generated.csが生成される

UnityでMessagePackのコード生成

本当はMagicOnion同様ビルドで自動出力してほしい、今バージョンでのやりかた知ってる方いれば教えて下さい。

メニューからGUIを使って生成

  • Window > MessagePack > CodeGenerator

項目
input path Scripts/MyApp/Shared/MessagePackObjects
output path Scripts/MyApp/Generated

  • Generateを押して成功したあと、一度Unityからフォーカスを外してから戻るとUnity上で認識する
  • \Assets\Scripts\MyApp\Generated\MessagePack_Formatters_MyApp_Shared_MessagePackObjects_PlayerFormat.cs

生成されたファイルの修正

  • 今回は生成元でVector3などを使っているが、生成後に using UnityEngine;が無く、エラーになっているので追加してあげる
\Assets\Scripts\MyApp\Generated\MessagePack_Formatters_MyApp_Shared_MessagePackObjects_PlayerFormat.cs
 // <auto-generated>
 // THIS (.cs) FILE IS GENERATED BY MPC(MessagePack-CSharp). DO NOT CHANGE IT.
 // </auto-generated>

+ using UnityEngine;

ここ、こんな泥臭い事するのか?の気持ちあるので良い方法アレば教えてほしいです
それっぽいIssuesが存在するので修正待ちかも?

Resolverを読み込むようにする

Assets\Scripts\MyApp\InitialSettings.cs
using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;

namespace MyApp
{
    class InitialSettings
    {
        [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
        static void RegisterResolvers()
        {
            // NOTE: Currently, CompositeResolver doesn't work on Unity IL2CPP build. Use StaticCompositeResolver instead of it.
            StaticCompositeResolver.Instance.Register(
                // This resolver is generated by MagicOnion's code generator.
                MagicOnion.Resolvers.MagicOnionResolver.Instance,
                // This resolver is generated by MessagePack's code generator.
                MessagePack.Resolvers.GeneratedResolver.Instance,
                StandardResolver.Instance
            );

            MessagePackSerializer.DefaultOptions = MessagePackSerializer.DefaultOptions
                .WithResolver(StaticCompositeResolver.Instance);
        }
    }
}

iOS用のスクリプトを追加

  • READMEのままだと動かない箇所があるので一部修正
+        var targetGuid = project.GetUnityFrameworkTargetGuid();
-        var targetGuid = project.TargetGuidByName(PBXProject.GetUnityTargetName());
Assets\Editor\BuildIos.cs
#if UNITY_IPHONE
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class BuildIos
{
    /// <summary>
    /// Handle libgrpc project settings.
    /// </summary>
    /// <param name="target"></param>
    /// <param name="path"></param>
    [PostProcessBuild(1)]
    public static void OnPostProcessBuild(BuildTarget target, string path)
    {
        var projectPath = PBXProject.GetPBXProjectPath(path);
        var project = new PBXProject();
        project.ReadFromString(File.ReadAllText(projectPath));
        var targetGuid = project.TargetGuidByName(PBXProject.GetUnityTargetName());

        // libz.tbd for grpc ios build
        project.AddFrameworkToProject(targetGuid, "libz.tbd", false);

        // libgrpc_csharp_ext missing bitcode. as BITCODE exand binary size to 250MB.
        project.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");
        
        File.WriteAllText(projectPath, project.WriteToString());
    }
}
#endif

各OSでビルド

  • 特筆事項はなし、SwitchPlatformしてビルド
  • Androidならapk吐くのでUSBでスマホに送るだけ
  • iOSはXcodeのプロジェクトが吐かれるので、Macに持っていくなりして更にビルド
  • サーバーをEC2環境で動かす編の環境が生きていれば、通信の確認ができるはず!
GitHubで編集を提案

Discussion

ログインするとコメントできます