UnityでAndroidアプリを作成していたときに遭遇したバグ

はいどーもこんばんはただのツミオです。
本日はUnityのAndroidアプリを作成していたときに遭遇したバグをいくつかご紹介します。

DateTime.Nowが常にUTC時間を表示する

はいまずはこれ。
「Android環境においてDateTime.Nowが常にUTC時間を表示する」バグです。

いやほんと参りましたね。
こちらのコミュニティに情報が上がっています(英語)。
https://forum.unity.com/threads/android-datetime-now-is-wrong.488380/

上記の記事を要約するとこんな感じ。

Net 4.6でビルドするとDateTime.Nowは正しく動かない。
ローカルとUTCタイムは(DateTime.Now と UtcNow)はAndroid7ではいつも同じ値を示す。
なるほど.Net3.5ならうまく動く。
が、.Net3.5でもSystem.Globalization.CultureInfo.CurrentCulture.ClearCachedData(); はダメだった。

というわけで根本的な解決策は「.Net3.5で開発すること」ですw
でも僕は4.6を使いたかったのと、今回は時間もないということで「ロケールがUTCになっていたら、9時間プラスする(日本時間になる)」ことで対処しました。
この対処方法は日本以外ではうまくいかない上に、発生しうる問題点も盛りだくさん(マジでたくさんあります。急ぎでないならオススメしません)です。
なので、時間ができたら「ユーザーにロケールを選ばせる」機能を作ろうかなと思います。
公開するかどうかは謎。

Null参照の例外が発生すると問答無用で落ちる

お次はこれ。
「Null参照の例外が発生すると問答無用で落ちる」バグです。

これも一部のAndroid環境でのみ発生するようです(発生しない機種と発生する機種がありました)。
このバグの一番厄介なところは、Null参照の例外をtry-catchしても強制的に落とされることです。
どうしようもありません。

そこでググると、このコミュニティの記事がヒットしました(英語)。
https://forum.unity.com/threads/android-try-catch-problem.503749/

軽く流し読みした感じ、「Performance reporting Serviceを無効化したら直るよ」とのことなのですが、こんなの僕使ってないんですよねえ……。
いやUnityのこと詳しくないので、知らないうちにこれONになってるのかもしれませんが。
ちゅーかOFFにするとどうなるのかもわかってないので、怖くてOFFにできませんw

次に3.1系のリリースノート(https://unity3d.com/jp/unity/whats-new/unity-2017.3.1)を見たら、以下のような修正項目があがっていました。

IL2CPP: Fixed a C++ compiler bug in the Android r13b NDK that could cause the NullCheck method to be incorrectly removed from the resulting binary. (963785)
Scripting Upgrade: Fixed Android crash when NullReferenceException is raised. (954427)
Scripting Upgrade: Fixed Android crash when script debugger is enabled. (973794)

これで修正されているかも?(誰か確かめてw)。

終わりに

実機でちゃんとテストしないと、よくわからないバグに遭遇して僕のように慌てふためきます。
なるべく細かくビルドして、実機でテストするのがよさそうですね……。

あと「機種依存のバグかな?」と思ったらリリースノートを見たほうがよさげです。
グーグルで検索でもいいですが、あんまり日本の情報はヒットしないので海外コミュニティがいい感じな気がします。

フォローする