С# - быстро изменить цвет скайбокса unity3d

Чтобы быть более конкретным, я хочу изменить цвет очень быстро (например, 60 раз в секунду), и я хочу изменить его с синего на красный, на зеленый, затем обратно и повторить это снова и снова.


person will0956    schedule 10.12.2014    source источник
comment
Для достижения частоты кадров в 1000 кадров в секунду вам необходимо отключить вертикальную синхронизацию, иначе частота кадров будет привязана к частоте вашего монитора (что вряд ли будет больше 100 Гц). Отключение вертикальной синхронизации может привести к мерцанию изображения и разрыву изображения. Кроме того, в зависимости от вашего графического оборудования обновление чего-либо с такой частотой кадров может оказаться невозможным. Наконец, человеческое постоянство зрения означает, что человек, скорее всего, увидит серый цвет, а не отдельные цвета, если они будут переключаться так быстро.   -  person Matt Coubrough    schedule 11.12.2014
comment
@MattCoubrough mmo-champion.com/threads/   -  person will0956    schedule 11.12.2014
comment
Переключение этих цветов с частотой 1000 Гц заставит людей увидеть мерцающую мешанину цветов. Вот пример использования javascript: jsfiddle.net/mattcoubrough/pc1t6kb5 (то, что вы увидите, будет зависеть от способность вашего компьютера и браузера обновляться с частотой 1000 Гц, что маловероятно)   -  person Matt Coubrough    schedule 11.12.2014
comment
Хороший пример @MattCoubrough, он совершенно бесполезен для реального приложения!   -  person Dinal24    schedule 11.12.2014


Ответы (1)


Если вы действительно хотите это сделать (а я вообще не вижу для этого практического применения, как показано в моем демонстрация javascript) следующий код будет быстро менять цвета фона сцены (один раз за кадр).

В свойствах камеры измените 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-100 Гц, но если вы отключите вертикальную синхронизацию, вы, вероятно, сможете установить целевую частоту кадров выше. Однако обратите внимание, что обновления будут выполняться только с той скоростью, с которой может справиться ваше графическое оборудование, и с отключенной вертикальной синхронизацией вы столкнетесь с уродливым эффектом «разрыва».

Альтернативный подход с помощью тонировки Skybox

Если по какой-то причине вы хотите изменить оттенок предустановленного скайбокса, а не чистый цвет активной камеры, вы можете использовать эту версию метода 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, а не скайбокс для каждой камеры. В этой версии флаги очистки активной камеры должны быть установлены на скайбокс, и вы просто меняете оттенок скайбокса, поэтому часть текстуры скайбокса все еще может быть видна (т.е. она не будет видна). t быть чистым красным, синим и зеленым фоном)

Внимание! Оба метода могут вызвать эпилептический припадок.

person Matt Coubrough    schedule 11.12.2014
comment
Теперь я получаю сообщение об ошибке Assets/ChangeSBColor.cs(21,41): ошибка CS1061: тип UnityEngine.Color[]' does not contain a definition for length', и метод расширения length' of type UnityEngine.Color[]' не найден (вам не хватает директивы using или ссылки на сборку?) - person will0956; 12.12.2014
comment
Кроме того, если необходимо, вот что я импортирую using UnityEngine; и using System.Collections; - person will0956; 12.12.2014
comment
Не получаю ошибку, впускает меня, но не меняет цвет скайбокса - person will0956; 17.12.2014
comment
У меня есть четкие флаги, установленные в сплошной цвет, и это все равно не сработает. - person will0956; 17.12.2014
comment
Я добавил объяснение того, как изменить оттенок скайбокса RenderSettings в качестве альтернативного подхода. Оба метода отлично работают для меня, и это прямое копирование моего кода, поэтому я действительно не знаю, как помочь вам в дальнейшем. Убедитесь, что код вашего поведения привязан к вашей камере и выполняется. Вы получаете какие-либо ошибки? При первом подходе фон камеры меняет цвет при взгляде на него в инспекторе свойств? - person Matt Coubrough; 17.12.2014
comment
Ничего, я понял, почему он не работает... Я никогда не подключал его к камере. - person will0956; 17.12.2014