我正在为谷歌纸板创作一个Rythm虚拟现实游戏,灵感来自PSVR和Oculus Rift上的Beat Saber。
概念是不同方向的积木向你走来,跟随音乐的节奏,就像节拍中的剑。
对于每一首音乐,我都创建了一个名为music的脚本对象,它的每个参数都应该包含,比如歌曲的难度,名字,等等,还有一个称为notes的向量3数组:向量的第一个浮点数对应于从0开始的音乐节奏中击打该音符的时间:ScriptableObject
然后,在一个名为slashspawnmanagement的脚本中,所有东西都基于waitforseconds(),我生成要粉碎的块。我很难用文字来解释我的顺序,所以这里有一张图片:Explanation
理论上,这个脚本的作用是,等待一段时间,生成一个块,等待一段时间,生成一个块,等等。逻辑看起来不错,但奇怪的是。当你播放这首歌时,每个方块之间的距离逐渐变大,这意味着这些方块越来越与音乐不同步。开始的时候很好,但音乐结束时至少有5秒的间隔。
我想这与帧速率下降有关,所以我尝试用以下方法将帧速率设置为较低:
QualitySettings.vSyncCount = 0; // VSync must be disabled
Application.targetFrameRate = 30;
但这并不能解决问题。我试着用waitforsecondsrealtime代替waitforseconds,但是没有改变。我在某个地方读到,等待秒数取决于帧速率…在我计算时间的地方,我试着用h除以一个数来平衡逐渐的差距。这适用于某些区块,但不是每个区块:
Notes[j][0] - h / 500
所以我的问题是,如何使waitForSeconds或任何其他方法与提供的秒数一致?
提前谢谢你,
注:如需进一步澄清,请询问并原谅我的错别字和英语:)
最佳答案
尝试使用waitforseconds音频和希望的最佳时机是希望一个大的希望。
事先准备好矢量表。如果你想用节奏来准备列表-它会起作用的。使用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
}
}