Чтобы быть более конкретным, я хочу изменить цвет очень быстро (например, 60 раз в секунду), и я хочу изменить его с синего на красный, на зеленый, затем обратно и повторить это снова и снова.
С# - быстро изменить цвет скайбокса unity3d
Ответы (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 быть чистым красным, синим и зеленым фоном)
Внимание! Оба метода могут вызвать эпилептический припадок.
UnityEngine.Color[]' does not contain a definition for
length', и метод расширения length' of type
UnityEngine.Color[]' не найден (вам не хватает директивы using или ссылки на сборку?)
- person will0956; 12.12.2014
using UnityEngine;
и using System.Collections;
- person will0956; 12.12.2014