Unityで作成したゲームをandroidで実行したところ
ある操作をしたときだけバグが起きることを確認しました。
具体的にはプレイヤーの移動をUpdate関数内で毎フレーム処理していたのですが
①自作したPAUSEボタンを押下(Time.TimeScale = 0にしてゲームオブジェクトの移動を停止させる)
↓
②PAUSEメニューの再開ボタン押下後(Time.TimeScale = 1にしてゲームオブジェクトの移動を再開させる)
①②の操作をしたときだけ
プレイヤーの位置が意図していない場所に移動してしまいました。
しかもこのバグ、PC上では起きずスマホ上でしか再現しないんですよね…
なぜこうなるのかが検討もつかない状況が続いたのですが
先日やっとバグの箇所を特定できました。
そこでandroid実機上でC#Scriptをデバッグする方法の解説と
Update処理内のデバッグ方法の一例を解説していこうと思います。
android実機上でC#Scriptをデバッグする方法
まずAndroid実機上でC#Scriptをデバッグする方法について記載していきます。
私の環境はVisual Studioを使用しているので
Visual Studio上でのデバッグ方法を記載します。
大きく分けると以下3つの作業が必要です。
1.Android上での作業
2.Unity上での作業
3.Visual Studio上での作業
一つ一つの作業自体は非常に簡単なので
意味を分かっていれば2,3分ぐらいでチャチャっと終わります。
ではそれぞれの作業をみていきましょう。
1.Android上での作業
まずはAndroid上での作業です。
といってもやることは一つだけで
USBデバッグをONにする必要があります。
設定から開発者モードに変更し、開発者メニューの
USBデバッグをONにします。
これをしないとそもそも実機上でデバッグすることが出来ません。
2.Unity上での作業
こちらも非常にシンプルでビルド時の設定でデバッグ実行を許可するようにします。
まず実機でデバッグしたいAndroidとPCをUSB接続します。
デバッグモードをONにします。
Scripts Only BuildをONにします。
ビルドします。
これで作業完了です。

3.Visual Studio上での作業
最後にVisual Studio上での作業についてです。
まずUnityのビルドでBuild And Runをクリックします。
これでビルドが開始され、ビルドが完了すると自動的にUSB経由で
Androidにapk(aab)ファイルがインストールされます。
そしてAndroid上で対象のゲームが勝手に実行されます。
ここまでが前提条件です。
これだけだとVisual Studio上でブレークポイントを設定しても
残念ながらそこで処理は止まってくれません。
なのでVisual Studioとデバッグ対象のAndroidを紐付ける必要があります。
それが「Unityデバッガーのアタッチ」です。
Visual Studioのデバッグをクリック→Unity デバッガーのアタッチをクリックします。

すると小ウィンドウが表示されるのでデバッグ対象のAndroidを選択しましょう。
これで設定が完了しました。
どこか処理にブレークポイントを置いてみましょう。
処理が流れた時にちゃんとデバッグできるようになっているはずです。
Update処理内のデバッグ方法の一例について
それでは今回のバグの特定方法について
難しかった点とその解決方法を記述していきます。
まず難しかった点はどうもUpdate関数内でバグが起きているようだということです。
ある特定の操作をしたときだけ起きるバグなのですが
Update関数内での処理なので当然毎フレーム呼び出されます。
そのためブレークポイントを置いた状態でゲームを起動してしまうと
ゲームスタートした瞬間からブレークポイントで処理が止まってしまうんです。
そして毎フレーム処理が止まってしまいます。
これではいくら時間があっても足りません…
ではどうすればよいのか?です。
ある特定の操作をした際にbool型のフラグをTrueにしてあげるんです。
bool flg;
Start(){
flg = False;
}
Update(){
if(flg){
Debug.Log("ChangeflgValue()実行後のUpdateのみ処理される");
flg = False;
}
}
void ChangeflgValue(){
flg = True;
}
これでUIのボタンのOnClick()で
ボタンをクリックした際にChangeflgValue()が
実行されるようにします。
最後にUpdateのif文の中にブレークポイントを置けばOKです。
これでボタンをクリックした時の一回だけUpdateがデバッグされます。
思いつく人はパッと思いつくんでしょうが…
最初は全然思いつきませんでした。
想定はしていたのですが、思いがけないところで
エラーになることがありますね。
正直今回のエラーについては原因特定まで4日ほど掛かって
しまいました。
途中、特定不可能だろって思いながら調査していたのですが
もっと複雑なゲーム作っている方々は多分同じようなバグを
たくさん調査・修正しているはずだと思ってやる気を奮い立たせ
ながら解決していきました。
どんな仕事も小さな経験を蓄積していくことが
大切なんですよね、多分。
「塵も積もれば山となる」ですね。