FC2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »Unityトラブルシューティング
このページの記事一覧

【Unity】タイトルバーの「PREVIEW PACKAGES IN USE」を消す  


 Unity2018 から Unity2019 にアップグレードする際に、いくつかの問題があってなかなか移行できなかったのだが、やっと目星が付いたので、そのままプロジェクトをアップグレードしたら、タイトルバーに「PREVIEW PACKAGES IN USE」が常に出ている…。

 もちろん、自分で Preview パッケージをインストールしたならわかるが、実はせいぜい「Text Mesh Pro」ぐらいしか使ってなく、しかも Unity2018 のメニューから自動で設定されているものを使っていたので、特にバージョンは気にしてない(通常、アップグレードで自動で更新される)。

 その上、PackageManager 上で見ても「-preview~」となっているものが無い、そんな状態。

 要するにアップグレードした際に古いものが残っているらしい。しかし明示的にインストしたわけでないので、手動で削除はちと怖い。

 というわけでいつものようにググってたら、また英文記事にひっかかった。まぁ、見ればわかる程度なので、翻訳の必要はないが、同じ様にググる人はいると思うので、いつものように備忘録として残しておく。

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

(参考)
What is "PREVIEW PACKAGES IN USE"

 やり方としては、

 メニューから
Window>Package Manager」を開いて、

 上部のプルダウンメニュー

Advanced>Reset Packages to defaults

 すればOK。

 注意点としては、自分でパッケージをカスタマイズしている場合は消えてしまう可能性大なので、気を付けた方が良いかも。


 「manifest.json」の差分を見てみると、いくつかパッケージが消えてるみたい。Unity 自体も今後はパッケージでコンポーネントを供給するようになって来るみたいだから、たまにこの作業は必要になるかもね。同じパッケージの利用なら自動アップグレードされるが、他のパッケージに統合されたり、Unity ビルトインに仕様変更されたりと、次のバージョンと比較できなくなったら、そのまま残ってしまうことがあるっぽい。


 今後は github からも直接 PackageManager でインストもできるようになるみたいだし、毎回 AssetStore にバージョン確認しなくて済むのは良いんだけどね。全自動というわけにはいかないか…(笑)。





(関連記事)
【Unity】【Android】Unity2019 へのアップグレードの問題点 メモ
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【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
【Unity】EventTrigger のコールバック引数変わった?


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



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityリファレンス 
tb: 0   cm: --

【Unity】UI のフォーカスを外すコードと「Attempting to select while already selecting an object.」  


 最近まで気が付かなかったのだが、Unity の UI を使っていると、例えばマウスでボタンをクリックした後に、キーボードの [Enter] キーを押すとそのままフォーカスが残っていて、無駄に連打されてしまうことがある。

 そこでフォーカスを外す方法を調べたら「EventSystem.current.SetSelectedGameObject(null) を使うと良い」とあったので使ってみたのだが(※interactable を一旦 false にする手もあるが、元に戻す必要がある)、ごく稀にタイミングによっては以下のエラーが出ることがある。

Attempting to select while already selecting an object.
UnityEngine.EventSystems.EventSystem:SetSelectedGameObject(GameObject)
・・・(中略)・・・
UnityEngine.EventSystems.EventSystem:Update()

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

 最初の1行(Attempting to select while already selecting an object.)を google翻訳にかけると…

既にオブジェクトを選択しているときに選択しようとしています。

 いまいち意味がわからなかったので「Attempting to select while already selecting an object.」でググってみると、以下の記事が出てきた。

選択中扱いとするゲームオブジェクトの管理
Event System SetSelectedGameObject Error, but code still runs fine.
Unity UI 4.6 inputfield bug or behavoir?

 ああ、なるほど「現在選択中のオブジェクトと EventSystem.SetSelectedGameObject」 の引数のオブジェクトと比較して、同じだったらエラー出してる」んだね、と理解できた。

 また、フォーラムでは「EventSystem.alreadySelecting」(EventSystem が SetSelectedGameObject に存在する場合は true を返す)を使うと良い、みたいなことが書かれてあったので、試してみたのだが、「フォーカスを外す」ときの引数に null を渡す場合、やはりたまにエラーが出ることがある。まぁ、Debug.LogError なら実害は無いのだが、なんとなく気持ち悪いので、他の方法がないかと試してみたら、以下のコードで上手くいった。

//現在アクティブとみなされる GameObject が null でないとき
if (EventSystem.current.currentSelectedGameObject != null)
{
EventSystem.current.SetSelectedGameObject(null); //フォーカスを外す
}

EventSystem.currentSelectedGameObject

 まぁ、使っているコードが EventSystem の static なメソッドのみなので、static なクラスに関数を作っても良いと思う。地味な挙動だが、かえってサンプルコードみたいのが出て来なかったので、備忘録として残しておく。





(関連記事)
【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
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】EventTrigger のコールバック引数変わった?


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  Unityトラブルシューティング  uGUI 
tb: 0   cm: --

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


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

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

(※) 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】インスペクタの値を保持したまま変数をリネームする  


 最近は色々なオープンソースを利用しているのだが、時折アップデートしたらプロジェクトが破壊されることもある。その1つがインスペクタの参照だろうか?

 残念ながら、インスペクタに設定されていたフィールド名を変えると、参照が外れることはよくあることだ。これが大量にあったら・・・まぁ、まともに動かなくなることは想像できるだろう(笑)。

 これは FormerlySerializedAs というものを使えば、回避できるのだが、微妙に凡例が長かったり、必要なものが欠けてたりと、ちょっとわかりずらいと思ったので、もっと簡単な例をメモ代わりに書いておこうと思った。

FormerlySerializedAsAttribute(公式マニュアル)

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



■簡単な手順

 例として、ボタンの参照しているフィールドを

[SerializeField] private Button hogeButton;
 ↓
[SerializeField] private Button _hogeButton;


のように変更したいとする。インスペクタの表示名は変わらないが(hogeButton, _hogeButton, m_hogeButton などはコード内では別物だが、インスペクタでの表示は同じになる)、普通にリネームすると、これまで設定していたボタンへの参照が外れる。これをそのまま保持してリネームしたいという感じだ。

1.「using UnityEngine.Serialization;」をファイルの先頭に追加する。

2.[FormerlySerializedAs] の属性を加え、現在のフィールド名(変更前の名前)を入れる。

using UnityEngine.Serialization;

public class Example : MonoBehaviour
{
[FormerlySerializedAs("hogeButton")]
[SerializeField] private Button hogeButton;
}


3.フィールド名をリネーム(リファクタリング)して、一旦、シーンを保存する。また、プレファブ化してるものは個々に保存[Override]しておかないと参照が外れることがある(※要エディタでプレイ前に保存)。

using UnityEngine.Serialization;

public class Example : MonoBehaviour
{
[FormerlySerializedAs("hogeButton")]
[SerializeField] private Button _hogeButton;
}


4.インスペクタで値が保持されているのを確認できたら、FormerlySerializedAs 属性や using は削除しても良い(※複数から参照しているときは注意)。

using UnityEngine.Serialization;

public class Example : MonoBehaviour
{
[SerializeField] private Button _hogeButton;
}


 まぁ、それでも大量にあったら大変だけどね。できればリリース後は、public なものや過去のリソースに影響を与える変更は、極力控えて貰いたいなぁ・・・(バグとかクリティカルなものならともかく・・・ただの命名規則の変更で無駄に時間とられるのは勘弁・・・)。|||orz


(参考)
FormerlySerializedAsAttribute(公式マニュアル)
PrefabやSceneのSerializeされた変数の値を保持したままリネームする
FormerlySerializedAs(テラシュールブログ)






(関連記事)
【Unity】【C#】インスペクタの表示項目を動的に変更する
【C#】【Unity】enum 型と string, int 型の相互変換など
【Unity】【C#】インスペクタでの UnityEvent のコールバック登録の有無を調べる


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  Unityリファレンス  エディタ拡張 
tb: 0   cm: --

【Unity】【Android】Unity2019 へのアップグレードの問題点 メモ  


 Unity2019.2.0 も出たし、そろそろ VRM Live Viewer も Unity2019 にアップグレードしたいのだが、割と大きな問題点があるなぁ…。いずれは妥協しなくてはならないかもだが、しばらくは様子見と調査が必要そうなのでメモ。



 以下、問題点など

(※) Unity 2019.1.13f1, 2019.2.0f1 / Windows10(x64) / Android 8.0 で確認


Unity2019 では Standard Shader のロジックが一部変わったらしい。Standard Shader 依存のカスタムシェーダーなどを使っている場合は、見た目が変わってしまう場合があるので注意。
→ 今後はこれがデフォとなるっぽい。シェーダー等は修正する必要があるだろう。

【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ



Android 実機で音の感じが以前と違う。具体的には Unity2018以前は端末のエフェクト(例えばベースがシステムの設定でブーストされてたり)が入ってる感じだったが、Unity2019以降はエフェクトのかかってない状態の感じになっている。
 新しいオーディオレンダリング/ミキシングエンジンとは直接関係ないかもだが、内部システムに変更があったのかも。Windows上では変わらない。
→ 今後はこれがデフォとなるっぽい。Unity2018 と Unity2019 で同じものをビルドして色々試してみたのだが、どうやら Unity2018 の場合、端末に付属しているアプリ(例えば GalaxyMusic など)でイコライザを編集した場合、Unity2018 でビルドしたアプリでも反映される(Unity製以外の他のアプリも同じ。自分の好きな音質にできる)。しかし Unity2019 では反映されず、ビルドしたアプリに依存するっぽい(通常はフラットな音質のため、例えば普段端末でベースをブーストして音楽聴いている場合、Unity2019 での音楽は低音のないフラットな音に聞こえる)。まぁ、アプリによっては AudioMixer などのイコライザエフェクトを使って音質を好みにできる機能を付けても良いかも知れない[負荷はともかく])。

新しいオーディオレンダリング/ミキシングエンジン (Unity2019.1)



Android でサウンド再生中(特に音楽)に、例えば何らかのWebダウンロードなど、処理に負荷がかかることをすると、ブツブツとノイズが入る(音切れする)ことがある。もしかして Unity本体の負荷に対して、サウンドエンジンが影響を受ける構造になってしまったのか(Unity2018以前は割とサウンド関連は独立したシステムとなっていたため、Unity自体がカクついても音が途切れることは無かった)?
(※) とりあえずこれは、Unity公式にバグレポートとして送っておいた。
→ いつの間にか直っていた(バージョンはわからないが、少なくとも Unity2019.2.14f1 ではノイズが入らなくなっている)。

新しいオーディオレンダリング/ミキシングエンジン (Unity2019.1)



Unity2019.2.0 において、外部APIなどでの連携が上手く行かなくなったものがある。Unity2019.3ではネイティブの構造が変わるらしいが、既に一部のネイティブの構造が変わっていて、外部からの Intent などを上手く受け取れなくなった可能性がある(外部からのバラメータが一部無視されている?)。外部APIとの連携機能を使うアプリなどは注意。2019.3 になったらネイティブ関連の不具合は色々出てきそう。
→ いつの間にか直っていた(バージョンはわからないが、少なくとも Unity2019.2.14f1 ではOK)。

【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい
Intent



Unity2019.2.0 ではなぜか PlayerSettings で Bundle Identifer にアンダーバー(アンダースコア "_")が入力できない(バリデーションで消える?)。既にリリースしているアプリでは Bundle Identifer が変わってしまうと、別のアプリとして認識されてしまうので注意。
(※) とりあえずこれは、Unity公式にバグレポートとして送っておいた。
[8/11 追記] Unity公式から、確認(バグ再現)できたので、今後のバージョンで修正されるという旨の返信メールが来ました。いずれ修正されるでしょう。

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



 シェーダとサウンド関連、外部APIでのアプリ連携機能は結構問題大きいので、しばらくはまた据え置きかな…。まぁ、サウンド関連は Unity2019 の状態がこれからのデフォになりそうな気がするので、ある程度ブツブツ音切れ状態が改善されたら(→ 少なくとも Unity2019.2.14f1 では直っていることを確認)、諦めるしかないかもだけどね。

 とりあえず今使っている Unity2018 LTS は2年間は持つから、2020~21年くらいまでには、何らかの手段・代替案が出てくれば良いが…。とは言え、いつもながらデフォの仕様/状態が変わるのはなかなかキツいものがあるな…。なるべくこれまでのものはそのままに、自分で選択して新しい機能を使えるように設計して欲しいもんだね…(※私もその辺りは気をつけよう…)。|||orz






(関連記事)
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい
【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

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


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR