gpt4 book ai didi

unity3d - 最大化编辑器/最终版本与未最大化编辑器之间的时间已关闭

转载 作者:行者123 更新时间:2023-12-02 23:05:01 24 4
gpt4 key购买 nike

我已经创建了一个场景,该场景的灯光随着闪烁而打开,并结合了声音效果。当我正常播放场景时,在未最大化的编辑器中,声音效果和灯光闪烁会完美同步。当我尝试运行“最大化播放”场景或以最终版本运行游戏时,声音和闪烁均关闭。

我在检查器中使用此设置:

enter image description here

WindowOn具有带有声音效果的AudioSource和“LightFlickering”脚本,该脚本可激活和禁用“闪烁”对象以模拟光闪烁。

LightFlickering.cs:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LightFlickering : MonoBehaviour {

public float flickerTime, waitTurnOff;
public GameObject flickerObject;
public AudioClip lightOff;

// Use this for initialization
void Start () {
StartCoroutine(flickering());
}

// Update is called once per frame
void Update () {

}

IEnumerator flickering()
{
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(false);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(true);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(false);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(true);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(false);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(true);
yield return new WaitForSeconds(waitTurnOff);
GetComponent<AudioSource>().clip = lightOff;
GetComponent<AudioSource>().Play();
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(false);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(true);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(false);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(true);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(false);
yield return new WaitForSeconds(flickerTime);
flickerObject.SetActive(true);
}
}

我在哪里出错导致这种不同步?

最佳答案

由于可变帧速率以及WaitForSeconds的工作方式,因此您会遇到这种情况。任何使您的每帧时间不均分flickerTime的事情都将导致音频不同步。稍微放大或缩小游戏窗口很容易导致这种情况。

假设flickerTime为0.1秒,并且您以41 FPS(〜24毫秒/帧)的速度运行。 WaitForSeconds将检查每帧是否经过0.1秒或更长时间,然后查看此进度:0.024、0.048、0.072、0.096、0.120。当它看到0.120时,它完成并恢复协程,切换灯光并开始下一个WaitForSeconds。但是现在,音频和视频的同步时间降低了20 ms。与每个WaitForSeconds一起,您还将获得20毫秒的非同步,并且在其中的少数同步之后,将非常明显。

为了解决此问题,您需要更改代码以不使用WaitForSeconds链,而是使用类似以下内容的代码:

float accum = 0;
float startTime = Time.time;
while(Time.time - startTime < flickerTime * 6)
{
accum += Time.deltaTime;
if(accum >= flickerTime)
{
accum -= flickerTime;
flickerObject.SetActive(!flickerObject.activeSelf);
}
yield return 0;
}
//Switch audio clip etc.

这占了WaitForSeconds不会花费的额外时间。
但是,即使那样最终也可能不同步。一种更可靠的方法是从剪辑中读取音频时间,并使用该时间:
while(Time.time - startTime < flickerTime * 6){
float clipTime = GetComponent<AudioSource>().time;
int flicker = (int)(clipTime / flickerTime);
bool isOn = (flicker % 2) == 0;
flickerObject.SetActive(isOn);
yield return 0;
}

关于unity3d - 最大化编辑器/最终版本与未最大化编辑器之间的时间已关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46484919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com