AudioSource.isPlaying 只要程序失焦就会生效,同时也有可能莫名其妙触发,我这几天发现无规则触发了好多次。比较确定的是禁用 AudioSource 组件后,再启用,之后 isPlaying 的判断就会出问题,至于什么原理就不清楚了。
比较安全的方法是通过将当前时间与开始播放时的时间戳相减,你可以得到音频播放了多长时间。然后,将这个播放时长与音频剪辑的总时长(AudioClip.length)比较。如果播放时长小于音频总时长,那么可以认为音频仍在播放中。
代码大概如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class AudioSourceTimeChecker : MonoBehaviour { public AudioSource audioSource; private float startTime = -1; private float clipLength = 0;
public void PlayAudio() { if(audioSource.clip != null) { audioSource.Play(); startTime = Time.time; clipLength = audioSource.clip.length; } }
public bool IsAudioPlaying() { if(startTime < 0) return false;
float elapsedTime = Time.time - startTime; bool isPlaying = elapsedTime < clipLength; if (!isPlaying) { startTime = -1; } return isPlaying; } }
|