我的游戏中有一个钟摆,当摆的旋转为(0,0,0)&时,我会尝试发出声音。 Time.timeScale!= 0.脚本工作正常,但如果我增加摆的旋转速度,声音会停止播放或多次跳过(如果在 TimeManager 我设置时间刻度> 0.1 播放声音片段。
Pendulum Code
Quaternion qStart, qEnd;
float angle = 20.0f;
public float speed;
Public AudioSource Sound;
void Start () {
qStart = Quaternion.AngleAxis ( angle, Vector3.forward);
qEnd = Quaternion.AngleAxis (-angle, Vector3.forward);
}
void Update () {
//rotation code
transform.rotation = Quaternion.Lerp (qStart, qEnd, (Mathf.Sin(Time.time * speed) + 1.0f) / 2.0f);
//Playing Sound
if (transform.rotation == Quaternion.Euler (0, 0, 0) && Time.timeScale!=0)
Sound.Play ();
}
答案 0 :(得分:2)
我认为发生的事情是旋转直接从正面变为负面,反之亦然,而不会在两者之间碰到(0,0,0)。如果角度在一个时刻为-0.1而在下一个时刻为0.1,它将永远不会等于0并且您的声音永远不会播放。
不是测试transform.rotation
是否为(0,0,0),而是在Mathf.Sin(Time.time * speed)
从正面变为负面时反复观察,反之亦然。
答案 1 :(得分:1)
因为真正的摆是连续的,平滑的运动,但是你的模拟钟摆在每个Unity更新帧的离散时间片中移动,除非时间片非常小(并且随着timeScale增加它们变大)你的旋转将从正角度位置到负角度(反之亦然),但没有达到正好0;然后诀窍是检测过渡帧然后播放声音。假设当Lerp因子为0.5时,中间点发生,您可以将检查简化为当前Lerp因子和前一个Lerp因子,如果一个大于或等于0.5而另一个不是&t; t& #34;:
Quaternion qStart, qEnd;
float angle = 20.0f;
float previousLerpFactor;
public float speed;
public AudioSource Sound;
void Start () {
qStart = Quaternion.AngleAxis ( angle, Vector3.forward);
qEnd = Quaternion.AngleAxis (-angle, Vector3.forward);
}
void Update () {
//Lerp factor
float lerpFactor = (Mathf.Sin(Time.time * speed) + 1.0f) / 2.0f;
//rotation code
transform.rotation = Quaternion.Lerp (qStart, qEnd, lerpFactor);
//Playing Sound
if (((lerpFactor >= 0.5f) ^ (previousLerpFactor >= 0.5f)) && Time.timeScale!=0)
Sound.Play ();
previousLerpFactor = lerpFactor;
}