Qemelly(けめる)のプログラム備忘録

Unity / AtCoderについて書きます

LucidAudioをOnDestroyで止めたい場合はSetLinkを使おう

基本的にOnDestroyで止める方法は危険っぽいです。何回か以下のようなエラーが発生し、その次のPlayMode実行時に音が鳴らなくなりました。

Error: Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)

PlayMode実行時にLucidAudioオブジェクトがDontDestroyOnLoadに入っていないことから、LucidAudioオブジェクトの破棄に失敗しているものと考えられます。

失敗例

public class 良くない例 : MonoBehaviour
{
    [SerializeField] private AudioClip clip;

    private AudioPlayer _player;

    private void Start()
    {
        _player = LucidAudio.PlayBGM(clip).SetLoop();
    }

    private void OnDestroy()
    {
        _player?.Stop(); // LucidAudioが適切に破棄されない場合がある
    }
}

解決策

SetLinkを利用してMonoBehaviourのライフサイクルと紐づけましょう。

public class 多分こっちの方がいい : MonoBehaviour
{
    [SerializeField] private AudioClip clip;

    private void Start()
    {
        LucidAudio.PlayBGM(clip).SetLoop().SetLink(gameObject);
    }
}