声音在时间流逝中交替
Alternation of sounds in time lapse
我试着写了一个方法,可以添加任意数量的声音,按指定的时间间隔轮流播放。
但问题是它工作不一致。即:
- 之前播放的一个声音过一段时间可能会重复几次
- 没有声音队列,等等。
我觉得问题是循环中的int i
是不断更新的,所以没有优先级。但是在输入检查并降低 int i
之后,它根本停止播放了。
using UnityEngine;
using System.Collections;
public class OneShot : MonoBehaviour {
public AudioClip[] Sounds;
public float Timer;
private float TimerDown;
void Start ()
{
TimerDown = Timer;
audio.clip = Sounds[0];
audio.Play();
}
void Update ()
{
int i;
for(i = 1;i < Sounds.Length;i++)
{
if(TimerDown > 0) TimerDown -= Time.deltaTime;
if(TimerDown < 0) TimerDown = 0;
if(TimerDown == 0)
{
TimerDown = Timer;
audio.clip = Sounds[i];
audio.Play();
}
else
{
i=i-1;
}
}
}
}
您不应在此处使用 for
循环。使用您的代码,您正在为数组中的每个 AudioClip 减少 TimerDown
。每个更新你应该只做 TimerDown -= Time.deltaTime
一次。
相反,您可以将 i
(索引)存储在更新循环之外。
private int i = 0;
void Update ()
{
if(TimerDown > 0) TimerDown -= Time.deltaTime;
if(TimerDown < 0) TimerDown = 0;
if(TimerDown == 0)
{
TimerDown = Timer;
audio.clip = Sounds[i % Sounds.Length];
i++;
audio.Play();
}
}
我试着写了一个方法,可以添加任意数量的声音,按指定的时间间隔轮流播放。
但问题是它工作不一致。即:
- 之前播放的一个声音过一段时间可能会重复几次
- 没有声音队列,等等。
我觉得问题是循环中的int i
是不断更新的,所以没有优先级。但是在输入检查并降低 int i
之后,它根本停止播放了。
using UnityEngine;
using System.Collections;
public class OneShot : MonoBehaviour {
public AudioClip[] Sounds;
public float Timer;
private float TimerDown;
void Start ()
{
TimerDown = Timer;
audio.clip = Sounds[0];
audio.Play();
}
void Update ()
{
int i;
for(i = 1;i < Sounds.Length;i++)
{
if(TimerDown > 0) TimerDown -= Time.deltaTime;
if(TimerDown < 0) TimerDown = 0;
if(TimerDown == 0)
{
TimerDown = Timer;
audio.clip = Sounds[i];
audio.Play();
}
else
{
i=i-1;
}
}
}
}
您不应在此处使用 for
循环。使用您的代码,您正在为数组中的每个 AudioClip 减少 TimerDown
。每个更新你应该只做 TimerDown -= Time.deltaTime
一次。
相反,您可以将 i
(索引)存储在更新循环之外。
private int i = 0;
void Update ()
{
if(TimerDown > 0) TimerDown -= Time.deltaTime;
if(TimerDown < 0) TimerDown = 0;
if(TimerDown == 0)
{
TimerDown = Timer;
audio.clip = Sounds[i % Sounds.Length];
i++;
audio.Play();
}
}