【问题标题】:Display an object for a few milliseconds in Unity3D在 Unity3D 中显示一个对象几毫秒
【发布时间】:2012-10-18 10:40:19
【问题描述】:

我正在使用 Unity3D 设置一个“实验”(与大学相关),我设计了一个迷宫,用户会收到潜意识提示(屏幕上显示的视觉箭头),这些提示应该只出现 14 毫秒然后消失。

我已经设计了 3D 迷宫,它真的很小(我不需要任何花哨的实验),因此当我使用第一人称控制器导航时我可以达到 1000fps(帧率不会成为问题)。我打算用 C# 编写一个脚本,以便在触发某些对象时显示这些箭头。

我想知道在 Unity 中是否可以仅以可接受的精度显示对象几毫秒(在我的情况下为 14 毫秒)...如果是这样,我应该使用哪种方法?有类似问题的想法或以前的经验吗?

提前谢谢你

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    使用协程显示对象只是一段时间:

    void *AnyTrigger*() // eg. replace with OnTriggerEnter if using triggers
    {
        StartCoroutine(ShowObject(14f / 1000f));
    }
    
    IEnumerator ShowObject(float timeInSeconds)
    {
        // Show object here
        yield return new WaitForSeconds(timeInSeconds);
        // Hide object
    }
    

    准确度

    显示对象的时间精度很大程度上取决于您使用的系统。如果您在快速系统上运行 Unity3D,它可能非常准确。如果系统很慢,时间很可能超过 14 毫秒。

    示例(不准确):

    • 快速系统,每秒 950-1000 帧:可能在 0 毫秒到 1 毫秒之间
    • 中等系统,每秒 300-600 帧:可能在 0.8 毫秒到 3.6 毫秒之间
    • 慢速系统,每秒 50-100 帧:可能在 5 毫秒到 20 毫秒之间

    【讨论】:

    • 感谢您的回答:您认为对象的显示在时间上会准确吗? (例如,帧丢失,因此在某些周期内无法显示对象)
    • @Albz 不,它不会 100% 准确,我在答案中添加了更多信息
    【解决方案2】:

    您也可以使用System.Diagnostics.Stopwatch 来计时。

    http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

    可能更准确,因为它是按操作系统时间而不是 Unity 的内部计时。

    IEnumerator ShowObject(float timeInSeconds) {
        var stopwatch = new System.Diagnostics.Stopwatch();
        // Show object here
        stopwatch.Start();
        while (stopwatch.ElapsedMilliseconds < 14) {
            yield return null;
        }
        // Hide object
        stopwatch.Stop();
    }
    

    【讨论】:

    • 我不认为 Unity NOT 正在使用系统时间!
    • Unity 正在使用可能会偏离系统时间的内部计时。这就是为什么他们的 Time.timeScale 变量会减慢游戏速度。此外,诸如垃圾收集之类的事情可能会导致引擎暂时暂停,并使它们的时间与系统时间略有偏差。
    • 不过,unity 必须渲染帧,所以与使用 Unity 的内置时间系统的区别并不重要。
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2013-03-17
    • 2014-06-15
    相关资源
    最近更新 更多