宴3で会話シーン利用時のAssetBundle利用について

787 views
Skip to first unread message

hiromitsu...@gmail.com

unread,
Apr 21, 2017, 5:08:11 AM4/21/17
to 宴ユーザーグループ
宴のバージョン:3
Unityのバージョン:5.5.2f1

---宴の利用状況---
Unityから宴の会話シーンのみ利用しております。

Unity側では、表示したい会話シーンをリスト形式で選択できるようにしています。
(リストの上から順に、第一話、第二話・・・といったイメージです)
宴側では、プロジェクトのエクセルファイル内のシートを分割し、上記のそれぞれのリストに対応する形で
選んだリストの会話シーンが再生される形としています。

---質問したいこと---
上記の利用形態において
宴側で用意されているAssetBundle機能を利用せずに、Unity側で作成したAssetBundleを利用し
会話シーンの追加を行いたいと考えています。

1.独自に作成したAssetBundleをロードして、宴の方に反映させることは可能でしょうか?
2.上記が可能な場合、やり方について教えて頂きたいです
 ※CustomLoadManagerというクラスを見つけたので、これで可能なのか?とも思っていますが
 よく理解できていない状態です。その場合の利用方法など例示して頂ければ幸いです。

以上、よろしくお願いいたします。

マッドネスラボ

unread,
Apr 21, 2017, 5:19:40 PM4/21/17
to 宴ユーザーグループ
方法をまとめましたので、こちらを確認してください。

http://madnesslabo.net/utage/?page_id=464#i

独自に作成したアセットバンドルのリストを、宴のファイルロードの仕組みに組み込むのはこちらを

ファイルロード自体を独自に行う場合は、こちらを参考にしてください


hiromitsu...@gmail.com

unread,
Apr 21, 2017, 8:02:11 PM4/21/17
to 宴ユーザーグループ
お世話になります。大変わかりやすい情報ありがとうございます!
こちらの情報を参考に、進めていきたいと思います。

hiromitsu...@gmail.com

unread,
May 1, 2017, 5:18:57 AM5/1/17
to 宴ユーザーグループ
お世話になります。

紹介頂い方法でわからない点があり、教えて頂ければと思います。
>独自に作成したアセットバンドルのリストを、宴のファイルロードの仕組みに組み込むのはこちらを

CustomAssetBundleLoad.csを参考に作成してみたのですが
AssetfileBase.csのParseLoadPath()にて
「Not found in assetbundle manifest http://xxx~」となってしまいます。

CustomAssetBundleLoadにある、下記のresourcePathとURLの設定が間違っているような気もしますが
いまいち理解しきれておりません。

・urlは、作成したAssetBundleを置いているURLを指定しています。

・resourcePathの指定がよく理解できません
 サンプルをまねして、URLと同じ物を指定しています

・シナリオ名は、AssetBundleに含めているシナリオを指定しています。
 例) string scenariosName = "UtageProject01.scenarios.asset";

>         new SampleAssetBundleVersionInfo()
>            {
>                version = 0,

アセットバンドルには、シナリオ(xxx.scenarios.asset)や使用するリソース(画像、音声)類を含めて作成しております
そのアセットバンドルのURLを上記に指定すればOK、と思っていたのですが
なにか根本的に勘違いしていますでしょうか。

よろしくお願いいたします。

マッドネスラボ

unread,
May 1, 2017, 6:18:26 AM5/1/17
to utag...@googlegroups.com
resourcePathは宴のファイルマネージャーに渡すファイルパスです。
urlのほうは実際にそのアセットバンドルが置いてあるURLになります。

recourcePathは、宴の内部で決まる
「本来はアセットバンドルを使わない場合にローカルでロードするためのファイルパス」のようなものです。

パスの決まり方は、このようになります。
「ルートフォルダ」( Engine.BootFromExportData(this.Scenarios, root); で渡したroot)
ローカルで言う「Resources/プロジェクト名/以下からの相対パス」

具体的に例をあげますと、

●ローカルでロードする場合は
Engine.BootFromExportData(this.Scenarios, "Sample/")
としてエンジンを起動した場合、
キャラクターのテクスチャのパスは、"Sample/Texture/Character/XXX.png");
BGMのパスは、"Sample/Sound/Bgm/XXX.wav");
このようになって、ファイルマネージャーに渡されます。

●サーバーからロードする場合は
Engine.BootFromExportData(this.Scenarios, @"http://madnesslabo.net/Sample/)
としてエンジンを起動した場合、
キャラクターのテクスチャのパスは、"http://madnesslabo.net/Sample/Texture/Character/XXX.png");
このようになって、ファイルマネージャーに渡されます。


これらのファイルパス(resourcePath)を、実際にロードするアセットバンドルのURLに変換する必要があります。
そのために、resourcePathとurlの対応を
                AssetFileManager.GetInstance().AssetBundleInfoManager.AddAssetBundleInfo
を使って、予め設定しておく必要があります。


宴のデフォルトの処理では、
リソースコンバーターを使って「ほとんど同じフォルダ構成」「一定の命名規則」でアセットバンドルを作成しているので、
resourcePathとurlを、命名規則に従って変換するようにして設定しています。

独自にアセットバンドルを作成した場合は、
元になったリソースのパスと実際に置いてあるURLの対応は独自のルールにもとづいていると思います。
なので、resourcePathとurlの関連付けは、その独自のルールに基づいて行ってください。


hiromitsu...@gmail.com

unread,
May 1, 2017, 10:53:34 AM5/1/17
to 宴ユーザーグループ
詳細に解説頂いてありがとうございます。
ご説明を参考に、下記のように実行してみたのですが、やはりロードの仕方が間違っているようでエラーになってしまいます。
きちんと理解できておらず、何度も申し訳ございませんが教えて頂けますと大変たすかります。

---試した手順---
下記のファイルを格納したアセットバンドル「testAsset」を
上記のURLに格納して、ロードしたいと考えております。

- Assets/Utage01/Utage01.scenarios.asset
[以下は参照しているリソース類でAssetBundleに含めている物]
- Assets/Utage01/Resources/Utage01/Sound/SE/StoryTest/setest1.mp3
- Assets/Utage01/Resources/Utage01/Texture/BG/StoryTest/bgtest1.jpg
- Assets/Utage01/Resources/Utage01/Texture/BG/StoryTest/bgtest2.jpg
- Assets/Utage01/Resources/Utage01/Sound/BGM/StoryTest/bgmtest.mp3

CustomAssetBundleを元に、以下のようにURL等を変更してみました。
・string serverUrl = "https://xxx/utage/";
・string scenariosName = "Utage01.scenarios.asset";
・    new SampleAssetBundleVersionInfo()にて
        resourcePath = @"Utage01/",
        version = 1,

すると、下記のエラーとなってしまいます。
Not found in assetbundle manifest https://xxx/utage/Windows/Utage01.scenarios.asset

マッドネスラボ

unread,
May 1, 2017, 1:36:43 PM5/1/17
to utag...@googlegroups.com
まず、「独自に作成したアセットバンドルリストを登録する」のパターンでは、
「アセットバンドル1つに対して、1アセットのみ」という前提になっています。
アセットバンドル「リスト」とあるように、「複数のアセット」から「複数のアセットバンドル」を作る前提になっています。

つまり、以下それぞれのアセットバンドルを作っている場合にのみ利用ができます。
- Assets/Utage01/Utage01.scenarios.asset
- Assets/Utage01/Resources/Utage01/Sound/SE/StoryTest/setest1.mp3
- Assets/Utage01/Resources/Utage01/Texture/BG/StoryTest/bgtest1.jpg
- Assets/Utage01/Resources/Utage01/Texture/BG/StoryTest/bgtest2.jpg
- Assets/Utage01/Resources/Utage01/Sound/BGM/StoryTest/bgmtest.mp3

一般的に、ノベルゲームは大量のリソースを使いますので
複数のリソースをアセットバンドル1つに収めてしまうと、ファイルサイズが多きなりすぎてしまい
メモリが足りなくなったりなど不具合を起こしやすいため、そういったアプローチはとっていません。


もし、1つのアセットバンドルに複数のアセットを含めるのであれば、
宴用意しているファイルマネージャーのロード処理は使えませんので、
「ロードやアンロード処理をカスタムする」
こちらを参考に、自作のコードのアセットバンドルのロード・アンロード処理を呼び出すようにしてください。

また、この場合はAdvEngineStarterなども使えませんので、
以下のような形で起動処理が必要になります。

1、http://madnesslabo.net/utage/?page_id=464#i-3 こちらのコードを参考に、宴のファイルマネージャーに、「自作のコードのアセットバンドルのロード・アンロード処理を呼び出すコールバック」を登録する。
2、自作のアセットバンドルのロード処理で、「Utage01.scenarios.asset」をロードする
3、ロードしたシナリオのアセットを AdvEngine.BootFromExportDataの第1引数に渡す。第二引数のrootpathは空でも良い。
4、任意のタイミングでシナリオを起動する。

・・・という流れです。





マッドネスラボ

unread,
May 1, 2017, 3:06:33 PM5/1/17
to 宴ユーザーグループ
サンプル自体が、どうしても宴の内部処理に合わせた不自然な書き方が多いので、
もう少し簡単なサンプルを書けるように、少し更新してみます。


マッドネスラボ

unread,
May 1, 2017, 4:53:59 PM5/1/17
to 宴ユーザーグループ
サンプルと内部処理を少し更新しました。
最新バージョンの宴(3.0.7)に、添付のパッケージファイルを適用してください。

もう少し処理が分かりやすくなっていると思います。
Utage/SampleOthers/SampleCustomAssetBundleLoadというシーンを実行すると、サンプルのロード処理を起動できます。


ただし、1アセットバンドル=1アセットという制限は変わりません。
もし、1つのアセットバンドルに複数のアセットを含める必要があるのであれば、
先述したようにロード処理と初期化処理を自作してください。


SampleCustomLoader.unitypackage

hiromitsu...@gmail.com

unread,
May 1, 2017, 8:40:37 PM5/1/17
to 宴ユーザーグループ
大変丁寧にありがとうございます!
1アセット=1アセットバンドルについて理解できました。

頂きましたサンプルをもとに、やってみたいと思います。
ありがとうございました。
Reply all
Reply to author
Forward
0 new messages