だらだら〜個人事業〜

HatenaDiaryから引っ越してきました。Githubもnyakagawanです。

Unity Cloud Build の Win/iOS GUIフロントエンドを作った

あくまで自分用なんですけど作ってみました。

github.com

スクリーンショット

WPF

f:id:nyakagawan:20180129130418p:plain

iOS Simulator

f:id:nyakagawan:20180129130528p:plain

機能

  • ビルド開始
  • ビルドターゲット一括作成
  • ビルドターゲット一括削除
  • Credential情報の取得

なんで作ったか

UnityCloudBuildは便利だけどビルドをパラメトリックに実行できない…。
設定やDefineSymbolが少し違うだけで同じようなビルドターゲットをその組み合わせ分作らないといけない。
これは人力でやることではない。だからプログラムした。
そしてパラメータを指定してビルドを実行できるGUIフロントエンドがほしいと思った。
あとあったら便利そうなのでiOSアプリもつくった。というのは理由の半分でXamarin使ってみたかったのでiOS/WPFなプロジェクトにした。

なにで出来ているか

Xamarinで出来ている。
初めてのXamarinだったのでわけがわからんかった。
UIはXamarinFormsというのをつかった。これはUI(XAML)部分をMultiplatform write onceにできるものらしい。
Xamarin自体はUnityほどMultiplatformにおけるコードの共通化がされておらず、Platform寄りのコードはNativeなAPIC#でラップした単純な感じのものらしい(使ってないので分からない)
ただ、XamarinFormsは今(2018/1/29)はまだWPFを正式にサポートしてない感じで。NugetのNightlyBuildで公開されているExperimentalなXamarin.WPFを使わせてもらった。
当初は「普通にWPFもいけるっしょ」みたいに思っていたので泡を食ったが、情報があってよかった。

ちなみに、はじめはUnityでツールを作ろうとおもっていたけど。
UnityCloudBuildAPIがUnity上で動いてくれなくてXamarinならいけるやろってことでこうなった。

使わせてもらったもの

guitarrapc/UnityCloudbuildApi

github.com

まずUnityCloudBuildAPIをC#からつかうために
https://build-api.cloud.unity3d.com/docs/1.0.0/index.html
この公式APIリファレンスで書かれているSwaggerCodeGeneratorをつかってC#のClientCodeを作ろう!今風にと思ってやってみた。
しかしうまくいかなかった。そもそもCodeGenコマンドが失敗したり、出てきたコードがビルド通らなかったり…。
SwaggerCodeGenはwindowでjarをつかってみたり、macでhomeblewしてみたけどNGだった。
疲れた僕はリンク先の偉大な先人のお方のありがたい御コードを拝借した。すごい、うごくしコンパイルが通る。どうやったんだ…。ありがとうございます。

Xamarin.WPF

qiita.com

こちらの記事を参考にさせていただいた。

Newtonsoft Json.NET for Unity3D

github.com

色々実装していってiOS向けにビルドしてみるとAOT絡みのビルドエラーに出くわした。
System.Reflection.EmitをJson.NETが使っているからで、Json.NETはUnityCloudAPIが使っていた。
これをどうにかするためにAOT対策が施されたJson.NETを使わせてもらった。Unity向けだが…。

使おうと思っていたもの

  • Prism
    • MVVMインフラストラクチャ(ですよね?)で、自分はLivetしか使ったことなかったがXamarinFormsならPrismがええど、という噂を目にしたので使いたかった。でも新しいものだらけでキャパオーバーしたので別の機会に。

所感など

  • Xamarinいいなー。Windows上で開発して隣のMacに接続してビルドして、WindowsのVisualStudio上からデバッガつないでってなんかかっこいいわー。ターンアラウンドタイムも全然OKな範囲だし、これはいいわー。
  • でもUnityCloudBuildAPIが動かないのさえなければUnityで作ってただろうなー。この程度のUIなら一瞬でつくれるしCloudBuildでビルドと配布までワンストップだし。今回は配布にHockeyapp使ったが利用者側のことも考えると若干手間。
  • 多分シンプルなツール程度ならiOSWPFでUIをシングルコード実装できるんだろうけど。ある程度複雑になるとまぁ無理そうだなと思った。これはもう実装がどうっていうかそもそも使いやすくするためには別レイアウトにせざる得ない気がする。そういうことであんまりXamarinForms.WPFは需要ないんかなーと思ったり。しらんけど。
  • トライアンドエラーの繰り返しでプロジェクトがぐちゃぐちゃになったのが原因なのかしらないが、XamarinFormsのXAMLのインテリセンスが変になっていて。変なコード補完が働いてめっちゃ書きにくかった。