C# 等待秒逐渐变得不同步。。。统一

C# 等待秒逐渐变得不同步。。。统一,c#,android,unity3d,wait,frame-rate,C#,Android,Unity3d,Wait,Frame Rate,我正在为谷歌纸板制作一款rythm VR游戏,灵感来自PSVR和Oculus Rift上的BeatSaber 其概念是,随着音乐节奏,不同方向的积木向你袭来,就像在节拍军刀中一样。 对于每首音乐,我都创建了一个名为music的ScriptableObject,每个参数都应该包含,如歌曲的难度、名称等。但还有一个向量数组3,称为notes:向量的第一个浮点数对应于从0开始的音乐节奏中敲打音符的时间: 然后在一个名为SlashSpawnManagement的脚本中,所有内容都基于WaitForSe

我正在为谷歌纸板制作一款rythm VR游戏,灵感来自PSVR和Oculus Rift上的BeatSaber


其概念是,随着音乐节奏,不同方向的积木向你袭来,就像在节拍军刀中一样。 对于每首音乐,我都创建了一个名为music的ScriptableObject,每个参数都应该包含,如歌曲的难度、名称等。但还有一个向量数组3,称为notes:向量的第一个浮点数对应于从0开始的音乐节奏中敲打音符的时间:

然后在一个名为SlashSpawnManagement的脚本中,所有内容都基于WaitForSeconds(),我生成了要粉碎的块。我真的很难用语言来解释我做这件事的顺序,所以这里有一个图像:

从理论上讲,这个脚本的作用是,等待一段时间,生成一个块,等待一段时间,生成一个块,等等。逻辑似乎不错,但这里是奇怪的部分。当你播放歌曲时,每个块之间的距离逐渐变大,这意味着块与音乐越来越不同步。它的开始很好,但在音乐的结尾至少有5秒的差距


我认为这与帧速率下降有关,因此我尝试使用以下方法将帧速率设置为较低的值:

QualitySettings.vSyncCount = 0;  // VSync must be disabled
Application.targetFrameRate = 30;
但这并不能解决问题。我尝试使用WaitForSecondsRealtime而不是WaitForSeconds,但没有任何变化。我在某个地方读到WaitForSeconds取决于帧速率。。。在我计算时间的地方,我试着用h除以一个数字来平衡逐渐变大的间隙。这适用于某些块,但不是每个块:
Notes[j][0]-h/500


我的问题是,如何使WaitForSeconds或任何其他方法与提供的seconds保持一致

提前谢谢大家,


PS:如需进一步澄清,请询问并原谅我的打字错误和英语:)

如果您希望在固定的时间间隔内发生一些事情,确保错误不会累积很重要

不要:

private IEnumerable DoInIntervals()
{
    while (this)
    {
        yield return new WaitForSeconds(1f); // this will NOT wait exactly 1 second but a few ms more. This error accumulates over time
        DoSomething();
    }
}
做:

这将确保您的事件定期发生


注意:即使这是常规的,也不能保证它与其他系统(如音频)保持同步。这只能通过在系统之间共享时间来实现,就像斯彭德在他对你的问题的评论中提到的那样。

尝试使用WaitForSeconds来计时音频并希望最好,这是一个很大的希望

提前准备一份矢量表。如果您想使用rythm准备列表,它将起作用。使用AudioSource的时间检查每次更新的时机是否正确,并在那一刻生成一个块

void Update () {
    SpawnIfTimingIsRight();
}

void SpawnIfTimingIsRight() {
    float nextTiming = timingsArray[nextIndex].x;
    // Time For Block To Get To Position
    float blockTime = this.blockDistanceToTravel / this.blockSpeed;
    float timeToSpawnBlock = nextTiming - blockTime;
    if (this.audioSource.time >= nextTiming && (this.audioSource.time - Time.deltaTime) < nextTiming) {
        // Spawn block
    }
}
void更新(){
SpawnIfTimingIsRight();
}
void SpawnIfTimingIsRight(){
float nextitming=timeingsarray[nextIndex].x;
//挡块到达位置的时间
浮动块时间=this.blockdistance totravel/this.blockSpeed;
float timeToSpawnBlock=下一次设置-阻塞时间;
如果(this.audioSource.time>=nextMing&&(this.audioSource.time-time.deltaTime)
如果你在用有节奏的声音做任何事情,必须使用音频来驱动所有事情的计时。我不确定如何在unity中实现这一点,但使用音频以外的任何计时机制都会导致同步丢失。你的声音输出的时间应该会影响整个节目。音频时钟不与任何线程计时器/屏幕计时器保持同步。说到音频,它是一个真正的时间来源。@spender非常感谢你。这与我的想法非常一致。虽然dsp时钟可能会随着时间漂移。时间有一点点,但几分钟后它应该很难测量,朋友。
void Update () {
    SpawnIfTimingIsRight();
}

void SpawnIfTimingIsRight() {
    float nextTiming = timingsArray[nextIndex].x;
    // Time For Block To Get To Position
    float blockTime = this.blockDistanceToTravel / this.blockSpeed;
    float timeToSpawnBlock = nextTiming - blockTime;
    if (this.audioSource.time >= nextTiming && (this.audioSource.time - Time.deltaTime) < nextTiming) {
        // Spawn block
    }
}