0

更具体地说,我想快速改变颜色(比如,每秒 60 次),我想把它从蓝色变成红色,再变成绿色,然后再变回来,一遍又一遍地重复

4

1 回答 1

1

如果你真的想这样做,(我根本看不到它的实际应用,如我的javascript 演示中所示),下面的代码将快速转换场景的背景颜色(每帧一次)。

在相机属性下,将 更改Clear FlagsSolid 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 将天空盒应用到所有摄像机,而不是每个摄像机的天空盒。在这个版本中,需要将活动相机的清除标志设置为天空盒,而您只是更改天空盒的色调,因此一些天空盒纹理可能仍然可见(即,它不会是纯红色、蓝色和绿色背景)

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

于 2014-12-11T02:30:02.190 回答