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

【Unity】【C#】オーディオ再生でのエラー:An invalid seek position was passed to this function の対処法  

 ↓こんな感じのエラー

C:\buildslave\unity\build\Modules/Audio/Public/sound/SoundChannel.cpp(512) : Error executing channel->setPosition(position_pcm, FMOD_TIMEUNIT_PCM) (An invalid seek position was passed to this function. )

※行番号は Unityバージョンによって違うらしい

 なぜかググっても日本語記事が無かったので、備忘録として残しておく。

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



 結論からと言うとこのエラーは「オーディオデータの長さより大きい再生位置へ移動(シーク)したためエラー」というものだ。

 特にシーク機能(早送り/巻き戻し)などを付けた場合、気をつけないと、AudioClip を変更したときに長さが足りず、再生でエラー出たりする。よくあるのが、AudioSource.Stop() を実行して、AudioClip (AudioSource.clip) を入れ替えて再生しようとすると、エラーが出てしまうものだ。これは AudioSource.Stop() ではシーク位置はリセットされないので、入れ替えた AudioClip の長さが、現在の再生位置より小さい場合、エラーが出てしまうからだ。

 なので、対処法はいくつかある。

●AudioClip の長さを調べてから再生する
if (audioSource.time < audioSource.clip.length)
{
audioSource.Play(); //この場合、途中から再生となる
}


●再生位置をリセットしてから Play する
audioSource.time = 0;  //先頭位置へ移動(シーク)
audioSource.Play(); //この場合、最初から再生となる

 など…。知っていればなんてことない事だが、AudioSource.Stop() では再生(シーク)位置がリセットされないため、不具合に気が付かないってことあるんだよね。エラーが出ても最初から再生されてしまうので、見た目上手く行ってるように感じてしまうしね。それでもエラーは出さない方がやっぱりシステム的にも安定すると思う。





(関連記事)
【Unity】【C#】Windows で mp3 をランタイムで再生する
【Unity】【C#】動的にオーディオファイルの読み込みと再生をする


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



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityトラブルシューティング  オーディオファイル 
tb: 0   cm: --

【Unity】SymGetSymFromAddr64, GetLastError: '無効なアドレスにアクセスしようとしています。' と出たら…  



●Unity 2019 LTS が公開された


 現在メインで使っている Unity2019.2.21f1 が2月以降アップデートが止まってしまったので(これもコロナの影響?)、ちょっと試しに Unity 2019 LTS (4.0) を入れてみた。

 まぁ今のところ、Unity2019.3.x 以降にするとアプリ起動時の解像度設定やゲームパッドの入力設定のダイアログが無くなってしまうので、本格的にアップグレードできないのだが(まだ公式からも代替方法が提示されてないので、自前実装する必要がある)、それ以外にも Android のネイティブ構成なども変更されているので、プラグイン関係の不具合も調査しないといけないしね。ちょっと Unity2019.3.x 以降へのアップグレードは敷居が高い。

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

(※) Unity 2019.4.0f1 (LTS) / Windows10(x64) で確認



 しかし、それとは別にアプリをビルドして動かしてみたら、いきなりクラッシュした。そして、エラーログを見てみると

ERROR: SymGetSymFromAddr64, GetLastError: '無効なアドレスにアクセスしようとしています。
' (Address: 00007FF8367A8E5B)
※Address は色々出る

としかない。

 ちなみに、エラーログは、
C:\Users\{UserName}\AppData\Local\Temp\{CompanyName}\{ApplicationName}\Crashes\Crash_{日時}
に出る。
※古い Unity バージョンでは「C:\Users\{UserName}\AppData\{CompanyName}\{ApplicationName}」に出る

 よくわからないのでググってみたが、結論から言うとこのエラーは、
「クラッシュハンドラーがコードがクラッシュした場所を特定できなかったことを意味します」
だそうだ。つまり「原因不明」

U5.3 - ERROR: SymGetSymFromAddr64, GetLastError: 'Attempt to access invalid address.'

 実際この時、私も原因不明のクラッシュで手の付けようが無かったのだが(フォーラムを見てみると、それぞれ全く別の原因で出ていると推測できる)、色々操作しているうちに、「あるプレファブを Instanciate するとクラッシュする」ことに気づいた。そしてそのプレファブを徹底的に調べてみたところ、「あるマテリアルを使うとクラッシュする」ところまで突き止めた。

 しかし、このマテリアルは特別なものではなく、同じマテリアルで色違いなどではクラッシュしない。また、Unity2019.3.x で試してみてもクラッシュしない(Unity2019.2.x はもとよりクラッシュしない)。他にも色々パラメタを変えたり、クラッシュしたものと値をあわせたりしてみたが、結局最後まで原因不明だった…。ちなみにエディタ上ではエラーも出ず、クラッシュもしない。アプリとしてランタイム時にだけクラッシュするので、ビルドしたバイナリがバグっているとしか思えない(少なくとも手動で直せるものではない)

 まぁ、これまでも初期のバージョンは色々とやっかいなバグを持っていることも多いので、とりあえず、Unity2019.4.0f1 は使わない方が無難だろう(特に市販アプリでは)。このときはたまたまわかりやすいクラッシュだったので良いが、使う頻度が低いプレファブだったり、潜在的に引き起こされるクラッシュだったりしたら、見つけることは超絶困難なことになる(そして対処法もない)。

 ちなみにこのクラッシュを特定した方法は、とても面倒だがやり方は簡単だ。それは「あやしいと思ったヒエラルキー内のオブジェクトから1つずつ削除して、クラッシュしなくなったら、最後のオブジェクトが原因」だ。これは本当に最後の手段(笑)。しかもそのプレファブに内包しているオブジェクトは大量にあったため、かなり大変だった…(全オブジェクトの半分ずつ消していくのも良い。二分探索みたいな考え方)。超アナログな方法だが、コードのバグも同じ方法で見つけることもできる。どうにもならないときのただの力技だけどね(笑)。





(関連記事)
【Unity】IncrementalCompiler でのエラー:Unloading broken assembly Packages/com.unity.incrementalcompiler/Editor/Plugins/Unity.PureCSharpTests.dll, this assembly can cause crashes in the runtime
【Unity】Unity2018.3.2 にアップグレードすると見た目がおかしくなることがある
【Unity】Unity2019 の StandardShader の処理が少し変わったらしいよ
【Unity】【Android】2019.2.0 でパッケージ名(Bundle Identifer)でアンダーバーが使えない
【Unity】【Android】Unity2019 へのアップグレードの問題点 メモ
【Unity】EventTrigger のコールバック引数変わった?
【Unity】Unity2018 でビルドエラー「CommandInvokationFailure: Gradle build failed.」が出る


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【Unity】UniRx 7.x にアップグレードすると UniTask 系のエラーが出る  



※(AssetStore) UniRx 7.0.0 からは UniTask (UniRx.Async) は入ってない


 どうやら Unity2019.2.x (2.21f1) が2月頃からアップデートが止まっている…これもコロナウィルスのせいなのか…(会社はロスみたいだし)?
だけど、Unity2019.3.x はずっとアップデートされ続けている…。

 しかたないので、そろそろ覚悟を決めて (Android では内部実装が変わるので、ネイティブプラグインが死ぬ可能性がある) Unity2019.3.x にアップグレードしなくてはいけないかな?と思ってやってみたら、大量のエラーが出た。

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

(※) Unity 2019.3.13f1 / Windows10(x64) / UniRx 7.1.0 / UniTask 1.3.1 で確認



 1つは、どうやらカメラに Unity5 時代にデフォルトで付いていた「GUI Layer」が完全に廃止されたっぽい。もしかしたら旧 GUI も完全に使えなくなったのかな…?

Component GUI Layer in Main Camera for Scene Assets/xxx.unity is no longer available.
It will be removed after you edit this GameObject and save the Scene.

これは一度シーンを保存すれば、自動的に消されるらしい


 もう1つは UniRx のエラーだった。その1つは「using UnityEngine.Experimental.LowLevel;」の namespace で、どうやら Unity2019.3 では「using UnityEngine.LowLevel;」になったっぽい。
※この修正は後述の UniRx 7.x にアップグレードする場合は書き換える必要はありません。

error CS0234: The type or namespace name 'LowLevel' does not exist in the namespace 'UnityEngine.Experimental' (are you missing an assembly reference?)
error CS0246: The type or namespace name 'PlayerLoopSystem' could not be found (are you missing a using directive or an assembly reference?)


 そういえば、UniRx (6.x) は長らくアップデートしてないなぁと思ったので、AssetStore から再ダウンロード&インポート(UniRx 7.1.0)。そしたら今度は UniTask 関連のエラーが大量に出た。

UniRx - Reactive Extensions for Unity (AssetStore)

error CS0234: The type or namespace name 'Async' does not exist in the namespace 'UniRx' (are you missing an assembly reference?)
error CS0246: The type or namespace name 'UniTask' could not be found (are you missing a using directive or an assembly reference?)

 「UniRx.Async の namespace が無い」みたいなエラーだったので、しばらく原因がわからなかったのだが(6.x では普通に使えたので)、github で何か issue でも立ってないかと見ていたら、もっと単純に「UniRx.Async is separated to https://github.com/Cysharp/UniTask」([Ver 7.0.0 で] UniRx.Async のパッケージが分離しました) というコメントを見つけた。ああ、これか、と(笑)。

 なので、UniRx.Async のパッケージをDLしようかと思ったら、Ver 2.x.x-preview (プレビュー版)となっている。しかし「This version is preview, if you want to use stable version, check 1.3.1.」(安定版が使いたいなら、1.3.1 を見てね)ともあるので、今回はそちらを使うことにした。


UniRx (github)
UniTask (github)


 インポートしてみると、UniRx.Async は以前のように「Plugins」フォルダ以下ではなくなったみたい。もしかしたら「Plugins」フォルダ以下に移動した方が良いのかもだが(ビルド順が変わるとか何とか)、まぁ、私は動けば良いので、とりあえずこれでよし(笑)。

特殊フォルダーとスクリプトのコンパイル順 (Unity Manual)





 後で試しに「Assets/Plugins/UniRx」以下に「UniRx.Async」を移動してみたが、これも問題ないようだ。まぁ、コンパイル順でエラーが出たことはないが、アップグレードするときにまとめておいた方が便利なので、Plugins 以下に移動しても良いかもね。





(関連記事)
【Unity】【C#】UniRx で「1フレームごと待機して処理」してみる


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityオープンソースライブラリ  Unityプラグイン  Unityトラブルシューティング 
tb: 0   cm: --

【Unity】【Android】マルチウィンドウを禁止する  


 Android 7.0 以降からは画面を分割してアプリを起動できるマルチウィンドウがサポートされているが、Unity で作っている場合、絶対座標で配置されているものは「分割画面←→フルスクリーン画面」に変更したりすると、レイアウトがおかしくなってしまうことがある。もちろん自動でレイアウトを再計算するように作られていれば問題ないのだが、ゲーム画面などで縦または横の長さ固定で考えられている場合、画面分割で正方形に近くなってしまうので、全てのオブジェクトが中央に寄ってしまう、なんてこともある。そして困ったことに、マルチウィンドウのサポートは Android 7.0 以降、デフォルト状態でオンなのである。

マルチウィンドウのサポート

 なのでいっそのことマルチウィンドウを禁止した方が早い場合も多い(可変レイアウトを考えるのには結構手間がかかる)。まぁ、Android 開発に詳しい人ならググればすぐにわかると思うが、Unity のみで開発している人にとってはわかりずらい部分であり、「なぜかたまにレイアウトが崩れる」なんて困っている人もいるかもと思ったので、とりあえず記事にしておくことにした。

(※) Unity 2019.2.21f1 / Android 8.0 で確認



■AndroidManifest.xml でマルチウィンドウを禁止設定する

 マルチウィンドウのサポートを設定する AndroidManifest.xml のタグは application または activity タグである(アプリ全体なら application タグ、アクティビティごとなら activity タグだが、Unity の場合、複数アクティビティを使うことは少ないので、機械的に application タグでも良い)。
Unity の場合、「Assets/Plugins/Android/」フォルダ以下に AndroidManifest.xml が置かれるので、それを適当なテキストエディタで開き、application または activity タグを見つけて、「android:resizeableActivity="false"」(禁止) を入れておく(許可にしたいなら true)。

application タグ
activity タグ
アクティビティ


 もし、プラグインなど全く使ってないのなら、デフォルトでは AndroidManifest.xml は用意されていないので、フォルダを含めて自分で作る必要がある。テンプレは Windows の場合「(インストールした Unity のフォルダ)\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player」にあり、Mac の場合「(アプリケーションフォルダ)/Unity.app/Contents/PlaybackEngines/AndroidPlayer/src/com/unity3d/player 」にあるので、コピーして手を加えれば良いだろう。詳細は公式マニュアルを参照して欲しい。

Android 用のプラグインをビルド

 ここでは簡略した例を書いておこう。

●AndroidManifest.xml に resizeableActivity="false" を入れ、マルチウィンドウを禁止する
<?xml version="1.0" encoding="utf-8"?>
<manifest ~(中略)~
<application ~(中略)~ android:resizeableActivity="false">
~(中略)~
</application>
</manifest>

 あとは Android ビルドをして、実機で試していると良い。

 簡単な手順としては、例えば Google Chrome を起動し、メニューボタンを長押し→画面が分割されるので、空白の方のウィンドウをタップして、マルチウィンドウを禁止したアプリを立ち上げてみる、なんて感じでできるだろう。
 上手くいったなら「マルチウィンドウ表示では、このアプリを使用できません」等のトースト(メッセージ)が出る。確認してみよう。










(関連記事)
【Unity】【Android】自動バックアップの対象/除外設定をする
【Unity】Android アプリでパーミッション(権限)要求をする
【Unity】【C#】プロジェクト内で Android(Java)プラグインをビルドする
【Unity】標準以外のセンサー(歩数計や心拍数など)を使う(Android)
【Unity】Androidで音声認識を使う
【Unity】Firebase のプッシュ通知と FantomPlugin の共存(Firebase と他のプラグインの共存方法)
【Unity】Unity2019.3 で Android / iOS ネイティブの構成が変わるらしい


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

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

【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: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR