🔖
Unity+MagicOnion4.1.xを試す IL2CPPでスマホ実機ビルド編
チャプター
まえがき
- サーバーを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にタスクを追加
<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のコード生成
メニューから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;
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環境で動かす編の環境が生きていれば、通信の確認ができるはず!
Discussion