おれんじりりぃぶろぐ

きっと何者にもなれないエンジニアのブログ

Unityで作ったアプリで端末の電源ボタンを押してもアプリが復活する問題に遭遇した

現象

Unityで開発中のアプリにてAndroidの特定端末でタイトルの現象に遭遇しました。 アプリ起動中に電源ボタンを押してサスペンドさせても数秒後に勝手にロック画面も表示されずアプリが復活してしまうという現象です。 なんと自己主張が強いアプリです。

対処法

BuildSettingsのDevelopment Buildにチェックが入っていたのでOFFにしたところ現象の発生はなくなりました。 全ての端末で起きるわけでもなくAndroidの特定の端末のみで起こるので厄介な問題でした。 (今回、自分が試した端末はAsus Zenfone5でAndroid Nでした) Android ManifestのOrientationとか色々いじりましたが、Unityの余分な仕様というオチでした。

参考

現象は少し異なりますが対処方法は同じでした。

Unityを使って女の子二人を動かすまで

成果物

f:id:orange_lily27:20180801014559g:plain

使用したツール

やったこと

MagicaVoxcelを使って簡単なモデリングをし、blenderでリギングを行いました。さらに、Unityにインポートしてアニメーションをつけるまでを紹介します。

モデリング

MagicaVoxcelを使って頑張ってモデリングをします。 ひととおりモデリングが終わったら右下のobjで書き出しを行います。

f:id:orange_lily27:20180801015548p:plain

リギング

次にblenderを使ってリギングを行います。 こちらで紹介されている素体用のアーマチュアを使わせてもらいました。
アーマチュア、objの順に取り込んでボーンの位置合わせを行います。 右クリックでアーマチュアの頂点を選択することができ頂点移動ができます。 「Remove Doubles」で重複頂点を削除するのも忘れないようにします。
Editモードにすることで左ウィンドウに「Remove Doubles」が出てきます。 f:id:orange_lily27:20180801020420p:plain

Objectモードに再び戻します。 メッシュ -> アーマチュアの順に選択をします。順番が大切です。Shiftを押しながら選択することで複数選択できます。 Ctrl + Pで「Make Parent」->「Armature Deform With Automatic Weights」でメッシュをボーンに関連付けができます。

最後にFbxとしてExportします。

リギングに関してはMixamoという自動で行ってくれる便利ツールがあるのですが、頭が大きすぎるからか髪の毛と腕がくっついてしまって今回は使うことができませんでした。

Unity

さきほど作ったFbxをUnityにD&Dします。

InspectorでAnimationTypeをHumanoidにします。

Configureを押して緑の人間が出てきたら成功です。Musclesで各部位をスライドさせることで動作チェックも行います。これで同じHumanoidTypeのAnimationClipを使い回すことができます。

モデルに色がついていない場合は、MagicaVoxcelのObj出力時に.objと同時にできた.pngを使ってMaterialを作成します。 MaterialのShaderはMobile/diffuseにしてpng画像をセットします。

最後に動かすためにアニメーションを設定していきます。 Unity Chanの3DモデルのAnimation Clipを使いました。

今回はAnimationControllerを使用しないSimpleAnimationを使ってアニメーションをつけました。 こちらの記事を参考にさせてもらいました。

f:id:orange_lily27:20180801014559g:plain

参考

Googleドキュメントにソースコードを綺麗に挿入する

いくつか試しましたが、「Code Block for Google Docs」というアドオンが良かったです。

[アドオン] -> [アドオンを取得] -> 「Code Block for Google Docs」で検索して追加できます。
使い方は、[アドオン] -> [CodeBlocks] -> [Start]から整形することができます。
コードを選択して[Format]を押すと整形されます。

こんな感じで表示されます。 f:id:orange_lily27:20180518203417p:plain

UnityでGCの回数を計測する

GC.CollectionCount()を使ってGCの回数を取得することができます。 GC.CollectionCount(0)はプロセスを起動してからのGC回数を返してくれます。

int startGcCount = GC.CollectionCount(0);

// GCが走りそうな処理

Debug.Log($"GC回数: {GC.CollectionCount(0) - startGcCount}回");