旋转时播放声音(0,0,0)

时间:2016-09-21 12:27:25

标签: c# unity3d

我的游戏中有一个钟摆,当摆的旋转为(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 ();
    }

2 个答案:

答案 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;
    }