fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unityバグ
このページの記事一覧

【Unity】Unity2020 でプラットフォーム切り替えをすると、Run In Background が勝手にオフになってしまう  


 Unity のアップグレードで問題が出るのはいつものこと。Unity2020 からは ~.3.x がLTSとなり、2桁マイナーバージョンだから、もうそろそろバグFixされてるかと思ったけど、変なバグあるね。

 VRM Live Viewer は Windows(x64) と Android の2つのプラットフォームを出しているので、とりあえずテストでビルドしてたら、プラットフォーム切り替えるたびに「Run In Background」(バックグランドでもアプリが動作するオプション) が、なぜか勝手にオフになってることに気がついた。

 VRM Live Viewer は Windows ではファイルのドラッグ&ドロップに対応してるからね。Run In Background で動作しないと、エクスプローラにフォーカスが当たるたびにアプリが止まってしまう(ドロップ認識できなくなる)。

 とりあえず、バグレポとして Unity公式に送っておいたけど、仕様変更だったらちょっと困るね。
→ Unity公式から返信来ました。いずれ修正されるようです。

 なので、プラットフォーム切り替え・ビルド開始のコールバックに、常に Run In Background をオンにするスクリプトを入れてみたら、一応上手く行った。

 まぁ、そのうち修正されるかもだが、毎回設定し直すのは面倒なので、一時しのぎではあるが、そのスクリプトを掲載しておこう。

(※) Unity 2020.3.19f1 / Windows10(x64) で確認

●プラットフォーム切り替え・ビルド開始時に Run In Background を強制的にオンにするスクリプト
using UnityEngine;
using UnityEditor;
using UnityEditor.Build;

//※Editor フォルダに配置
public class EditorPlatformSetting : IActiveBuildTargetChanged, IPreprocessBuild //※クラス名は任意
{
public int callbackOrder => 0;

//ビルドターゲットを変更したときのコールバックハンドラ
public void OnActiveBuildTargetChanged(BuildTarget previousTarget, BuildTarget newTarget)
{
Debug.Log("BuildTarget is " + newTarget);
ForceRunInBackgroudIsTrueIfNeeded(newTarget);
}

//ビルド開始するときのコールバックハンドラ
public void OnPreprocessBuild(BuildTarget target, string path)
{
ForceRunInBackgroudIsTrueIfNeeded(target);
}

//プラットフォームにより、強制的に RunInBackgroud をオンにする
void ForceRunInBackgroudIsTrueIfNeeded(BuildTarget target)
{
switch (target)
{
case BuildTarget.StandaloneWindows:
case BuildTarget.StandaloneWindows64:
//※必要なら、プラットフォームをここに追加する
Debug.Log("Force RunInBackgroud to True");
Application.runInBackground = true;
break;

case BuildTarget.Android:
//※Android では無視される
break;
}
}
}

(参考) 【Unity】エディタ拡張で使用できるコールバックを40個まとめて紹介
ビルドターゲットが変更された時
ビルド前とビルド後







(関連記事)
【Unity】Unity2020 にアップグレードしたら package cache (PackageManager) のエラーが色々出る…
【Unity】Unity2019以降で新規作成したアセットは、Unity2018以前にインポートすると壊れる?
【Unity】EventTrigger のコールバック引数変わった?
【Unity】【Android】Unity2019 へのアップグレードの問題点 メモ
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityバグ 
tb: 0   cm: --

【Unity】【C#】InputSystem で Android のバックキーの isPressed がなぜか一定時間で false になる?  


 InputSystem も Verified (正式版) となり、(旧)InputManager との混在も可能でもあるが、いずれ InputSystem の方法を中心として使いたいので調査中。

 Android ではあまりハードウェアキーボードの概念は無いが(オプションで付けるのは別として)、バックキーは (旧)InputManager 時代から、Input.GetKeyDown(KeyCode.Escape) で取得できる。

 InputSystem でも Keyboard.current[Key.Escape] でも取得できたので、色々実験していたら、少し Input とは違う挙動を発見した。バグなのか仕様なのかわからないので(一応 Unity公式にバグレポートとして送っておいた → 再現できたので、後のバージョンで対応するとのこと)、同じ問題に出くわす人のために、とりあえず記録だけしておこう。

(※) Unity 2019.4.12f1 / InputSystem 1.0.0 / Windows10(x64) で確認



 問題というのはタイトルにもおおよそ書いてあるが、具体的には「Android でバックキーの長押しを試していたら、一定時間で勝手に isPressed が false になってしまい、挙動が変わってしまった」というものだった。

 実はこの「バックキーの長押し判定」というのは、私が配布しているプラグインのデモにも使われているのだが、それを InputSystem に書き換えて試していたら、上手く動かなかった事で見つけた。

 少なくとも Input.GetKeyDown(KeyCode.Escape) では長く押しても判定できたのだが、InputSystem の場合、約1秒前後、バックキーを押していると、なぜか Keyboard.current[Key.Escape] は false になってしまうようだ(※エディタや Standalone ではならない。Android ランタイムのみ)

 とりあえず、試した簡単な実験用コードを載せておこう。

 なんてことはない、ただ「バックキーを押す→継続→離す」といった動作をログに出しているだけだ。実際には Android の実機ではログが見えないので、プラグインに入っている XDebug.Log を使っている。

●簡単な実験用コード
using System;
using UnityEngine;

#if ENABLE_INPUT_SYSTEM
using UnityEngine.InputSystem;
#endif

public class AndroidBackKeyTest : MonoBehaviour
{

#if ENABLE_INPUT_SYSTEM

public Key targetKey = Key.Escape;
public KeyCode targetKeyCode = KeyCode.Escape;

// Use this for initialization
private void Start()
{
Debug.Log($"Platform : {Application.platform}");
Debug.Log($"SystemInfo.operatingSystem : {SystemInfo.operatingSystem}");
}

bool keyPressing;
bool keyCodePressing;
float keyPassedTime;
float keyCodePassedTime;

// Update is called once per frame
private void Update()
{
if (Keyboard.current[targetKey].wasPressedThisFrame)
{
keyPressing = true;
keyPassedTime = Time.time;
Debug.Log($"<color=cyan>[frame:{Time.frameCount}][passed:0.000] [{targetKey}].wasPressedThisFrame</color>");
}

if (Input.GetKeyDown(targetKeyCode))
{
keyCodePressing = true;
keyCodePassedTime = Time.time;
Debug.Log($"[<color=cyan>frame:{Time.frameCount}][passed:0.000] GetKeyDown({targetKeyCode})</color>");
}

if (keyPressing)
{
if (Keyboard.current[targetKey].isPressed)
{
Debug.Log($"[frame:{Time.frameCount}][passed:{(Time.time - keyPassedTime):F3}] [{targetKey}].isPressed");
}

if (Keyboard.current[targetKey].wasReleasedThisFrame)
{
Debug.Log($"<color=magenta>[frame:{Time.frameCount}][passed:{(Time.time - keyPassedTime):F3}] [{targetKey}].wasPressedThisFrame</color>");
keyPressing = false;
}
}

if (keyCodePressing)
{
if (Input.GetKey(targetKeyCode))
{
Debug.Log($"<color=#999999>[frame:{Time.frameCount}][passed:{(Time.time - keyCodePassedTime):F3}] GetKey({targetKeyCode})</color>");
}

if (Input.GetKeyUp(targetKeyCode))
{
Debug.Log($"<color=magenta>[frame:{Time.frameCount}][passed:{(Time.time - keyCodePassedTime):F3}] GetKeyUp({targetKeyCode})</color>");
keyCodePressing = false;
}
}
}

#endif

}

●短い間だけバックキーを押したとき
●1秒以上押したとき

 スクショでは、「短い間だけバックキーを押したとき」と「1秒以上押したとき」のログの状態をキャプチャしている。これを見ると、通常なら、"Input.GetKey(KeyCode)" と "Keyboard.current[Key].isPressed" がペアで出ているのが正しいのだが、なぜか1秒前後以降で "Keyboard.current[Key].isPressed" の方が出てこないことがわかる(「指を離す」操作は出ている[マゼンタの色])。

 ただし、この現象はエディタや Standalone でビルドした場合は出ない。正常にペアでログは表示される。

 ちなみに、isPressed を使わないで、継続も判定するなら、以下のような条件分けすれば、事足りる(普通の機器なら、キーはユニークなので、押したときにフラグを上げて、離したときフラグを下げれば、それ以外でフラグがtrueのとき、継続となる)。

bool keyPressing;

private void Update()
{
if (Keyboard.current[targetKey].wasPressedThisFrame)
{
keyPressing = true;
//押したときの処理
}

if (keyPressing)
{
if (Keyboard.current[targetKey].wasReleasedThisFrame)
{
//離したときの処理
keyPressing = false;
}
else
{
//継続中の処理
}
}
}

 ただ、以前の記事に『日本語変換キーや CapsLock キーを使うと(単体で CapsLock を押すとおかしくなる)、Keyboard.current.anyKey が利かなくなることがある』と書いたが、Unity公式からは「現象を確認できない」と返信が来ている。もしかしたら、私は「Windows 日本語106キーボード」だが、Unityの中の人は「Mac 英語104キーボード」など、ハードウェアで結果の違いがあるのかも知れない。なので、Android も Galaxy と Xperia で違う、なんて可能性もある(掲載時点: InputSystem 1.0.0)。

 ググって過去記事を見ていても(Preview時代)、日本語機能が使えない、みたいな話は出てくるしね。まだ InputSystem も初期バージョンは問題があるかも知れない。

 ただ幸いなことに、今の所、(旧)InputManager と InputSystem は共存できるので(Edit>Player Settings>Other Settings>Active Input Handling で Both を選択すれば、同時に使える)、しばらくは安定してない関数(私の見たところだと、Keyboard.current.anyKey などは、日本語入力や CapsLock など、入力方法を変更すると、機能が無効になったりすることがある ← ただし使っているハードウェアによるかも?)は (旧)Input を使った方が良いだろう。マウスホイールの戻値の単位が違うことも確認してるし、Input は静的なメソッドなので、そのまま使えていたが、InputSystm は 各 class で定義されているので、null チェックしないと、脱着されたときにヌルポが出るかも知れない

 細かい挙動が違う可能性もあるので、一気に InputSystem に移行すると、痛い目にあう気がする。しばらくは色々な機器で試してから導入・移行を検討した方が良いかも知れない(一部の人だけ使えなくなる、なんてトラブルが発生する恐れがある)。



 マニュアルを見てると、「No corresponding API yet.」(まだ対応するものがない)というのがいくつもあるので、全て新旧一致できるわけではないようだが、よく使われる機能なら完全互換でいけそうなものも多いね。

 ただ、今まで使っていた (旧)InputManager のコード(※主に Input) は全て書き換えないとならないので、大変な労力がいるのが難点。なので、しばらくは一部機能だけ使う感じになるだろう。

 いずれ、スワイプ, ピンチ, 長押しなどのライブラリも InputSystem に対応しようと思っているが、ラッパー関数でも作らないと、旧新互換で作るのは骨が折れるね(笑)。



スワイプ, ピンチ, 長押しなども同梱されている多機能 Android プラグイン







(関連記事)
【Unity】【C#】InputSystem.Key をリアルタイムで調べる / Windows 日本語キーボードでの Key 一覧
【Unity】【C#】InputSystem の Keyboard クラスと (旧)Input.GetKey の対応
【Unity】【C#】(旧)KeyCode と InputSystem.Key の対応
【Unity】【C#】InputSystem の Mouse クラスと(旧)Input.GetMouseButton の対応
【Unity】【C#】InputSystem でマウスのホイール(scroll)取得と (旧)Input との対応
【Unity】【C#】InputSystem.TouchPhase の IsActive(), IsEndedOrCanceled() [拡張メソッド] の具体値
【Unity】【C#】InputSystem の displayName や control path から Key (キーコード) を取得(変換)する


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityバグ  InputSystem 
tb: 0   cm: --

【Unity】EventTrigger のコールバック引数変わった?  


 先に結論を述べておくと、どうやらバグだったらしい。

 Unity2018.4.10f1 を使っているとき、ふとアタッチしてある EventTrigger のコールバックが "<Missing~ >" になっていて、原因がわからなかったのだが、Unity2018.4.11f1 にアップデートしたら直った。

[追記]
Unity2019 でもバージョンによってはこのバグが出ます。

(※) Unity 2018.4.8f1 - 2018.4.11f1 / Windows10(x64) で確認

 具体的に言うと、バージョンによって以下のように、コールバック引数の表示が違う。
 
●Unity2018.4.8f1 以前(引数が BaseEventData)


●Unity2018.4.9f1 ~ 4.10f1(引数が無い?!)


●Unity2018.4.11f1(引数が BaseEventData)



 Unity2018.4.11f1 の Release Note を見てみたが、明示的に EventTrigger とは書いてないので、

・UI: Fixed the UnityEvent property drawer showing UnityEvents in private properties correctly. (1178687, 1186175)

の関連の気がする。

 まぁ、このバグがあるとインスペクタから Dyanamic な引数でメソッドを登録できないので、早めに Unity2018.4.11f1 以降にアップデートした方が良いだろう。





(関連記事)
【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityバグ 
tb: 0   cm: --

【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない  


 ちょっと試しに Unity 2019.2.0f1 で Android ビルドしてみようと思ったら、以下のエラーが出た。

UnityException: Package Name has not been set up correctly
Please set the Package Name in the Player Settings. The value must follow the convention 'com.YourCompanyName.YourProductName' and can contain alphanumeric characters and underscore.
Each segment must not start with a numeric character or underscore.
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

 google翻訳にかけると以下のようになる。

UnityException:パッケージ名が正しく設定されていません
プレイヤー設定でパッケージ名を設定してください。 値は「com.YourCompanyName.YourProductName」の規則に従う必要があり、英数字とアンダースコアを含めることができます。
各セグメントは、数字またはアンダースコアで始まってはいけません。

 しかし、なぜかアンダーバー[アンダースコア]("_")を入力しても、[Enter] で確定しようとすると消えてしまう。どうやらバグのようだ。入力のバリデーションでカットされてしまってる気がする。

 既にリリースしているアプリで、アンダーバーを含むパッケージ名を持っているアプリは少し困るね。削除されてしまうと、端末では違うアプリとして認識されてしまう。

 まぁ、初期バージョンでは、不具合によく出くわすのは仕方ないけどね。だが、Android ではパッケージ名は重要な情報なので、バグFixされるまでは、しばらく Unity 2019.2 にはアップグレードしない方が良いかも知れない(※他のプラットフォームも Bundle Identifer を使うものは同じ)。



[8/11 追記]
 Unity公式のバグレポートに出しておいたら、確認(バグ再現)できたので、今後のバージョンで修正されるという旨の返信メールが来ました。いずれ修正されるでしょう。






(関連記事)
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityバグ 
tb: 0   cm: --

【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある  


 原因は不明なのだが、Unity2018.3.1 以前のプロジェクトを Unity2018.3.2 にアップグレードしたら、見た目がガタガタになった…。えっ?何これ…?


●髪など揺れものがガタガタになってる…

(※) Unity 2018.3.2f1 / Windows10(x64) で確認

 一応 Git で管理してたので、以前のバージョンに戻って調べてみたら、どうやら Quarity Settings(Edit>Project Settings...>Quarity)のデフォルトが(緑色のチェックマーク)、なぜか全て「Very Low」になっていた…。


(左) Unity2018.3.1 のデフォルト / (右) Unity2018.3.2 へのアップグレード変換失敗?



 とりあえず、デフォルトを以前の状態に戻して(手動でやるなら、下の逆三角アイコンを押して、各プラットフォームの Quarity を選択する)、ビルドしてみたら、元に戻った。


●髪がサラサラになった


 アップグレード変換失敗を失敗したのか、何らかでデータが飛んでしまったのかわからないが、設定を戻せば直るようだ。

 ちなみに、新規プロジェクトでは、以前と同じデフォルト設定だった。他のプロジェクトでアップグレードしてみたけど、同じように「Very Low」になってしまうものがあった。PC は起動時にクオリティ選べるが(ダイアログのプルダウンもデフォで「Very Low」になる)、スマホではスペックにより自動となるので、自分で選べないので困る。う~ん、これは Unity2018.3.2 特有のバグっぽいな…。





(関連記事)
【Android】【Java】パーミッションの付与(許可)のチェックと要求をする
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】AssetStore版 FantomPlugin のセットアップ
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る
【Unity】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityバグ  VRM  VRoid 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop