Active状態を変更すると鳴動し、アイドル状態用に別のオブジェクトも設定できるスクリプトです。
OnEnable時にはUniTaskを使用しています。
OnDisible側ではAudioSourceが同時にDisibleになった場合、音が鳴らなくなってしまうため、PlayClipAtPointを使用して、音を鳴らす別のオブジェクトを一時的に生成する形で実装しています。
SEObject.cs
using UnityEngine;
using Cysharp.Threading.Tasks;
public class SEObject : MonoBehaviour
{
private AudioSource _audioSource; // 同じゲームオブジェクトにAudioSourceをアタッチしておく
public AudioClip _enableSE;
public AudioClip _IdleSE;
public AudioClip _disibleSE;
private void Awake()
{
_audioSource = GetComponent<AudioSource>();
}
/// <summary>
/// _audioSourceが設定されていれば、表示SEを鳴らしてからアイドルSEを鳴らす。
/// </summary>
/// <returns></returns>
private async UniTask OnEnable()
{
if (!_audioSource)
return;
_audioSource.PlayOneShot(_enableSE);
// SE再生待ち
await UniTask.WaitUntil(() => _audioSource.isPlaying);
// SE再生終了待ち
await UniTask.WaitWhile(() => _audioSource.isPlaying);
// アイドルSE再生
_audioSource.clip = _IdleSE;
_audioSource.loop = true;
_audioSource.Play();
}
private async UniTask OnDisable()
{
// アイドルSEを止める
_audioSource?.Stop();
// SE再生終了待ち
if (_disibleSE)
// SEを一度鳴らすと消えるオブジェクトを生成
AudioSource.PlayClipAtPoint(_disibleSE, transform.position);
}
}