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

【Unity】A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details. と出たら…  


 久しぶりに UniVRM を 0.108 にアップデートしてみたら、以下のエラーが出るようになった。

A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces to get more details.

 しかし、エラーメッセージはそれだけで、何も情報が出てこない。どうやらメモリーリークしてるようだが、以前は出てなかったので恐らく実装が変わったのだろう。翻訳すると「フルスタックトレースを有効にして詳細を得よ」と書いてあるが、それどこにあるの?ってググってみた。そしたら以下のページが出てきた。

(参考) A Native Collection has not been disposed, Enable Full Stack?

 どうやら Jobs をパッケージマネージャでインストールすれば、メニューに出てくるようだ。やってみたら、詳細のエラーログが出るようになったので、Unity 初心者でもわかるように詳しく手順を書いておこう。

(※) Unity 2020.3.34f1 / Windows11(x64) で確認

1.「Edit>Project Settings...」から「Package Manager」を表示し、「Enable Preview Packages」「Show Dependencies」のチェックをオンにする(※現時点では Jobs が Preview のため。Stable になったら、この手順は必要無くなると思う)。



2.「Window>Package Manager...」を開き、「Unity Registry」にして「Jobs」をインストールする。



3. インストールが終わったら(結構時間かかる)、上部のメニューから「Jobs>Leak Detection>Full Stack Traces (Expensive)」をオンにする(※「Expensive」とあるので、負荷が高くなる=動作が重くなる ので注意)。



 これでエラー時に詳細なスタックトレースが Console に出るようになる。




 私が改修していた UniVRM 0.108 では GltfData がメモリーリークしていたらしい(クラス内部で NativeArray を使ってるっぽいので、Dispose する必要があるのだろう)。using で囲めばエラーは出なくなった。参考ページでは WWW を using で囲ってるね。その手のオブジェクトを疑ってみれば良いだろう。

(参考) A Native Collection has not been disposed, Enable Full Stack?







(関連記事)
【Unity】SymGetSymFromAddr64, GetLastError: '無効なアドレスにアクセスしようとしています。' と出たら…
【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】【C#】モバイルビルド中の警告:Game scripts or other custom code contains OnMouse_ event handlers.~ を消す
【Unity】InitializeUnityExtensions: Must have a valid path for the plugin [XX] (XX:番号) というエラーの修正方法
【Unity】"~\Temp\Assembly-CSharp.dll.mdb" is denied. と出たら…


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



category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】エディタ上(Visual Studio等)のスクリプトをUTF8に固定する  


 トラブルシューティングっぽいのが続いてるので、ついでに Unity エディタ上の問題もメモを残しておこう。

 Unity2019(?) くらいからだろうか?エディタ上で作ったスクリプトをインスペクタ上で見ると、文字化けするようになったんだよね。

●新規作成したスクリプトをインスペクタで見てみると、文字化けしている


 テキストエディタ上(Visual Studio等)では問題なく日本語表示されているので、気が付かなかったりするけど、どうやら Windows 上(?)ではデフォルトで Shift-JIS で保存されているらしい…。

 Visual Studio上の設定では UTF-8 になってても、なぜか Unityエディタでは Shift-JIS になってしまう…。対処法をググってみたらやはり同じ問題に出くわした人も多いみたいで、アセットをインポート(更新)する際のイベントハンドラを使って、スクリプトで解決する方法があった。それを試してみたら上手く行ったので、Unity初心者でもわかるように手順を書いておこう。

(※) Unity 2021.3.18f1 / Visual Studio 2019 / Windows11(x64) で確認


1. まずは「新規スクリプト生成時にテキストエンコードをUTF-8に変換する」スクリプトを以下の github からコピーしよう。

新規スクリプト生成時にテキストエンコードをUTF-8に変換する (github)



2. Unity エディタ上でプロジェクトビューから「Editor」フォルダを作り(場所は任意)、「右クリック>Create>C# Script」で新規スクリプトが作れるので、「AssetPostprocessUTF8Encode.cs」などにして作成する。ダブルクリックでテキストエディタ(Visual Studio等)を開いたら、github でコピーしたスクリプトをまるごと貼り付けて保存しよう。



3.「AssetPostprocessUTF8Encode.cs」の保存が完了したら、文字化けしているスクリプトを一旦編集などして保存し直す。すると UTF-8 になっているハズだ。インスペクタで確認しよう(インスペクタが更新されないなら、一旦フォーカスを外し、再度クリックする等)。




 まぁ、どちらの文字コードでも実質問題は無いみたいなんだけどね。素早くインスペクタで中身を確認したいとき等は UTF-8 に統一しておいた方が良いだろう。また「AssetPostprocessUTF8Encode.cs」の 45行目には改行コードの変換も入っているようなので(CRLF→LF)、不要なら Replace() 以降を削除しても良いだろう。その辺りはご自由に。

●45行目に改行コード変換も入ってるので、無効化する場合。
// 改行コードの置き換え
//string contents = enc.GetString(bs).Replace("\r\n", "\n"); //元のコード(CRLF→LF変換)
string contents = enc.GetString(bs); //改行変換を取り除いたコード








(関連記事)
【Unity】Plugins フォルダのプラットフォーム別フォルダ名 メモ
【Unity】「Missing (Script)」を修復する
【Unity】Unity2019以降で新規作成したアセットは、Unity2018以前にインポートすると壊れる?
【Unity】タイトルバーの「PREVIEW PACKAGES IN USE」を消す
【Unity】【C#】インスペクタの値を保持したまま変数をリネームする


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】Standard Assets の Flare (レンズフレア) は Gamma 用だった?  


 たぶん Unity2018.3 頃からだと思うけど、デフォルトのシーンに FlareLayer がアタッチされなくなったんだよね。Standard Assets も既にレガシーとなっているので、今更とは思うのだが、ググっても LensFlare 系のフリーアセットってあまり出てこないので、改めて Standard Assets を試してみた。
 しかしう~ん…。なぜか私の記憶している感じと違う…。Unity5 の頃は Standard Assets は当たり前のように使ってたので、こんな感じの LensFlare じゃなかったような…。もっと綺麗に輝いていた気がするぞ…?


 どうにもしっくり来ないので、古い Unity5 のプロジェクトを開いてみた。そして同じように Standard AssetsLensFlare を使ってみると見た目が全然違う!


 比較してすぐに気づいたのは「Color Space の違い」なんだよね。Unity5 の頃は Gamma Color Space が普通に使われていたため、アセットも Gamma 用が普通だった。しかし Unity2018 以降は Linear Color Spane も Experiment(試験実装)的 ではなく、正式に採用されるようになっていったため、アセットも Linear 用(もしくは両対応)になっていった。以下の資料を見ても分かる通り、特に加算・合成といった処理では Color Space の違いがよく出るので、Standard AssetsLensFlare は Gamma 用だったと仮定すると説明がつく。

(参考) 分かる!リニアワークフローのコンポジット - 「加算が変わる」 参照

 ならばテクスチャの「Import Settings の sRGB を外せば、リニアでも使える」みたいなことを VRMLiveViewer での Color Space 移行(v2.x→3.0α時代) で学んでいたので、試してみた。う~ん、それでも太陽以外はぼやけて見えない感じだな…。


 そう言えば Flare asset 自体をあまり覗いたことなかったな~、と思って設定を見てみると Color プロパティがある。これも以前「ガンマ(Gamma, sRGB) - リニア(Linear) 値の相互変換」として記事を書いていたように既に学んでいたことなので、Linear 上で Gamma っぽい色にする:つまり Linear → Gamma の Color 変換 を試してみた。そしたら、Color Space の違いから色味が異なるのは仕方ないにしても、それなりに近い感じになった!

Linear → Gamma の Color 変換

●色のプロパティを Gamma 変換してみる

※全ての Element の Color プロパティを同様に Gamma 変換する

●Unity2020.3上(Linear Color Space)での Flare アセットの Color 設定を Linear → Gamma 変換してみる

 最初の Unity5 の Gamma Color Space と比較してみると、やはり色の加算・合成的な部分で色味が異なるが(Gamma は色を重ねると輝きが強くなり、Linear は白っぽくなる傾向がある)、なるほど、Standard AssetsLensFlare は Gamma 用だったと言って間違いないようだ。


 まとめると、
・テクスチャの Import Settings の sRGB のチェックを外す
・Flare asset の各 Element の Color プロパティを Gamma 変換する

で、それなりに近い感じにできる(※カラースペースによる差異はどうしてもあるが)





(関連記事)
【Unity】ガンマ(Gamma, sRGB) - リニア(Linear) 値の相互変換
【Unity】色形式:Unity の Color と Android の ARGB(int32) の相互変換をする
【Unity】Quality (グラフィック品質) を文字列で取得/設定する
【Unity】画面解像度とアクペクト比(整数)を求める
【HTML】HTMLカラー名・カラーコード表


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】Plugins フォルダのプラットフォーム別フォルダ名 メモ  


 うむむ…、しばらく気が付かなかったのだが、Android版の VRMLiveViewer での音声認識プラグイン(Oculus Plugin)が動かなくなっていた…。調べてみたら、どうやらアプリで v2.0 以降らしい。VMDのモーフでリップシンクできるようになってから、音声認識は使わなくなってたからなぁ…また、特に実装を変えてないので完全ノーマークだった…。

 しかし、v2.0 で複数VRM対応しただけで、やはり特にプラグイン自体の実装に問題は無い。結局ネイティブでエラーくらいしか思いつかなかったので、ランタイムを調べてみたら、案の定「OVRLipSync not found」みたいのが出ていた。ん? OVRLipSync プラグンが無いだと?…あるな。何でだ?

 そういえば、v2.0 で試しに ARM64 ビルドにもチェックを入れてたんだった。もしかしてプラットフォーム別にフォルダ作った方が良いのか?

 そんなわけでマニュアルみたり、ググったりしてみたが、見やすいのが無い。ならば自分用にメモを作っておこうと…。

(※) Unity 2020.3.21f1 / Windows11(x64) で確認



Plugins          … プラットフォーム共通
├ Android … CPU共通
│├ armeabi … ARM共通
│├ armeabi-v7a … 32bit (ARMv7)
│├ arm64-v8a … 64bit (ARM64)
│├ x86 … 32bit
│└ x86_64 … 64bit
├ x86 … Windows 32bit
├ x86_64 or x64 … Windows 64bit
├ iOS
└ Mac

おおよそ、こんな感じかな。古い表記だと Android/libs/armeabi みたいになっているものもあるが、試しに libs を無くしてみたら、普通に動くようだ。

ただ、ARM64 (64bit iOSも) を使うには Scripting Backend を IL2CPP にする必要があるらしい。



 結局プラグインが古いためか(2016-2017年製)、ARM64 ビルドに対応してなかったみたい。残念ながらプラットフォーム別に分けても、認識してくれなかった。しかし、ARM64 ビルドのチェックを外したら動く。

 どうやらプラグイン自体に、コンパイル依存(?)があるらしいね。とは言え、音声認識あたりはかなり実装が面倒なので、最新プラグインに入れ替えるのも相当骨が折れる。一旦、保留案件として、元に戻すのが一番手っ取り早そうだ。

 ネイティブプラグインは時代を跨ると色々問題も出るので、やっかいだね。特に Android は以前の API Level では動いてたのに、新しい API Level では動かないなんてことよくある(だいたいは「セキュリティ強化」の仕様変更が原因)。

 そう言えば、私が Unityアセットストアに出しているプラグインでも「音声認識(Speech Recognizer)が Andoid11 で動かくなった」と海外のユーザーからメールが来ていた。これはどうやら Andoid11 のセキュリティ仕様変更マニフェストファイル(AndroidManifest.xml)にパーミッションが必要になったようだ。TTS(Text-to-speech)なども同じ用に専用パーミッションが必要になったみたいだね。まぁ、Android のメジャーバージョンアップデートのときは気をつけた方が良いよ。Googleは結構やらかす(笑)。

 結局ソースコードレベルで利用できるものの方が寿命が長いかもなぁ…(他人が作ったプラグインとか直せないので、後になって動かなくなるととても困る)。







(関連記事)
【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プラグイン  Unityトラブルシューティング 
tb: 0   cm: --

【Unity】UnityHub 3.0 beta で Android support インストールに失敗する  


 最近「UnityHub 3.0 beta が利用可能」と、いつも Hub の上部に出てるものだから、ちょっと試しにインストールして使ってみたら、Android support オプションインストール時に、以下のエラーが出た。

Faild to delete old Unity Android Support installation files. Maybe Unity or some of its tools are still running?

(Google 翻訳)
古いUnityAndroidサポートインストールファイルの削除に失敗しました。 たぶんUnityまたはそのツールのいくつかはまだ実行されていますか?

 何の事かよくわからなかったので(特に他に何も実行してなかったので)、そのまま「無視」して続行したら、案の定 Android ビルドできなかった。「Open JDK が無い」みたいなエラーがエディターで出るね。

 ちょっと Unity 本体がインストールされているフォルダを覗いてみたら、やはり Android ビルドに必要なものがインストールされてないっぽい。JDK フォルダが無いのと、他にもいくつか足りない気がする(古い Unity がインストールされているフォルダと比較すると、明らかにフォルダが少ない)。

 ググってみると、同じエラーに遭遇してる人いるみたいだね。私が試したのは Hub v3.0 beta-5 だけど、beta-1 の頃から直ってないらしい。

[Unity Hub 3.0.0-beta.1] Failed to delete old Unity Android Support

 面倒なので、とりあえず Hub v3.0 beta はアンインストールして、Hub v2.x を入れ直し、Unityエディター(2020.3LTS)も入れ直したら、正常にインストールできた。

 Hub v2.x なら勿論 Android ビルドも普通にできる。Hub v3.0 beta 全然ダメじゃん…。|||orz







(関連記事)
【Unity】Unity2020 でプラットフォーム切り替えをすると、Run In Background が勝手にオフになってしまう
【Unity】Unity2020 にアップグレードしたら package cache (PackageManager) のエラーが色々出る…
【Unity】Unity2019以降で新規作成したアセットは、Unity2018以前にインポートすると壊れる?
【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トラブルシューティング 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop