Unity 2D: обратный эффект цвета области - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь создать GameObejct, который, если активен, меняет цвет чего-либо позади него.В идеале этот GameObject расширяется от своей центральной точки до радиуса определенного размера, когда он появляется / становится активным.

Итак, представьте круг, масштаб которого увеличивается от x = 0 и y = 0 до x = 5 и y = 5 постепенно в течение 1 или 2 секунд и меняет цвет всего, что находится позади.Не имеет значения, насколько длинным или большим является фактический круг, просто пример идеи.Я попытался просто создать GameObect с маской и шейдером, которые я нашел в сети, но t не работал вообще, и я все еще даже не был уверен, как анимировать расширение.

У кого-нибудь есть идеи по поводуКак я мог сделать этот эффект моей мечты реальностью?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вот шейдер, который ничего не делает, кроме инвертирования цвета.

Важная часть - Alpha:Blend и Blend OneMinusDstColor Zero.

Shader "Custom/Invert" 
{
    Properties 
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader 
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent" }
        LOD 200
        Blend OneMinusDstColor Zero

        PASS
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #pragma target 3.0 Alpha:Blend

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            fixed4 _Color;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = float2(0,0);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return _Color;
            }

            ENDCG
        }
    }
    FallBack "Diffuse"
}

Вы можете поместить это на любой спрайт илиТрехмерный объект для получения этого эффекта: enter image description here

Что касается анимации, ответ Кинга приятный и простой.В качестве альтернативы вы можете анимировать шкалу с помощью кода:

public class Scale : MonoBehaviour 
{
    void Update ()
    {
        var scale = Mathf.Sin(Time.timeSinceLevelLoad / 4f) * 20;
        this.transform.localScale = new Vector3(scale, scale, 1);
    }
}

Этот конкретный код сделает спрайт «импульсом».Например:

Pulse

Я думаю, что вы сможете создать свой собственный скрипт масштабирования из этого примера.

0 голосов
/ 18 февраля 2019

Выберите ваш GameObject-> Window-> Animation-> Animation-> Create-> Save-> Add Property-> Transform-> Scale.На ключевом кадре 0:00 установите масштаб для x, y, z равным 1. Нажмите на ключевой кадр 1:00 и установите масштаб для x, y, z равным 2. Нажмите кнопку воспроизведения, и анимация должна зацикливаться от масштаба 1до 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...