isobe_yakiのブログ

ニコ生ゲーム開発者向けの記事を書きます

【超小ネタ】アカシックエンジンでSEをループ再生したい

アカシックエンジンで再生できるオーディオタイプには'music'と'sound'がある。それぞれの特徴は以下だ。

  • music
    • ループ再生される
    • musicは一度に一曲ずつしか再生できない
    • BGM向け
  • sound
    • 単発再生
    • いくつでも同時に再生できる
    • 効果音向け

今回作っているゲームでBGMを止めることなくカッチコッチ🕑という短いSEをループ再生したい場面があったのだが、どちらもループのためにmusicタイプにしてたせいで同時再生ができなくて困った。

SEのループしたい時間は約3~7秒と決まっているしそんなに長くは無いので音源自体を10秒くらいのループに伸ばしてしまえば概ね解決できる案件ではあったのだが、なぜできないのかちょっと調べてみた。

そうしたところ、musicアセットを再生する際にAudioPlayerを作成するMusicAudioSystemが、1つのAudioPlayerを使い回しており、新たにplayしようとすると前回の再生をstopするような作りになっていた。

一方で、soundの再生に使われるSoundAudioSystemでは毎回新しいAudioPlayerを作成してくれていた。

ということで、手っ取り早く以下のようなハックをした。

// game.json
"clock": {
    "type": "audio",
    "path": "audio/clock",
    "systemId": "music",
    "global": true,
    "duration": 1000
},


// musicアセットだが多重再生できるようにする
g.game.assests.clock._system = g.game.audio.sound;

Game.audioのSoundAudioSystemをAudioAsset._systemへ上書きした。

これでBGMと同時にループするSEを再生することができた。もちろんニコ生の音量調整も適用される。(別解の書き方もあるのだがそっちだと音量調整が無視されてしまう)

ち・な・み・に

書くの忘れてたので追記させてもらうと、アカシックエンジンでは途中でリロードしたりゲームがスキップされたりするといったんすべての音の再生が止められてしまうのだが、その時再生中と見なされるmusicに関しては自動で再開される仕組みがある。ところが、この記事のハックをしたmusicはこの自動再開が効かなくなるので、ほんとにBGMとして流したいオーディオにはすべきではない。あくまでSEだけどループしたいオーディオに関してだけ使うべきである。


ということで今回もハックじみた方法で突破してしまったが、もし正式な方法で実現できるよとかご存知の方いたら教えていただきたい。というかこれも公式に要望として出した方がいいのかなと思いつつ締めたいと思う。