UnityでWebViewを実装してみた

実装環境

UnityでWebViewを実装する

UnityでWebViewを実装するとなるとiOSAndroidのネイティブプラグインを作成しなければならないのだが、正直言ってネイティブプラグインを作るのはかなりの労力を要するので避けたいところ。

ネットで良さげなアセットを探していたところGreeさんから良い感じのソースがGithubに上がっていたのでこれを利用させてもらうことにした。

github.com

使い方は非常に簡単でサンプルプロジェクトの SampleWebView.csの中身をマルっとコピペするだけでUnityでWebViewを実装することができた。

ハマったポイント

iOSはすんなり実装が済んだのだが、AndroidではなぜかWebViewが表示がされない。調べてみるとOnce you built an apkという記述が Readme.mdに書かれてあった。試しに1度Androidをビルドするとbuildに失敗したのだが新しく AndroidManifest.xmlが自動生成されているではないか!?いつもJenkinsビルドでビルドを通しているのでこれは盲点だった。なので AndroidでWebViewを使うときは1度ローカルでビルドしましょうというのが今回の注意点でした。

AssetBundleがなぜかうまくロードされない時

AssetBundleがうまくロードされない時はAssetBundle化するファイルのmetaファイルを見てみましょう。

例えば se_tap.mp3というファイルのmetadataは

fileFormatVersion: 2
guid: 5786e95a631374cccbdec528f4558f2d
timeCreated: 1486886144
licenseType: Free
AudioImporter:
  serializedVersion: 6
  defaultSettings:
    loadType: 0
    sampleRateSetting: 0
    sampleRateOverride: 44100
    compressionFormat: 1
    quality: 1
    conversionMode: 0
  platformSettingOverrides: {}
  forceToMono: 1
  normalize: 1
  preloadAudioData: 1
  loadInBackground: 1
  3D: 1
  userData: 
  assetBundleName: se_tap
  assetBundleVariant: 

のようになっています。

上記は正常なファイルなのですが、時々 assetBundleNameの行が

assetBundleName:  "\bse_tap"

といった感じでアセットバンドル名がおかしくなっていることがあります。

原因はファイルのリネームなど様々な問題が考えられるのですが

解決する手順としては

1.ロードが失敗するファイルを削除

2.Remove Unused Names でアセットバンドル名のキャッシュを消去

https://gyazo.com/7becfb6fea883dc57bb7d0deb35f43ec

3.もう一度ファイルを追加し直しAssetBundle化

上記の手順行うと良いと思います。

UnityにFirebase入れたらJenkinsビルドが失敗を繰り返すようになった

発端

UnityにFirebaseを導入したは良いのだけどJenkinsビルドが通らなくなった。

以下エラーの記述を一部抜き出したもの

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_FIRGoogleAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIRGitHubAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIREmailPasswordAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIRFacebookAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)
  "_OBJC_CLASS_$_FIRApp", referenced from:
      objc-class-ref in libApp.a(app_ios_3c1f2f5540e3edfbae8c7bf918ae5900.o)
  "_OBJC_CLASS_$_FIRAuth", referenced from:
      objc-class-ref in libAuth.a(auth_ios_7d6b9e9ddb5f240ff95f510fddebba51.o)
  "_OBJC_CLASS_$_FIRTwitterAuthProvider", referenced from:
      objc-class-ref in libAuth.a(credential_ios_de0c3e1fa34e9a30835a63e195323a0f.o)

** BUILD FAILED **

どうやら原因はFirebaseのライブラリを参照できないことらしい・・・。

ローカルのビルドは通るのに何かおかしいと思いローカルビルドとJenkinsビルドの生成物の違いを見てみると Podfileが生成されていないことがわかった。

この PodfileがないとFirebaseのAuthやAnalyticsのライブラリがインストールされないのである。

これは困った。。。毎回ローカルビルドでは非常に効率が悪い.

原因

そもそもこのPodファイルはFirebaseをUnityに取り込んだ時に追加される Google.IOSResolverというファイルが Podfileの生成を担っているのだがどうもこの Google.IOSResolverがJenkinsビルドではうまく動作していないらしいということがわかった。

もう少し深く原因を探ってみると Google.IOSResolverを呼び出すのは FirebaseAuthDepsなどのスクリプトなのだが

#elif UNITY_IOS
        UnityEngine.Debug.Log("FirebaseDeps");
        Type iosResolver = Google.VersionHandler.FindClass(
                               "Google.IOSResolver", "Google.IOSResolver");
        if (iosResolver == null)
        {
            return;
        }
        Google.VersionHandler.InvokeStaticMethod(iosResolver, "AddPod", new object[] { "Firebase/Auth" }, new Dictionary<string, object>() { { "version", "3.10+" }, { "minTargetSdk", "7.0" } });
#endif

このように iOSビルドの時のみ呼び出されるものだった。

一応Jenkinsビルドが行われる時はUnity上のスクリプトから Switch Platformをしているのだが恐らく Switch Platformの前にPodfile生成のメソッドが呼ばれているようである。

解決

どうにかこうにか原因を探っているうちにJenkinsのジョブ設定のUnityの項目であらかじめ -buildTargetを設定していなかったことがわかった。

https://gyazo.com/e124b2263921421bae00f1ed6caecea7

//以前
-quit -batchmode -executeMethod "コマンドから呼び出すメソッド名"

//修正後(-targetBuild追加)
-quit -batchmode -buildTarget ios -executeMethod "コマンドから呼び出すメソッド名"

コマンドラインの部分を上記のように修正したらうまくいきました。

この問題で約5日間くらいJenkinsビルドに悩まされていたので解決して本当に良かった(;.:◉;.:◞౪◟;.◉;)

追記[Firebase 3.0.1]

FirebaseSDKのバージョンを3.0.1に上げたら再びビルドが通らなくなった、今回もiOSResolverがうまく動作してないことが原因のようだったのでプロジェクト内の Google.IOSResolverSelect Platform For Platformの項目を見てみると Editorにのみチェックが入っていた。これを iOSにもチェックを追加することできちんとCocoaPodが動作し、必要なライブラリが追加されるようになった。もし同じような問題でJenkinsビルドが通らなくなった人がいたら参考にしてほしい。

https://gyazo.com/3dcaad1af96c35816318e21cc99646ce

【Unity】テキストをアニメーションさせる有用アセット

テキスト1文字1文字をアニメーションさせたい時ってありますよね。 そんな時にオススメのアセットを紹介。

1.TextFx (30💲)

実際に使ってみたけど、非常に簡単にテキストのアニメーションが実装できる。

ただし少し処理が重い。。。

そして Unity5.5にアップデートした瞬間に使えなくなったorz

早くアップデートしてくれー!!

2.Typeface Animator(5💲)

5💲でとってもリーズナブル!

実際に使ってみたけどTextFxよりかは若干利便性に欠けるが、機能としては十分なものを備えている。

何より安いしUnity5.5でもなんなく動きました!

今までTextFxで実装していた部分を全て Typeface Animatorで置き換えることができたので一件落着!

以上でテキスト系のアニメーションのアセット紹介を終わります!

【Android】モジュールのパッケージネームの変更方法

モジュールのパッケージネームをどこで変更変更するのかなーって思って少し詰まったのでメモ

 

f:id:mosmos-com:20161117122241p:plain

モジュールのマニフェストファイルの  `package`のところをRefactor>Renameで一発でした!!

【Unity】Androidのバックボタンの対応

最近詰まったAndroidのバックボタンボタン対応

自分の持っている端末(Galaxy s4)にはバックボタンが付いていなかったので

指摘されて気づいたので実装してみた。

動作はGenymotionのNexus5で確認したのでおそらく大丈夫だと思けど

もし間違ってたら指摘して頂きたく思います。

UnityAndroidのEscapeボタンが押された時に確認アラートを表示した上でアプリを終了 ...