Страница 1 из 1

Эффект затемнения/расцветания экрана

СообщениеДобавлено: 26 ноя 2012, 11:15
Receptor
Простенький скрипт. Писал для себя. Может кому-то пригодится. Суть его проста: устанавливает положение затемнение экрана, или делает плавное затухание в темноту или обратно :)

Не требует какой-либо привязки к камере и т.п. Не нужно использовать постороние текстуры, гуи всякие. Просто создать пустой ГО в сцене и повесить скрипт на него. Настроить переменные по вкусу.

Есть пять "состояний":
In - Баланс стремится с установленной скоростью в затемнение (по окончанию стремления автоматически становится InEnd)
Out - Баланс стремится с установленной скоростью в расцветание (по окончанию стремления автоматически становится OutEnd)
InEnd - Баланс устанавливает в полное затемнение
OutEnd - Баланс устанавливает в полное расцветание
Stop - Пауза стремления баланса / Текущего состояния

Сам скрипт:
Синтаксис:
Используется csharp

using UnityEngine;
using System.Collections;

public class ScreenFader : MonoBehaviour {
       
        public enum FadeState { In, Out, Stop, InEnd, OutEnd }
       
        Texture colorTexture;
              Color fadeColor = Color.black;

        [HideInInspector] public float fadeBalance;

        public FadeState fadeState;
       
        public float fadeSpeed;     // Скорость стремления баланса

        public float fromInDelay;    // Мнимые задержки перед началом процесса затемнение/расцветания
        public float fromOutDelay;
       
        void Awake () {
                                       
                Texture2D nullTexture = new Texture2D(1,1) as Texture2D;
                nullTexture.SetPixel(0,0, Color.black);
                nullTexture.Apply();

                colorTexture = (Texture)nullTexture;
               
                fadeBalance = (1 + fromInDelay);


        }
       
        void Update(){
               
                fadeColor.a = fadeBalance;

                if(fadeBalance > (1 + fromInDelay)){
                        fadeBalance = (1 + fromInDelay);
                        fadeState = FadeState.InEnd;
                }
               
                if(fadeBalance < -(0 + fromOutDelay)){
                        fadeBalance = -(0 + fromOutDelay);
                        fadeState = FadeState.OutEnd;
                }
               
               
                switch (fadeState){
                       
                        case FadeState.In:
                                fadeBalance+=Time.deltaTime*fadeSpeed;
                        break;
                       
                        case FadeState.Out:
                                fadeBalance-=Time.deltaTime*fadeSpeed;
                        break;
                       
                        case FadeState.Stop:
                                fadeBalance -= 0;
                        break;
                       
                        case FadeState.InEnd:
                                fadeBalance = (1 + fromInDelay);
                        break;
                       
                        case FadeState.OutEnd:
                                fadeBalance = -(0 + fromOutDelay);
                        break;
                }
               
        }

        void OnGUI() {

                GUI.depth = -2;
                GUI.color = fadeColor;
                GUI.DrawTexture(new Rect(0,0,Screen.width, Screen.height), colorTexture, ScaleMode.StretchToFill, true);

        }
}



 


Из любого другого скрипта можно управлять этим очень просто, достаточно менять значение переменной состояния затемнения - fadeState.

Например:
Синтаксис:
Используется csharp

public ScreenFader screenFader;

//
//

if(Input.GetKeyDown(KeyCode.Return)){
   screenFader.fadeState = ScreenFader.FadeState.In; // Если нажать "Энтер", то экран гаснет
}



 


Вот :D

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 03 дек 2012, 19:55
MicroSLAV
Большое спасибо!!! Работает как часы! В сочетании с меню (которое ещё в добавок и выдвигается справа на лево) выглядит эффектоно \m/

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 03 дек 2012, 20:13
AndreyMust19
Боже, а нельзя просто менять альфа-канал равномерно черной текстуры? А то какие-то SetPixel, DrawTexture.

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 03 дек 2012, 21:46
Avatarchik
Он это и делает) В старте создает текстуру в 1 пиксель черного цвета.
Потом растягивает во весь экран и меняет ей альфу ;)

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 29 дек 2012, 19:16
Receptor
Именно :)

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 31 мар 2013, 00:16
Huruffus
Пригодилось, спасибо!

За счёт какой строки возможно затемнение всего GUI ?

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 31 мар 2013, 09:10
Angel 07
За счет уменьшения значения для GUI.depth. Например, -3 поставить, или -5. В зависимости от того, где сам GUI рисуется.

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 24 май 2013, 11:40
Patico
Супер!
Отдельное спасибо за хак с SetPixel :-bd

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 01 июл 2013, 20:34
commandoby
Кусочек от скрипта пригодился. Спасибо. :-bd

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 04 мар 2014, 15:18
GogDzilla
Ваш скрипт уже на пиратских сайтах

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 26 май 2017, 09:19
Valentinus
привет из 2017-го!

пытался использовать ваш скрипт, но при запуске сцены экран сразу черный и все.
оказалось что в Start надо добавить fadeState= FadeState.Out;
кстати, fadeSpeed задается в единицах обратных времени эффекта, т.е. чтоб затухало 5 секунд, надо задать 1/5, т.е. 0.2f;

вопрос:
какие параметры надо задать в
public float fromInDelay; // Мнимые задержки перед началом процесса затемнение/расцветания
public float fromOutDelay;
в каких единицах? задаю 3 - получаю примерно 10секунд. 0_0

и по-моему они перепутаны - если я задаю
float fromInDelay=0;
float fromOutDelay=3;
то задержка получается при затухании, при осветлении ее нет, и наоборот.

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 10 авг 2017, 15:53
Valerich
И мне понравился, хороший скрипт. Настроить можно под многое) :-bd

Re: Эффект затемнения/расцветания экрана

СообщениеДобавлено: 24 фев 2022, 14:53
sl0vvman
Привет, когда пробую вызвать из кода выскакивает ошибка: NullReferenceException: Object reference not set to an instance of an object. Может подскажите что неправилно сделал, сам код:
public ScreenFader screenFader;

if (Input.GetKeyDown(KeyCode.G))
{
screenFader.fadeState = ScreenFader.FadeState.In;
}