West Hill 開発メモ

Unity4.3以降でビルドしたAndroidアプリで上部のStatus Barを隠さない設定で、ソフトキーボードを表示すると以下のように画面全体のサイズが小さくなってしまう現象があります。

この画面が
unity_android_softkey_01
こうなってしまう。
unity_android_softkey_02
Activity全体がリサイズされてしまいます。
AndroidManifest上でwindowSoftInputModeを変更したりしても防げませんでした。

参考:UnityForums Android Manifest Not Working Properly

上記フォーラムでは最後にUnityPlayerActivityをオーバーライドしたActivity内で
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
を呼び出しWindowの設定を変更すれば解決するとなっているのですが、 
前回の「UnityからAndroidのUIスレッドで処理を行う」を使用してUnity側のC#コードから設定してみます。


このコンポーネントを付けたGameObjectを最初のシーンに配置します。
これでキーボードを出しても画面サイズが小さくならなくなりました。
unity_android_softkey_03

このエントリーをはてなブックマークに追加 Clip to Evernote

AndroidJavaClassAndroidJavaObjectを使えば、UnityからActivityやJavaのObjectにアクセス出来るのですが、Androidでは別スレッドからUIを操作することができません。
UI操作を行いたい場合はActivity.runOnUiThreadを使用します。

これをUnityから使いたい場合にはAndroidJavaRunnableを使用して、
指定したメソッドをRunnableとしてUIスレッドに投げます。

リファレンスのコードではコンパイルエラーになってしまいますが、
AndroidJavaRunnableのnew宣言が抜けているだけなので以下のようにすれば使えます。


これならプラグイン作ったりActivityをオーバーライドしないで済むので手軽で便利です。

このエントリーをはてなブックマークに追加 Clip to Evernote

Unity4.5からはコルーチンの停止に使うStopCoroutineメソッドで引数にIEnumratorを指定できるようになりました。
今まではStopAllCoroutinesで全部止めるか、StopCoroutineでメソッド名指定で止めるしか無かったので、便利になりました。
(※ただし後者はStartCoroutineをメソッド名指定で動かした場合に限る)
 
DoWorkCoroutineというコルーチンメソッドがあるとして、
こんな風にIEnumratorの参照を保持して利用します。
// IEnumerator保持
IEnumerator routineWork = DoWorkCoroutine ();

// コルーチン開始
StartCoroutine (routineWork);

// コルーチン停止
StopCoroutine (routineWork);
ただし、これで停止したコルーチンを同じIEnumratorを指定して再スタートさせた場合は
コルーチンの途中から再開してしまうので注意が必要です。
(※既に末尾まで終了している場合には何も起きないようにみえる)

なので、コルーチンを始めから再スタートさせたい場合には以下のようにする必要があります。
// IEnumerator保持
IEnumerator routineWork = DoWorkCoroutine ();

// コルーチン開始
StartCoroutine (routineWork);

// コルーチン停止
StopCoroutine (routineWork);

// コルーチン再スタート
// 同じIEnumeratorを指定すると途中から再開されてしまうので再取得する
routineWork = DoWorkCoroutine ();
StartCoroutine (routineWork);
逆に、IEnumratorの参照を取りなおさなければ
任意のコルーチンを途中で一時停止・途中から再開させる用途で使えます。

参照:MonoBehaviour.StopCoroutine

このエントリーをはてなブックマークに追加 Clip to Evernote

このページのトップヘ