Плавное изменение цвета в unity

104
14 января 2021, 08:20

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

Answer 1

Решение на основе шейдера, ИМХО поинтереснее

Создаем стандартный image effect shader и добавляем такую строчку в секции, отвечающую за фрагментный шейдер:

// вычитаем синус от времени из расстояния до центра
col.gb = sqrt(dot(i.uv-0.5, i.uv-0.5))-_SinTime.a;

и добавляем поддержку розрачности

Tags {"Queue"="Transparent" "RenderType"="Transparent" }

Шейдер целиком

Shader "NewImageEffectShader" 
{ 
	Properties 
	{ 
		_MainTex ("Texture", 2D) = "white" {} 
	} 
	SubShader 
	{ 
    /// поддержка прозрачности 
	  Tags {"Queue"="Transparent" "RenderType"="Transparent" } 
    /// 
		Cull Off ZWrite Off ZTest Always Blend SrcAlpha OneMinusSrcAlpha 
 
		Pass{ 
			CGPROGRAM 
			#pragma vertex vert 
			#pragma fragment frag 
			 
			#include "UnityCG.cginc" 
 
			struct appdata 
			{ 
				float4 vertex : POSITION; 
				float2 uv : TEXCOORD0; 
			}; 
 
			struct v2f 
			{ 
				float2 uv : TEXCOORD0; 
				float4 vertex : SV_POSITION; 
			}; 
 
			v2f vert (appdata v) 
			{ 
				v2f o; 
				o.vertex = UnityObjectToClipPos(v.vertex); 
				o.uv = v.uv; 
				return o; 
			} 
			 
			sampler2D _MainTex; 
 
			fixed4 frag (v2f i) : SV_Target 
			{ 
				fixed4 col = tex2D(_MainTex, i.uv); 
         
        /// убавляем значение цвета для зеленого и синего канала (оставляя красный) 
        /// по простенькой формуле 
         
        col.gb = sqrt(dot(i.uv-0.5, i.uv-0.5)) - _SinTime.a; 
				 
        return col; 
			} 
			ENDCG 
		} 
	} 
}

Результат

PS: а если еще немножко подумать

col.gb -= abs(sqrt(sqrt(dot(i.uv-0.5, i.uv-0.5)))-_SinTime.a);

PPS: линии на картинках потому что видео снято с окна инспектора

Answer 2

Вариант предложенный в комментарии гражданином vmchar

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Blink : MonoBehaviour {
    Image image;
    void Start () {
        image = GetComponent<Image> (); 
    }
    void Update () {
        image.color = Color.Lerp (Color.red, Color.white, Mathf.Abs(Mathf.Sin(Time.time)));
    }
}
READ ALSO
Telegram api ошибка dotnet

Telegram api ошибка dotnet

Всем привет! Сегодня решил попробовать написать бота для Telegram на c#Использовал dotnet

116
c# конверт Memory&lt;char&gt; в Memory&lt;byte&gt;

c# конверт Memory<char> в Memory<byte>

Нужно получить Memory<byte> из string без создания промежуточных массивов

121
C# BindingSource Combobox данные из другой таблицы

C# BindingSource Combobox данные из другой таблицы

В С# + MS SQL через ADONET есть так скажем 2 таблицы:

111
Контроль скорости Vector2

Контроль скорости Vector2

Делаю игру типа понга, шарик отталкивается от коллайдера за счёт "Bounciness = 1" динамический RigidbodyВозникла проблема, что в зависимости от угла...

87