【问题标题】:C# - Rapidly change unity3d skybox colorC# - 快速改变 unity3d 天空盒颜色
【发布时间】:2014-12-10 23:16:14
【问题描述】:

更具体地说,我想快速更改颜色(例如,每秒 60 次),我想将其从蓝色变为红色,再变为绿色,然后再返回并一遍又一遍地重复

p>

【问题讨论】:

  • 要达到 1000 fps 的帧速率,您需要禁用垂直同步,否则帧速率与您的显示器相关(不太可能超过 100 Hz)。关闭垂直同步很可能会使图像闪烁并导致撕裂。此外,根据您的图形硬件,以该帧速率更新某些内容可能是不可能的。最后,人类的视觉持久性意味着如果一个人如此快速地循环,他们可能会看到灰色而不是单个颜色。
  • 以 1000Hz 的频率切换这些颜色会导致人们看到一团乱麻的颜色。这是一个使用 javascript 的示例:jsfiddle.net/mattcoubrough/pc1t6kb5(您所看到的将取决于您的计算机和浏览器以 1000Hz 更新的能力,这不太可能)
  • 很好的例子@MattCoubrough,它对于真正的应用程序来说毫无用处!

标签: unity3d skybox


【解决方案1】:

如果您真的想要这样做,(我认为它根本没有实际应用,如我的javascript demo 所示)以下代码将快速转换场景的背景颜色(每帧一次)。

在相机属性下,将Clear Flags 更改为Solid Color。这会禁用天空盒背景,而只是将背景清除为一种颜色。

然后,使用以下代码创建一个新的 C# 行为并将其附加到您的相机:

public class SkyColorBehaviourScript : MonoBehaviour {

    // used to track the index of the background to display
    public int cycleIndex = 0;
    Color[] skyColors = new Color[3];

    void Start () {
        // init the sky colors array
        skyColors [0] = new Color (255, 0, 0);    // red
        skyColors [1] = new Color (0, 255, 0);    // green 
        skyColors [2] = new Color (0, 0, 255);    // blue
    }

    // Update is called once per frame
    void Update () {
        // cycle the camera background color
        cycleIndex++;
        cycleIndex %= skyColors.Length;
        camera.backgroundColor = skyColors [cycleIndex];
    }
}

说明:

脚本有一个数组skyColors,其中包含红色、绿色和蓝色三种颜色。

每次更新(每帧一次)时,变量 cycleIndex 都会递增。

然后,通过调用cycleIndex %= skyColors.Length,只要 cycleIndex 等于颜色数组的长度,它就会重置为零。 (这样,如果您向数组中添加更多颜色,它也会在它们之间循环)。

最后,我们将相机的背景颜色更改为由cycleIndex索引的数组中的颜色。

默认帧率可能会锁定在 60-100Hz 左右的显示器刷新率,但如果您禁用垂直同步,您可能可以将目标帧率设置得更高。但请注意,更新只会以您的图形硬件可以处理的速度运行,并且在关闭 vsync 的情况下,您将体验到丑陋的“撕裂”效果。

通过 Skybox Tinting 的替代方法

如果出于某种原因您想要更改预设天空盒的色调而不是更改活动摄像机的清晰颜色,则可以使用此版本的 Update 方法:

    // Update is called once per frame
    void Update () {
        // cycle the camera background color
        cycleIndex++;
        cycleIndex %= skyColors.Length;
        RenderSettings.skybox.SetColor("_Tint", skyColors [cycleIndex]);
    }

请注意,这假设您已通过 RenderSettings 将天空盒应用到所有摄像机,而不是每个摄像机的天空盒。在此版本中,需要将活动相机的清除标志设置为天空盒,而您只是更改天空盒的 tint,因此一些天空盒纹理可能仍然可见(即它不会'不能是纯红蓝绿背景)

警告:这两种技术都可能导致癫痫发作。

【讨论】:

  • 现在,我收到一个错误“Assets/ChangeSBColor.cs(21,41): error CS1061: Type UnityEngine.Color[]' does not contain a definition for length' and no extension method length' of type UnityEngine.Color[]' 可能是找到(您是否缺少 using 指令或程序集引用?)"
  • 另外,如果需要,这是我要导入的 using UnityEngine;using System.Collections;
  • 不要得到错误,让我进入它,但不会改变天空盒的颜色
  • 我已将明确的标志设置为纯色,但仍然无法正常工作。
  • 我添加了关于如何更改 RenderSettings 天空盒的色调作为替代方法的说明。这两种技术对我来说都很好,它是我代码的直接剪切和粘贴,所以我真的不知道如何进一步帮助你。检查您行为中的代码是否已附加到您的相机,并且正在执行。你有任何错误吗?使用第一种方法时,在属性检查器中查看相机背景时会改变颜色吗?
猜你喜欢
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多