ダイジング化したデータのAssetBundle化について

511 views
Skip to first unread message

hotarukanchou

unread,
Oct 16, 2017, 12:37:20 AM10/16/17
to 宴ユーザーグループ
質問の前によくある質問や、過去のQ&Aや古いQ&Aに、同様の質問がないかご確認ください。

宴のバージョン: 例)3.1.5
UnityのバージョンとOS: 例)Unity2017.1.f3 Windows
UnityのConsoleウィンドウのエラーメッセージ:


などをあらかじめ記述していただくと、スムーズに問題が解決できます。


質問の前によくある質問や、過去のQ&Aや古いQ&Aに、同様の質問がないかご確認ください。

宴のバージョン:3.1.5
UnityのバージョンとOS:Unity5.6.f1 Windows

お世話になっております。
DicingConverterを使用しCharacterフォルダ画像のダイジングデータを作成。
Output1(ScriptableObject)は"Resources/(プロジェクト名)/Character"フォルダ直下、Output2(合成画像)は"Resources/(プロジェクト名)"フォルダ直下に入れて使用しています。
この状態でResoucesフォルダを対象にResourceConverterを用いてAssetBundleを作成し、AdvEngineStarterのStrageTypeをStreamingAssetsに設定。
そしてゲームを再生したところ、ダイジング化したCharacter画像が読み込まれないままゲームが進行します。
エラーメッセージは下記の通りです。
ダイジング化した画像をAssetBundleで利用したい場合、正しい用法があればご教示ください。
なお、DummyFilesの有効・無効で挙動は変化しませんでした。


UnityのConsoleウィンドウのエラーメッセージ:
NullReferenceException: Object reference not set to an instance of an object
Utage.DicingTextureData.ForeachVertexListSub (Rect uvRect, Boolean skipTransParentCell, Utage.DicingTextures textures, System.Action`2 function) (at Assets/Utage/Scripts/GameLib/UI/Image/Dicing/DicingTextureData.cs:248)
Utage.DicingTextureData.ForeachVertexList (Rect uvRect, Boolean skipTransParentCell, Utage.DicingTextures textures, System.Action`2 function) (at Assets/Utage/Scripts/GameLib/UI/Image/Dicing/DicingTextureData.cs:222)
Utage.DicingTextureData.ForeachVertexList (Rect position, Rect uvRect, Boolean skipTransParentCell, Utage.DicingTextures textures, System.Action`2 function) (at Assets/Utage/Scripts/GameLib/UI/Image/Dicing/DicingTextureData.cs:135)
Utage.DicingImage.ForeachVertexList (System.Action`2 function) (at Assets/Utage/Scripts/GameLib/UI/Image/Dicing/DicingImage.cs:235)
Utage.DicingImage.OnPopulateMesh (UnityEngine.UI.VertexHelper vh) (at Assets/Utage/Scripts/GameLib/UI/Image/Dicing/DicingImage.cs:214)
UnityEngine.UI.Graphic.OnPopulateMesh (UnityEngine.Mesh m) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:443)
UnityEngine.UI.Graphic.DoLegacyMeshGeneration () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:401)
UnityEngine.UI.Graphic.UpdateGeometry () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:372)
UnityEngine.UI.Graphic.Rebuild (CanvasUpdate update) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Graphic.cs:335)
UnityEngine.UI.CanvasUpdateRegistry.PerformUpdate () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/CanvasUpdateRegistry.cs:149)
UnityEngine.Canvas:SendWillRenderCanvases()

マッドネスラボ

unread,
Oct 16, 2017, 1:12:57 AM10/16/17
to 宴ユーザーグループ
おそらくこちらと同じかと思います。
画像の置き場所(OutPut2)を、ResourceConverterの対象フォルダ(Resources)以下に置かないようにしてください。
ResourceConverterは、対象フォルダ以下のアセットを全て一つづつのアセットバンドルとして作成しますので、
互いに参照関係にあるアセットが混ざってしまうと、それぞれ別のアセットバンドルとして作成されてしまいます。



hotarukanchou

unread,
Oct 16, 2017, 5:21:32 AM10/16/17
to 宴ユーザーグループ
ご回答いただきありがとうございます。
既存の質問と内容が重複してしまい失礼しました。これから再作成してみます!

hotarukanchou

unread,
Oct 18, 2017, 2:18:27 AM10/18/17
to 宴ユーザーグループ
無事、AssetBundleの作成と動作確認が終わりました。
ご協力いただきありがとうございました。
利用して気になった点があり、再度質問させていただきます。

タイトル画面でBGMを流しているのですが、AdvEngineStarterのStrageTypeをStreamingAssetsにして起動すると、
しばらくの間、コンフィグで設定したマスターボリュームなどが無効になり、SoundManagerのInspector上で設定された音量になってしまいます。
またその間は、ExcelのParamシートで設定したパラメータも、存在しないものとして扱われてしまいます。
一定時間経過すると、音量はコンフィグで設定した値になり、Paramも復活します。

FileManagerViewerおよびParameterViewerを使って挙動を確認したところ、
起動直後にStreamingAssetsフォルダにある(プロジェクト名).scenarios.assetを読み込み、
その後textureやsoundのassetbundleの一覧を全て読み込み終わるまでの間で、
コンフィグの設定やParamが無効になるようです。
(その状態でシナリオを開始すると分岐が無効になる)

上記の記事やAdvEngineStarter.csを読んでみたのですが、AssetBundleのファイル数が非常に多い場合は、
アセットバンドルリストなどの初期化が終わるまで無音のローディング画面などを表示し、
その後タイトル画面へ遷移するなどの対応が推奨されるということでしょうか。
(StreamingAssetsフォルダのファイル数は3万ほどあります)
宴の利用範囲を超えた質問になってしまったかもしれませんが、ご意見を伺えますと幸いです。

マッドネスラボ

unread,
Oct 18, 2017, 6:23:37 AM10/18/17
to 宴ユーザーグループ
Paramシートの内容、つまりそもそもどんなパラメーターがあるか?などは
.scenarios.assetをロードしないと把握することができないため、
scenarios.assetをロードしてから、Paramシートやコンフィグなどの値を保存しているシステムセーブデータをロードしています。
音量などのコンフィグデータも同じシステムセーブデータにセーブされているため、scenarios.assetをロードした後にロードする形になっています。
つまり、宴の初期化前にコンフィグデータを使われることを想定していないため、コンフィグの音量データもロードできなくなっているという形です。

一応、システムセーブデータのロードだけを宴の初期化前にしてみるという手もあるのですが、その場合はちょっとどういう動作になるか検証していません。

マッドネスラボ

unread,
Oct 18, 2017, 6:26:37 AM10/18/17
to utag...@googlegroups.com
LoadSystemSaveDataOnlyConfigなどのように、
コンフィグデータだけであれば事前にロードできる機能が作れるかもしれません。
そのような機能が追加できないか検証してみますので、必要があればご連絡ください。


hotarukanchou

unread,
Oct 20, 2017, 10:58:22 AM10/20/17
to 宴ユーザーグループ
承知しました。
悩んでいる点は、StrageTypeがLocal(Resources)のときに比べ、
StremingAssets(AssetBundle)を利用した際の宴の初期化があまりにも遅いことなのですが、
Unity2017になってAssetBundleの読み込みが早くなったようなので、そちらも試してみます。

動作軽量化・メモリ節約の一環としてAssetBundleや画像のcrunch圧縮など色々試行錯誤中です。
またお知恵を拝借させていただくこともあると思いますが、どうぞよろしくお願い致します。

マッドネスラボ

unread,
Oct 22, 2017, 8:28:34 PM10/22/17
to 宴ユーザーグループ
すみません。初期化が遅いというのはちょっと原因が思い当たらないです。
「StreamingAssetsAndLocalScenario」にすれば、リソースのみStreamingAssetsで、シナリオは通常通りロードすることになります。
こちらをしても遅いのであれば、やはりアセットバンドル管理系でなにか遅いのかもしれません。

また、Resoucesを使うとアプリサイズが肥大化する対策でアセットバンドルを使っているのであれば、
WindowsやWebGLでビルドするなら以下のように、圧縮オプションをつけてビルドするというエディタ拡張も可能です。
http://tsubakit1.hateblo.jp/entry/2017/03/22/233000

スマホアプリですとアプリ全体で同様の圧縮が自動的にかかるので、上記の圧縮はあまり意味が無いのですが
PCであれば半分くらいのサイズになるかと思います。
これをすればアセットバンドルを使わないでもよくなるかもしれません


hotarukanchou

unread,
Oct 25, 2017, 6:22:59 AM10/25/17
to 宴ユーザーグループ
ご助言ありがとうございます。

>「StreamingAssetsAndLocalScenario」にすれば、リソースのみStreamingAssetsで、シナリオは通常通りロードすることになります。

「タイトル画面表示後、コンフィグの音量設定が反映されるまで」の時間を検証してみました。
StreamingAssetsAndLocalScenarioにすると症状は軽減されますが、解決はしませんでした。

【動作環境】Unity5.6.1(Windows)
<UnityEditor上の挙動>
Resources:時間なし
StreamingAssetsAndLocalScenario:5秒程度
StreamingAssets:10秒程度

<Windowsでビルド後、実行>
Resources:時間なし
StreamingAssetsAndLocalScenario:4秒程度
StreamingAssets:8秒程度


>スマホアプリですとアプリ全体で同様の圧縮が自動的にかかるので、上記の圧縮はあまり意味が無いのですが
PCであれば半分くらいのサイズになるかと思います。
>これをすればアセットバンドルを使わないでもよくなるかもしれません

アセットバンドルの利用を検討したのは、スマホ移植を視野に入れたことと、古いPCでゲーム起動時にクラッシュするという報告があった為でした。
ところがアセットバンドルのみでビルドしてもクラッシュすることが分かった為、少なくともWindowsビルドではアセットバンドルの利用は必要なかったかもしれません。
(容量に関してはResoucesとAssetBundleで大差は無かったです)
テラシュールブログさんの記事はこれから検証してみます。ありがとうございます。


【余談】
クラッシュ後のoutput.logに書かれた「d3d11: failed to create 2D texture」で検索したところ、下記のフォーラムで宴アイコンを拝見しました。
クラッシュの問題についてはこちらも参考にしてみます。

マッドネスラボ

unread,
Oct 25, 2017, 6:50:46 AM10/25/17
to 宴ユーザーグループ
ありがとうございます。

StreamingAssetsAndLocalScenarioでもStreamingAssetsでも、
マニフェストファイルという、アセットバンドルのリストを最初にロードして、ファイル管理用のリストを作っています。
なので、マニフェストファイルのロードが重いのかもしれません。

正直な所、アセットバンドルはとても問題が多いものでUnityを使う開発者全員が苦労している部分です。
Unity自体もそれを認めていて、今改善中らしいですがまだ正式に導入される目処もたっていないようです。


なので秒単位の最適化が必要なのであれば、プロジェクトの性質に合わせてアセットバンドルの管理を自作していくしかないと思います。
一応やり方に関してはこちらになります。
>クラッシュ後のoutput.logに書かれた「d3d11: failed to create 2D texture」で検索したところ、下記のフォーラムで宴アイコンを拝見しました。

これは、仰る通り古いWindowsPCで起きるバグです。
これを使って、pngファイルやバイナリデータから直接テクスチャをロードしようとすると、起きるケースがあります。
フォーラムでの報告以外にも、Unityにかなり詳細なレポートは送ったのですが、「UnityのデバッグチームのPCでは再現しないので修正するつもりはない」というような対応でした。
宴3でファイルのダウンロードを全面的にアセットバンドルにしたのはこのバグを避けるためでもあります。


Reply all
Reply to author
Forward
0 new messages