リップシンクのボイスファイルの無音部分に合わせたパク調整

586 views
Skip to first unread message

taku_hsy

unread,
Feb 8, 2021, 4:36:12 AM2/8/21
to 宴ユーザーグループ
お世話になっております。

宴のバージョン: 宴3.9.5
UnityのバージョンとOS: Unity2020.1.7f1 Windows
Unityの習熟度:ゲームプログラマーとして実務経験あり。Unityは初学者。   

■Avatarオブジェクトを利用してリップシンクの実装を行っております。
現在、テストでボイスを流したところ、無音部分でもパクが継続していたため、
ファイル長の間、パクを継続する実装なのかなと想定しておりましたが、
調べるとLipSynch2dクラス内のOnUpdateLipSync内でLipSyncVolume変数になにかしらの値を入れているように見受けられたのですが、参照先が見当たりませんでした。
こちらは実装されていますでしょうか?

また、Live2Dの口パクに関して「音量に従って口パクする場合に、Live2Dのデフォルト設定では変化が小さすぎる点」との文章が見受けられたのですが、
今回のアバターで行うと思っていたのですが、こちらはLive2Dに関わらず上記の仕組みですと同じ精度になってしまいますでしょうか?

上記の構造に気づく前の別案として、あらかじめWAVを解析した口パク用テーブルを作り、それをボイス再生時に参照させる、というのを検討していたのですが、
継承してフックしようとしておりましたLipSynchAvatarが、ひいてはアバターオブジェクトの生成がAdvGraphicObjectまでさかのぼる形になっており、フックするのが非常に難しい、生成周りの総とっかえになってしまいそうに見受けられたのですが、
何か妙案はございますでしょうか?
(生成後、カスタムコマンドやマクロでLipSynchコンポーネントを入れ替えるとかでしょうか?)

大変お手数をおかけいたしますが、ご助言いただければと思います。
何卒、よろしくお願いいたします。



マッドネスラボ

unread,
Feb 8, 2021, 10:06:57 PM2/8/21
to 宴ユーザーグループ
> LipSyncVolume変数
これは、昔のLive2D(Live2D Version2)で使用していたものです。
ただ、Live2D Version3以降は、Live2D自体が直接ボイスのAudioSourceコンポーネントを参照して口パクするコンポーネントを持っているので、そちらに任せています。
なので、もう使用していませんが、独自実装で使うケースもありそうだったのと、互換性のために残してあります。

>「音量に従って口パクする場合に、Live2Dのデフォルト設定では変化が小さすぎる点」
これは、Live2Dだけの事情だと思います。
Live2Dのサンプルにあった口パクの感度のデフォルト値が低く設定しているようにみえたのですが、感度設定を上げれば特に問題なかったと思います。

>フックするのが非常に難しい
ちょっとややこしいのですが、次の手順が必要になってくると思います。

1、AdvGraphicObjectAvatar を継承した  MyAdvGraphicObjectAvatar などのコンポーネントを作成して、
AddGraphicComponentOnInitをoverrideして、リップシンクコンポーネントのAddComponentクラスを変える

2-a AdvGraphicInfo.CallbackCreateCustom というstaticなコールバックで、AdvGraphicObjectAvatarではなくMyAdvGraphicObjectAvatarがAddComponentされるようにする

または

2-b MyAdvGraphicObjectAvatar をすでにAddCompoentしたプレハブを作成して、そのプレハブをカスタムオブジェクトとして表示するようにする。
プレハブのカスタムオブジェクトの表示の仕方はこちらです。

2-aのほうが簡単ですが、
>WAVを解析した口パク用テーブル
のように、モデルごとに異なるデータが必要な場合は2-bのほうが融通が利くようになると思います。





2021年2月8日月曜日 18:36:12 UTC+9 taku_hsy:

taku_hsy

unread,
Feb 9, 2021, 12:52:51 AM2/9/21
to 宴ユーザーグループ
早速のご回答ありがとうございます。

諸々了解いたしました。
なるほど、カスタムオブジェクトとしての表示は素直そうですね。
その際に、上記のLipSyncVolumeとつなげることもそう難しくなさそうな気も致しました。
ご教授いただきありがとうございました。
早速試してみたいと思います。

2021年2月9日火曜日 12:06:57 UTC+9 マッドネスラボ:

taku_hsy

unread,
Feb 9, 2021, 10:19:40 AM2/9/21
to 宴ユーザーグループ
マッドネスラボ様

お世話になっております。
上記の方法で、カスタムオブジェクトの表示と言う所で進めていたのですが、

教えていただいたSpineカスタムオブジェクトのプレハブの参考ですと、
Characterシート内のFileNameの部分はプレハブ名とのことですが、現状、Avatarのシステムを利用しているため、
ここにはアバターのアセットが入っている状況です。

これはキャラやパターンごとのアバターアセットをAddした状態でプレハブを同量用意する、という形か、
それともSubFileNameにアセット名を記載し、アクセスするなどのやり方がよいのでしょうか?
リファレンスを見るかぎりですと、SubFileNameはダイシング専用のような扱いですが、
こちらの引数をカスタムオブジェから取得し、アバター継承オブジェクトとしてふるまうことは可能でしょうか?

ご助言の程よろしくお願いいたします。

2021年2月9日火曜日 14:52:51 UTC+9 taku_hsy:

マッドネスラボ

unread,
Feb 10, 2021, 12:46:34 AM2/10/21
to 宴ユーザーグループ
AvatorのFileNameが同じもの=1プレハブであらかじめ用意しておくという形がよいかと思います。
なので、複数プレハブが必要になると思います。

>SubFileNameにアセット名
一応可能ではあるのですが、これをするとアバターのアセットを独自にロードする必要があるので、ロード処理が複雑になると思います。
宴の場合はシナリオを先読みしてロードを終わらせておく処理があるのですが、それが利かなくなってしまうので、シナリオが止まってしまったり、逆に表示が遅れる可能性があります。
(ダイシングの場合のSubFileNameは、ダイシングにする前のファイル名(テクスチャ名)を指定する項目に使っているので、ロードは入らないです)



2021年2月10日水曜日 0:19:40 UTC+9 taku_hsy:

taku_hsy

unread,
Feb 10, 2021, 8:44:57 AM2/10/21
to 宴ユーザーグループ
お世話になっております。

> 1、AdvGraphicObjectAvatar を継承した  MyAdvGraphicObjectAvatar などのコンポーネントを作成して、
>  AddGraphicComponentOnInitをoverrideして、リップシンクコンポーネントのAddComponentクラスを変える
> 2-b MyAdvGraphicObjectAvatar をすでにAddCompoentしたプレハブを作成して、そのプレハブをカスタムオブジェクトとして表示するようにする。
> プレハブのカスタムオブジェクトの表示の仕方はこちらです。

こちらのやり方で試しているのですが、
public class MyAdvGraphicObjectAvatar : AdvGraphicObjectAvatar, IAdvGraphicObjectCustom, IAdvGraphicObjectCustomCommand

指定通り上記のように宣言した場合、
internal override void OnEffectColorsChange(AdvEffectColor color)
internal override void SetCommandArg(AdvCommand command)
こちらが継承大元のAdvGraphicBase内でinternalのため、 IAdvGraphicObjectCustom, IAdvGraphicObjectCustomCommandのpublicな実装と衝突する様子です。

こちらどういうアプローチがベターかお教えいただけますでしょうか。
よろしくお願いいたします。




2021年2月10日水曜日 14:46:34 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Feb 10, 2021, 11:40:13 AM2/10/21
to 宴ユーザーグループ
すみません。というか、プレハブを使う場合は、AdvGraphicObjectAvatarなどの宴のグラフィック制御コンポーネントを使える設計になってませんでした。
基本的には、宴側の表示形式を使わずにUnityの3Dモデルや、独自の形式の描画をするためのものにしか使えませんでした。
先述した2-aのやりかたのほうが楽だったかもしれないです。
すみません。

一応、宴のコンポーネントを継承したプレハブを扱えるように拡張してみました。
いくつか更新が必要なので、添付のパッケージファイルを適用してください。
添付のパッケージファイルのうち
AdvGraphicInfo、AdvGraphicObject、AdvGraphicObjectAvatarは今回の更新に必要な処理のために書き換えたものです。

サンプルとして、
AdvGraphicObjectAvatarを継承したスクリプトを Utage\Scripts\ADV\Graphic\Object\UIGraphic\AdvGraphicObjectAvatarCustom.cs に
AdvGraphicObjectAvatarCustomを使って作成したアバターのプレハブを Utage\Sample\Resources\Sample\Texture\Character\OverrideAvatar.prefab に置いてあります。
この二つはサンプルなので確認が終わったら削除してください。


AdvGraphicObjectAvatarCustom.csは
デフォルトのコンポーネントでは、動的にコンポーネントの追加したり、ファイルデータを設定したりするものなので
その辺の処理をoverrideして書き換えてあります。

Characterシートのほうはこのように設定してください。
ss_1442.png

・FileNameにプレハブのパスを設定
・FileTypeに新しく追加した「OverridePrefab」というタイプを設定
これで、一応動くと思います。

本来の目的であるリップシンクコンポーネントの書き換えは、
プレハブのほうのコンポーネントを差し替えるなどしたのち、GetComponentするクラス名をそれに合わせるなどしてください。



2021年2月10日水曜日 22:44:57 UTC+9 taku_hsy:
OverrideAvator.unitypackage

taku_hsy

unread,
Feb 12, 2021, 2:29:01 AM2/12/21
to 宴ユーザーグループ
マッドネスラボ様

お世話になっております。
サンプルまでわざわざご用意いただきまして、ありがとうございます!
こちらの方法で上手く行きました。
LipSyncVolumeとつなげての精度も私ども的には十分に見られたので、
テーブルではなくこちらのパラメータを利用してのリップとさせていただこうかと思います。

お手数おかけいたしました。
ご対応いただきまして、ありがとうございました。

2021年2月11日木曜日 1:40:13 UTC+9 マッドネスラボ:

taku_hsy

unread,
Mar 11, 2021, 5:29:11 AM3/11/21
to 宴ユーザーグループ
マッドネスラボ様

お世話になっております。
新規にスレッドを立てようか迷いましたが、リップシンク絡みで見つけたのでこちらに記載します。

LipSynchAvatarにサンプルコードがあったように、
SoundManager の GetVoiceSamplesVolume を利用して、サウンドファイルの波形を取得していたのですが、
キャラクターごとのボリュームを導入すると、ボリュームを0にした場合に
GetVoiceSamplesVolume の返り値が0になってしまい、口パクが行えない様子です。

SoundManagerを追って行った所、SoundAudio のGetVolume ではボリューム計算をしているようには見えましたが、直接的に GetVoiceSamplesVolume を下って行った範囲ではボリュームが乗算されるコードは見受けられなかったので追うのが困難と判断し、一旦、ご質問させていただきました。

こちら、何か原因および、ソフトウェア側でのボリュームを乗算しないプリミティブな音声ソースの波形を取得する方法などはございますでしょうか。

SoundManagerなど、エンジンコアの部分に触れるため、自作するとなるとそれなりに気合が必要なため、
ご助言いただければと思います。

なお、サウンドグループごとの個別ミュートに対応させたいと思っているのですが、
サウンド再生回りもかなり色々な所に食い込んでいるため、設定でミュートを押した場合に、
SoundManager への設定 ボリュームを強制的に0%にする仕様で回避させていただいています。

そう言う事情もありまして、発見に至った次第であります。

お手数ではありますが、何卒よろしくお願いいたします。





2021年2月12日金曜日 16:29:01 UTC+9 taku_hsy:

マッドネスラボ

unread,
Mar 11, 2021, 6:39:26 AM3/11/21
to 宴ユーザーグループ
SoundAudio.cs の audio.GetOutputDataはUnity公式の機能で、ボリュームの影響はUnityの内部で起きています。
プリミティブな波形データを取得する方法もちょっと心当たりがないです。Unityが対応しているかもわからないです。


2021年3月11日木曜日 19:29:11 UTC+9 taku_hsy:

マッドネスラボ

unread,
Mar 11, 2021, 6:53:22 AM3/11/21
to 宴ユーザーグループ
UnityにはAudioMixerというのがあるのですが、宴のサウンドマネージャーはそれがなかったころに作ったものなので、
全体ボリュームや、グループのボリュームの影響が出てしまっているのだと思います。

なっていない音のボリュームを取得するようなことが、AudioMixerで解決するのかはわからないですが、可能性があるとしたらそれだと思います。
ですが、AudioMixerに対応するには、宴のデフォルトのSoundManagerに代わるものをゼロベースで作る必要があるかと思います。


2021年3月11日木曜日 20:39:26 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Mar 11, 2021, 7:04:50 AM3/11/21
to 宴ユーザーグループ
ゼロベースで作るのであれば、宴のSoundManagerと共通インターフェースを持たせて、それを設定することで一応サウンドマネージャーを自作のものにすることができます。
https://madnesslabo.net/utage/?page_id=7519#i-4


2021年3月11日木曜日 20:53:22 UTC+9 マッドネスラボ:

taku_hsy

unread,
Mar 15, 2021, 3:40:25 AM3/15/21
to 宴ユーザーグループ
マッドネスラボ様

お返事遅くなりました、ご対応いただきありがとうございます。
上記の点、了解いたしました。
ゼロベースでのサウンドマネージャ実装は工数的にもなかなか厳しいものがあるため、
以前の別案でありましたリップシンクテーブルを別途ツールにて実装し、
パラメータテーブル経由で読み込ませる手法に切替させていただきました。

色々とご助言いただきまして、ありがとうございました。


2021年3月11日木曜日 21:04:50 UTC+9 マッドネスラボ:

taku_hsy

unread,
Jun 5, 2021, 7:38:08 AM6/5/21
to 宴ユーザーグループ
マッドネスラボ様

いつも大変お世話になっております。
すいません、別スレッドにしたほうが良いのか迷ったのですが、関連があるかもしれない為、こちらで。

開発時の起動軽量化などを目的として、
上記のページを参照してアセットバンドル化を行ったのですが、
Dicingやボイス、サウンドなどは正常に読み込めるのですが、Avatarアセットのみ表示が行えません。

NullReferenceException: Object reference not set to an instance of an object
Utage.AdvGraphicObjectAvatar.OnPostRefresh () (at Assets/Utage/Scripts/ADV/Graphic/Object/UIGraphic/AdvGraphicObjectAvatar.cs:82)
UnityEngine.Events.InvokableCall.Invoke () (at <c7864a0eaeb24b2a999fb177623d54b4>:0)
UnityEngine.Events.UnityEvent.Invoke () (at <c7864a0eaeb24b2a999fb177623d54b4>:0)
Utage.AvatarImage.Refresh () (at Assets/Utage/Scripts/GameLib/UI/Image/Avatar/AvatarImage.cs:138)
Utage.AvatarImage.LateUpdate () (at Assets/Utage/Scripts/GameLib/UI/Image/Avatar/AvatarImage.cs:128)

上記の例外を出しながら、画面上にアバターが表示されないまま、進行します。
標準のAvatarおよび、このスレッドでアドバイス頂いた、カスタムしたAvartarプレハブ両方とも起きている状況です。

バニラなサンプルでのテストは済んでない状況での報告で申し訳ございませんが、
取り急ぎまして、ご相談させて頂ければと思います。



2021年3月15日月曜日 16:40:25 UTC+9 taku_hsy:

マッドネスラボ

unread,
Jun 5, 2021, 10:53:54 PM6/5/21
to 宴ユーザーグループ
すみません。アセットバンドルを試してみましたが、バグを再現できましたんでした。
再現できないため動作確認できていないのですが、一応エラーの出ている箇所で、内部でNULLチェックが入るメソッドを使うようにしましたので、添付のパッケージファイルを試してみてください。


2021年6月5日土曜日 20:38:08 UTC+9 taku_hsy:

マッドネスラボ

unread,
Jun 5, 2021, 10:55:04 PM6/5/21
to 宴ユーザーグループ
すみません。ファイルの添付を忘れていました。
こちらに添付したパッケージを試してみてください。


2021年6月6日日曜日 11:53:54 UTC+9 マッドネスラボ:
FixAvatorAssetBundle.unitypackage

taku_hsy

unread,
Jun 7, 2021, 4:16:57 AM6/7/21
to 宴ユーザーグループ

マッドネスラボ様

ご対応いただきありがとうございます。
エラーメッセージの量が減ったため、具体的な不具合箇所を特定できたのですが、
こちらのスレッドでご指定頂いたAdvGraphicObjectAvatarCustom
を参考にした作り方が、起因になっているようで、
アセットバンドル使用時は
ChangeResourceOnDraw内でAvatar.AvatarDataがNullとなっている様子で、
初期化のAddGraphicComponentOnInit内の
 Avatar = this.gameObject.GetComponent<AvatarImage>();
時点で、すでに Avatar.AvatarData はNullとなってしまってました。
なお、カスタムアバター(Characterシート内のFileTypeがOverridePrefab)の指定フォルダは
相対パスで1階層深い指定になっております。
 AdvEngineStarterの読込設定がLocalですと正常に動き、Avatar.AvatarDataにはプレハブ登録されているアバターイメージが付与されたままGet出来ているのが確認済みです。

ちなみに、「Avatarでも同様の現象が~」とお伝えしてしまいましたが、
シーンの最初からAvatarで表示する分にはAvaterを利用している限りはアセットバンドル時も正常に表示されました。
ですのでプレハブ使用のAvatarCustomの作り方時のみの現象と思われます。

念のため、ResourceConverterの設定は
BuildMode OnlyEditor
RenameType Rename
TargetFlag Windows
Option None
OutputType Default
SeparateChapter off
OutputLog On
としております。

もう少し、自力で追ってみますが、何かお気づきの点がございましたら、
ご助言の程よろしくお願いいたします。


2021年6月6日日曜日 11:55:04 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jun 7, 2021, 6:52:18 AM6/7/21
to 宴ユーザーグループ
プレハブをアセットバンドルを使う場合は、内部で参照しているものをアセットバンドルの対象とならないように、置き場所のフォルダを変えてください。

アバター用のデータをResources以下などから外す
ss_1520.png

Resources以下にはプレハブだけおいて、アバター用のデータを置かない。
ss_1521.png

こちらの問題と同じです。

ややこしい話なんですが、Unityのアセットバンドルの作り方がかなり面倒くさくて
・参照されるアセットを個別にアセットバンドルにするか
・参照されるアセットバンドルもまとめて一つのアセットバンドルにする
という2パターンありまして、
宴のアセットバンドル作成のコンバーターの場合は、対象フォルダ以下にあるものはすべて個別のアセットバンドルにしています。
なので、対象フォルダに参照関係にあるアセット(プレハブと、アバターデータの.asset)があると、それぞれ個別のアセットバンドルになってしまって、
プレハブをロードしたときに、アバターデータのアセットがロードされておらずリンクがきれてしまうという問題があります。

注意点として、プレハブをたくさん作っていて、それぞれのプレハブから同じアバターデータを参照している場合は、
本来同じアバターデータのはずが、1プレハブごとに別のアバターデータになってしまって、結果重複した複数のアバターデータをロードすることなってメモリ消費等が無駄に増えてしまう恐れがあります。
もし、それを避ける必要ある場合には、宴のファイルローダーですと機能が足りませんので、
Unity公式の拡張プラグインの「Addressable Assets System」というのを使えるように、ファイルロード処理をカスタムしてください。



2021年6月7日月曜日 17:16:57 UTC+9 taku_hsy:

taku_hsy

unread,
Jun 7, 2021, 11:10:30 AM6/7/21
to 宴ユーザーグループ
ご回答ありがとうございました。

Dicingなど他の物はResourceから外していたんですが、AvatarはCustumする前のテスト時の名残でResource内に置いたままPrefavから参照してしまってました。
おかげさまで外部に出すことで正常に動きました。初歩的なエラーでお手を煩わせてしまいました。
現状では問題なさそうですが、状況に合わせてAddressable Assets Systemの方も確認させていただきます。

ありがとうございました。


2021年6月7日月曜日 19:52:18 UTC+9 マッドネスラボ:

taku_hsy

unread,
Jun 17, 2021, 12:02:24 PM6/17/21
to 宴ユーザーグループ
マッドネスラボ様

大変お世話になっております。
再度、アバター表示に関しましてお尋ねしたい状況が発生いたしましたので、お心当たりがありましたらご助言いただきたいのですが……

カスタムアバターを加えたブレハブをアセットバンドル化し、参照先のアバターをアセットバンドル外に設置いたしまして、
ひとまずは正常に表示されることが確認でき、事なきを得たのですが、
その後から既読スキップなどで高速でシーンを進めるなどを行った場合、
そこそこの確率でアバターを表示しているレイヤーが「真っ白」になり、特にメッセージウインドウへのアイコン表示箇所は、タイトルへ戻るなど、
かなり初期化に近い動きをした場合も「真っ白」が継続してしまう現象が発生するようになってしまいました。

エディターで追ってみますと、「RenderTextureManager」の「RenderTextureSpace」のプレビューにステンシル?テクスチャが「全面抜かれない状態」となっており、
AvatarImageをInspectorで開きますと、プレビューは表示されずに、下記のエラーが定期的にで続ける状態です

null texture passed to GUI.DrawTexture
UnityEngine.GUI:DrawTexture (UnityEngine.Rect,UnityEngine.Texture,UnityEngine.ScaleMode,bool)
Utage.AvatarData:OnPreviewGUI (UnityEngine.Rect,UnityEngine.GUIStyle,Utage.AvatarPattern) (at Assets/Utage/Scripts/GameLib/UI/Image/Avatar/AvatarData.cs:304)
Utage.AvatarImage/UguiNovelImageAvatarInspector:OnPreviewGUI (UnityEngine.Rect,UnityEngine.GUIStyle) (at Assets/Utage/Scripts/GameLib/UI/Image/Avatar/AvatarImage.cs:186)
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)

Inspector上で見る限り、AvatarDataもアバターのパターンも読めているようなのですが、
AvatarData内の参照データのプロパティを確認するとこちらでは設定をしていないデフォルトアバターのカテゴリー・タグ構成となってしまっています。

この状態の時にエディター上でAvatarImageのAvatarDataをクリックし、明示的に同じデータを選択し直してあげると、
プレビュー、画面ともに正常に表示されるようになります。

ただ、次のシーン(明示的に変えてやったRenderTextureSpaceが破棄されるまで)に切り替わると、
再度同じレイヤーが「真っ白」となりAvatarDataが元に戻ってしまいます。

現状、特定の動作というよりは特定のシーンを通過した際に起きやすい(100%起きるわけではない)というのが確認されています。

また、「真っ白」の現象が起こる前からRenderTextureSpace内のAvatarImage>AvatarDataはプレビュー共に正常に出ていませんでした。
これで画面は正常に出るのもまだ追えていないのですが……。

初歩的な見落としの可能性もございますが、何か心当たりがありましたらご助言いただければと思います。
よろしくお願いいたします。



2021年6月8日火曜日 0:10:30 UTC+9 taku_hsy:

taku_hsy

unread,
Jun 18, 2021, 3:25:57 AM6/18/21
to 宴ユーザーグループ
追記です。

先程、アセットバンドル化前の状態での動作確認を行いましたが、
RenderTextureSpace内のAvatarImage>AvatarDataはプレビューは正常に表示されており、
スキップなどの高速なアバターの切り替えなどを何度か繰り返した場合でも、
前記の「真っ白になる」現象の発生は発生しないことを確認いたしました。
試行回数の問題もありますが、アセットバンドル化した状態の場合、
同じシーン区間をスキップしますと、ほぼ数回で確実に発生していたため、
おそらくはアセットバンドル化は1要因と思われます

これがアセットバンドル化に伴うUnity帰属の原因なのかはわかりませんが、
取り急ぎ報告まで。

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


2021年6月18日金曜日 1:02:24 UTC+9 taku_hsy:

マッドネスラボ

unread,
Jun 18, 2021, 6:56:48 PM6/18/21
to 宴ユーザーグループ
宴は、ロードが終わっていない素材を含むコマンドは実行前などにロード待ちが入るようにしているので、ロードが遅れたりしてもその点は問題ないはずです。
アセットバンドルでのみ発生して、不定期に発生するのであれば、おそらくアンロードになんらかの問題があるのだと思います。

FileManagerのUnloadTypeをNoneにしてみてください。
Noneだとアンロードが行われなくなります。(メモリがリークするので通常は使いませんが)
Noneにして真っ白になる不具合がでないようなら、アセットバンドルでプレハブを使った場合にアンロード処理になんらかの不具合があるということになります。

今回はアセットバンドル化したプレハブを使っているケースなので、Unity側の暗黙的な処理が影響しているのかもしれません。
もしかすると、アンロード済み(またはアンロード中)のプレハブが再ロードされた場合に、プレハブ自体のロードは正常に終わったように見えてもプレハブからリンクされている素材がロードできていない(またはアンロードされてしまう)ということが、Unityの仕様か不具合として起きうるのかもしれません。

また、お手数ですがこちらに再現用のプロジェクトを送信していただるでしょうか。


2021年6月18日金曜日 16:25:57 UTC+9 taku_hsy:

taku_hsy

unread,
Jun 19, 2021, 6:46:43 AM6/19/21
to 宴ユーザーグループ
マッドネスラボ様

> FileManagerのUnloadTypeをNoneにしてみてください。
Noneにした場合、(少なくとも再現性が高まる状況までの試行回数下において)現象が確認できなくなりました。

アンロードのご指摘で、より具体的に検証が出来ましたが、
複数のAvatarを出来るだけ読み込んでいこうと、色々なAvatarファイルが読み込まれ、表示されるようにシーン遷移を辿っていくと
スキップ等関係なく「真っ白」となることが確認されました。

ご指摘いただいた場所へ、再現用プロジェクトをお送りさせていただきました。
お手数ですが、ご確認いただけるようでしたら何卒よろしくお願いいたします。





2021年6月19日土曜日 7:56:48 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jun 19, 2021, 4:03:43 PM6/19/21
to 宴ユーザーグループ
プロジェクトの送信ありがとうございます。
再現を試みたところ、10回ほど繰り返して1度だけ再現しました。
なかなか再現ができないため、原因の特定が難しいのですが、
・開発環境によって起きやすさが変わる(スペックなどの速度要因で起きやすいが変わる?)
・アンロードがらみ
・・・ということまではわかったので、
「アンロード中にロードされる」という状況が怪しいかと思います。
なので、アンロードが確実に終わってからロードを始めるような修正を入れました。

ただ、意図的にアンロード中にロードをしても特にバグが起きなかったので、この修正の効果があるかがちょっとわかりません。
一応、何度か試してみて再発はしなくなったと思うのですが、私の環境ですと再現自体が一度しかできなかったので、確認がちょっと難しいです。
お手数ですが、添付のパッケージファイルで確認よろしくお願いします。

また、Unityのバージョンは「Unity2020.1.7f1」でよかったでしょうか?
最初は安定版であるUnity2020.3(LTS)で再現を試みて、そちらでは3回ほど試行してバグは再現されませんでした。
Unityは安定版(LTS)以外ですと、割と多くのバグがありますので、可能であればUnity2020.3の使用をお勧めします。



2021年6月19日土曜日 19:46:43 UTC+9 taku_hsy:
FixUnload.unitypackage

taku_hsy

unread,
Jun 20, 2021, 2:44:41 AM6/20/21
to 宴ユーザーグループ
マッドネスラボ様

お世話になっております。
ご対応いただきありがとうございました。
早速導入して試したのですが、大きな変化は感じられず、やはり真っ白なアバター表示がされてしまうことを確認しました。

試しにRange Of Files On Memoryの値を増やした場合を試してみたのですが、
発生までの時間はかかるものの、やはり同様の現象が起きてしまいました。

返信ツリーにつなげてしまっていたため、お伝えを忘れてしまっていましたが、
現在はUnityのバージョンは上げており、当該現象が起こるのは2020.3.6f1でのビルドとなっております。

対処療法的な解決策ですが、Avatar類だけローカル化するなどを思いついたのですが、
こちらはAsset File ManagerのLoadSettingやCustomLoadManagerコンポーネントなどで可能なのでしょうか?
それともAddressable Assets Systemなどを利用して自前でカスタムする必要が出てしまいますでしょうか。



2021年6月20日日曜日 5:03:43 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jun 20, 2021, 4:24:20 PM6/20/21
to 宴ユーザーグループ
確認ありがとうございます。
もうちょっと調査してみます。


> Avatar類だけローカル化する
こちらの手法で可能です。
対象がアバターかどうかを名目規則などで判別するようにすれば、次の要領でできると思います。

    bool IsAvatorType(AssetFileInfo fileInfo, IAssetFileSettingData settingData)
    {
        if (fileInfo.FileType != AssetFileType.UnityObject) return false;
       AdvGraphicInfo info = settingData as AdvGraphicInfo;
        return (info != null &&  Checkアバターの命名規則(info.FileName)  );
    }
 
//制的にローカルからロードする処理
internal class AdvLocalAvatorFile : AssetFileUtage
{
    public  AdvLocalAvatorFile (AdvVideoLoadPathChanger pathChanger, AssetFileManager assetFileManager, AssetFileInfo fileInfo, IAssetFileSettingData settingData)
        : base(assetFileManager, fileInfo, settingData)
    {
        fileInfo.StrageType = AssetFileStrageType.Resources;
        AdvGraphicInfo info = settingData as AdvGraphicInfo;
          string fileName = info.FileName;
         this.LoadPath = FilePathUtil.Combine(pathChanger.RootPath, fileName);
    }
}

2021年6月20日日曜日 15:44:41 UTC+9 taku_hsy:

マッドネスラボ

unread,
Jun 20, 2021, 9:40:03 PM6/20/21
to 宴ユーザーグループ
調査したところ、どうもプレハブの中で使っているspriteまでは正常にロードできているものの、テクスチャ(SpriteAtlas)を見失っている状態のようです。

エラーが起きるときは、spriteインスタンスのtextureプロパティがnullになり、.packedプロパティがfalseになっているようです。


if (sprite.texture == null)
{
Debug.LogError("Sprite texture is null",part);
}
if (!sprite.packed)
{
Debug.LogError("Sprite is not packed",part);
}

これは宴側では書き換えていないというか変更できるようなものではないので、Unityの内部で起きていることの結果のようです。

色々調べてみたのですが、似たようなケースはあるらしくUnityの既知の未解決の不具合の一つのようです。


日本語のUnityユーザー助け合い所でも似たような報告があって、そのリンク先では、
「EditorではなくExeで確認してください」という回答がついていました。
ただ、これはちょっと使い方が異なる場合なので、現象がにてるだけかもしれません。

Spriteの場合は「遅延ロード」といって、テクスチャを後からロードする機能があります。
動的にspriteの画像を差し替えて高解像度、低解像のリソースを切り替えたりられたりするものです。
この機能を使ってテクスチャが未ロードのspriteを使った時は、真っ白に表示されるようなので、それと同じ結果になっているようです。
ただ、デフォルトではこれはオフになっている機能で、送信していただいたプロジェクトでもオフになっていました。

たぶんですが、Unityの不具合として、アセットバンドルでSpriteAtlasを使っている場合に「エディター上のSpriteAtlasとアセットバンドル内のSpriteAtlas」をうまく識別できていないケースがあって、「遅延ロード」があるために「未ロードのままspriteを使用」ということが許可されているためエラーも出ない。
・・・という感じなのかと思います。


2021年6月21日月曜日 5:24:20 UTC+9 マッドネスラボ:

taku_hsy

unread,
Jun 20, 2021, 9:42:06 PM6/20/21
to 宴ユーザーグループ
マッドネスラボ様

個別ローカル化の手法、ありがとうございました。
あの後判明したことですが、どうもエディター上での実行時でのみ、発生している様子でした。
エディターでSkip動作を行った際は、ゲームの途中で読込もしくはアンロードと思われる数秒の時間停止が
定期的に(おそらくRange Of Files On Memory等に連動してると思われる間隔で)発生していたのですが、

exeファイル化した状態だと上記の時間停止が発生せず、エディターで当該現象が発生する工程を繰り返しても
今のところ同様の現象が発生しておりません。

より長時間の試行で発生する可能性は否定できない為、原因を確認していただけるのは大変ありがたいですが、
リリース時には発生しない可能性もあるため、もし判明しなかったとしても、しばらくは様子を見たいと思います。

とりいそぎ、上記の事が原因解明の一助になればと思い、報告させていただきます。
何卒、よろしくお願いいたします。




2021年6月21日月曜日 5:24:20 UTC+9 マッドネスラボ:
確認ありがとうございます。

taku_hsy

unread,
Jun 20, 2021, 9:46:46 PM6/20/21
to 宴ユーザーグループ
すいません、2回目の投稿を見逃してました。

>「EditorではなくExeで確認してください」という回答がついていました。

同じ結論に落ち着いてた様子なので、Unity側の不具合なのですね。
了解いたしました。

色々と調査くださってありがとうございました!


2021年6月21日月曜日 10:42:06 UTC+9 taku_hsy:

マッドネスラボ

unread,
Jun 20, 2021, 10:27:12 PM6/20/21
to 宴ユーザーグループ
ご確認ありがとうございます。
ひとまずは、様子見ということで了解しました。

また、アセットバンドルの件とは別なのですが、
頂いたプロジェクトがどうも異様にゲームの起動やコンパイルなどが遅く、数十秒単位で「Restore Managed References」というUnityのダイアログが出るようになってしまっていたので、こちらのほうも宴が原因っぽいので調べました。

宴は、エクセルファイルをインポートしたデータを *.book.asset というUnityが認識できる形式(ScriptableObject)にしておくのですが、これが1GB近くになっていました。
結果、内部でレストアが走るたび(ゲームプレイ開始時やコンパイル後)1GBの巨大なデータを読み込みしなおしてしまっているという状態になっていました。

原因はエクセルファイルのほうで、データの終端部(Ctrl+Endで終端に飛べます)が10万行目だったりと、実データ以外に空のデータが含まれていたため
それらの空の巨大なデータもインポートしていたことで重くなっていたようです。

対応として、
・余分なデータをインポートしないようにする
・エクセルのデータの終端が大きすぎる場合は警告を出す
という修正パッケージを作成しました。
修正後は、 *.book.assetは数M程度に収まるようになり、頻繁に固まることはなくなると思います。

いただいたのはあくまで再現用のプロジェクトなので、実際のプロジェクトに影響が起きていたかはわかりませんが、必要に応じて添付のパッケージファイルを適用してください。
デバッグログが余計だと思ったときは、コメントアウトしてください。
最終的には警告を出す行数などを設定できるようにして、余計なログをださないようにします。
デバッグログを消しても、インポート時に余分なデータは自動的に削除されるのですが、エクセル本体のほうの終端が修正されないとインポート自体は重いままかと思います。
なるべくエクセルファイルのほうの終端データが大きくなりすぎないようにしてください。



2021年6月21日月曜日 10:46:46 UTC+9 taku_hsy:
ShapeUpGrid.unitypackage

taku_hsy

unread,
Jun 21, 2021, 2:03:43 AM6/21/21
to 宴ユーザーグループ
マッドネスラボ様

ありがとうございます。
早速チェックさせていただきました。
10万行を超えるシートの削減を行いました。
心当たりとしては、
・シナリオ(txt)からxlsxに移行する際にpythonスクリプトを利用してるのでその影響
・LibreOfficeなど互換系のオフィススイートを使用してるスタッフがいる事
等が影響していたかもしれません。

book.asset自体はそこまで軽量化できませんでしたが、
起動は早くなった気がします。

最終的には1000行を超えるスクリプトは残っているため警告は残っておりましたが、
こちら1シートに1000行を超えるのは推奨されないのでしょうか?

ご対応いただきありがとうございました。

2021年6月21日月曜日 11:27:12 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jun 21, 2021, 3:25:45 AM6/21/21
to 宴ユーザーグループ
>1シートに1000行を超えるのは推奨されないのでしょうか?

大丈夫です。.projectアセットの「Check Blank Row Count  On Import」の部分を1万など好きな数字に変えください。
ss_1530.png

ちょっと別件の更新部分と混ざってしまうのでお渡しできないのですが、
最終的にはシナリオビルダー上でこの数字を設定できるようにします。



2021年6月21日月曜日 15:03:43 UTC+9 taku_hsy:

taku_hsy

unread,
Jul 20, 2021, 11:20:35 AM7/20/21
to 宴ユーザーグループ
すいません、アバター周りでの不具合のため、また継続してこのツリーで書かせていただきます。

宴のバージョン: 宴3.10.1+修正パッチ類
UnityのバージョンとOS: Unity2020.3.6f1 Windows

・アセットバンドル化したプレハブアバターが表示されている画面をセーブした場合、
再起動直後など、その画面で表示されてるアバターを【ゲーム開始時から一度も読みこんだことがない状態】でロードした場合、画面に表示されない。
という不具合が出ています。
GraphicManagerのレイヤー上には登録されているのですが、テクスチャーが読み込まれてないように見受けられました。
saveavt.png
その後、メッセージを進めて別の新しい該当キャラのセリフが表示される際に、レイヤー上に別オブジェクトとして正常に表示されます。
(ロード時に読み込まれたオブジェクトはそのままレイヤー上に残り続けます)
再現性は再起動時は今のところ100%で、Build版でも起きてることを確認しています。

バニラサンプルでのアセットバンドル化が試せていないのですが、
バニラサンプルでのアバターおよび、当タイトルの古いバージョンで、オーバーライドアバターを使ってないアバターの場合は
上記の現象が起きないことを確認いたしましたので、アセットバンドル化より、オーバーライドアバターのロード周りの問題な気がいたしております。

以前、この質問ツリーの流れでお渡しした古いバージョンでも起きることを確認しております。
もしやり方が必要な場合は、別途お送りいたします。

お手数ですが、調査確認いただけますでしょうか?
こちらの問題が疑われるようでしたらご指摘いただければと思います。

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


2021年6月21日月曜日 16:25:45 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jul 20, 2021, 2:14:34 PM7/20/21
to 宴ユーザーグループ
すみません。宴側のプレハブ拡張の場合のロード処理に不具合がありました。
修正しましたので、パッケージファイルを試してみてください。

パッケージには今回の件以外、次回バージョンアップで適用予定の修正や更新も含まれています。



2021年7月21日水曜日 0:20:35 UTC+9 taku_hsy:
FixPrefabLoadBugTo10.2.unitypackage

taku_hsy

unread,
Jul 25, 2021, 3:17:45 AM7/25/21
to 宴ユーザーグループ
返信遅くなりました。

今のところ正常に動いております。ありがとうございました。
素早いご対応ありがとうございました!


2021年7月21日水曜日 3:14:34 UTC+9 マッドネスラボ:

taku_hsy

unread,
Aug 20, 2021, 12:13:21 PM8/20/21
to 宴ユーザーグループ
宴のバージョン: 宴3.10.2+パッチ
UnityのバージョンとOS: Unity2020.3.16f1 Windows
  
すいません、再度、アバター周り、特にロード周りでの不具合のため、また継続してこのツリーで書かせていただきます。
特定のレイヤーに、プレハブアバターを表示した場合、
 CharacterOff
 WaitFadeObjects AllCharacterObjects
などでキャラクターをすべて消した後に、
直後のメッセージ表示画面でセーブを行い、ロードした際に、上記コマンドを通過してもキャラが消えず、
本来であれば消したはずのキャラクターが継続して表示されているケースが多発しています。
(100%ではないのが何とも言えないのですが......)
特に、一度その症状が確定したセーブデータは、ロードを行うたびに「消えずに残っている」→ロード→「正常に消えてる」→ロード→「消えずに残っている」
……と症状を完全に交互に繰り返す状態になります。

・一度消したキャラがそのまま画面に出続けると同名のレイヤーに別キャラが描画されても残ったままとなり、
グラフィックマネージャーには同レイヤーに複数キャラがぶら下がった状態でダブって表示されています。
・LayerOffコマンドに代えた所でも同じ現象は起きました。
・直後のメッセージがキャラID指定のない所謂「地の文」の時の方が起きる確率が高い
・シナリオビュワー的には表示されるときと正常に消えるときで、呼ばれてるコマンドに違いは見受けられない

・宴のサンプル(3.10.1アップ済み)の書き込みアバターでは発生しない為、プレハブ化が原因に見えます。

すいませんが現状、把握できてる部分は以上となります。
ご確認頂ければと思います。
起きる箇所では100%起きるため、必要に応じてサンプルは提供できると思います。

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









2021年7月25日日曜日 16:17:45 UTC+9 taku_hsy:

マッドネスラボ

unread,
Aug 21, 2021, 4:49:02 PM8/21/21
to 宴ユーザーグループ
詳細なご報告ありがとうございます。
タイミングバグなので、ロード待ちが正常に行われていないようで、見直してみたところ心当たりがある箇所があったので修正を加えました。
添付のパッケージファイルを適用してください。

もし修正パッケージを適用しても治らないようでしたら、
さらに調査いたしますので、お手数ですが再現プロジェクトをいただけるでしょうか。


2021年8月21日土曜日 1:13:21 UTC+9 taku_hsy:
FixPrefabLoad.unitypackage

taku_hsy

unread,
Aug 22, 2021, 4:33:20 AM8/22/21
to 宴ユーザーグループ
迅速な対応ありがとうございます。
こちら、今のところ、ロードを繰り返してもアバター表示は問題なく進行いたしております。
ありがとうございました!


2021年8月22日日曜日 5:49:02 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages