音を再生する件に関して2日に渡り調べてきたが、最終的にタイトルに書いたことができるかを調べてみた。
結論。できない。
現時点ではどうやらEngine側のソースを変更しない限りできないようだ。
-----------------------------------------------------------------------------
以下、調べてみた内容。
【公式ドキュメント】
AmbientSoundActor UsersGuide
音を再生する仕組みについては公式ドキュメントに書かれているように、基本的にActorやComponentとして再生する音源をLevel上に配置する。・・・なるほど、無理じゃん。
原則としてPersistentLeveが切り替わる際、切替前のPersistentLevelに置かれているActorやComponentは全て破棄される。切替前のPersistentLevel(以降、Map1)から音源Aを再生し、切替後の
PersistentLevel(以降、Map2)に移行した場合、Map1で定義した音源Aは破棄され、Map2への継続した再生はできない。
う~ん。無理っぽいぞ・・・
いや、調べるだけ調べてみよう。
【Case1】
Map1,及びMap2に同一GameModeを設定し、GameModeのBlueprintから音源を再生する。
[結果]
できない。Level生成時にGameModeも生成されるので、GameModeで生成した音源もLevel切替時に破棄される。というか、GameModeはWorldSetting.hに設定されるので、PersistentLevelでの継承はできない。
【Case2】 Widgetから音を再生する(PlaySound)。 [結果] できない。WidgetはLevel内に存在するもので、Level切替時に破棄される。
【Case3】 GameInstanceで音源を再生する。 [結果] できない。GameInstanceはComponetを設定できない。
【Case4】
C++側から無理やり再生してみる。
---------------------------------------------------------------------------
引数で音源のソースをBlueprintから指定して再生
---------------------------------------------------------------------------
void PlayMySound ( USoundCue * sound )
{
FAudioDevice* const AudioDevice = GEngine->GetAudioDevice();
if(AudioDevice)
{
FActiveSound NewActiveSound;
NewActiveSound.Sound = sound;
NewActiveSound.bIsUISound = true;
NewActiveSound.UserIndex = 0;
AudioDevice->AddNewActiveSound(NewActiveSound);
}
}
---------------------------------------------------------------------------
[結果]
できない。Level切替時にWorld情報も切り替わるのでダメなようだ。
残念ながらAudioの仕組みとしてできないっぽいなぁ。
「Level跨ぎで音源を再生する」なんて特殊っちゃー特殊だが。
回避策としては、PersistentLevel単位で分けるのではなく、SubLevel毎に作る設計をしなくちゃならないようだ。やむなし。
1. 無題