Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create pulsing color in unity

I am making a gameobject to 'pulse' its color , in UNITY 3d .

i want the color to keep shifting between 2 colors ,

following is my code , it doesnt work (i am doing this in the update function) :

      renderer.material.color = Color.Lerp(renderer.material.color, TargetColor,fadeSpeed*Time.deltaTime);

        if(renderer.material.color == TargetColor)
            {

                if(renderer.material.color == Color.gray)
                {
                    TargetColor = Color.white;
                }
                else if (renderer.material.color == Color.white)
                {
                    TargetColor = Color.gray;
                }

            }

i'm new to this. What am i doing wrong ?

like image 303
Syed Usman Avatar asked Sep 20 '25 07:09

Syed Usman


2 Answers

Your code is working if you select a proper value for fadeSpeed like 10. (And don't forget to initialize TargetColor like void Start() {TargetColor = Color.gray;})

You are using Lerp in a wrong way. Which causes the color to reach it's target value in a long shot. Add this debug log to somewhere in Update and you can see the problem:

Debug.Log("Current color: " + renderer.material.color);

If I need to code it myself, I would do something like this:

public class ColorBlinker : MonoBehaviour
{
    public float FadeDuration = 1f;
    public Color Color1 = Color.gray;
    public Color Color2 = Color.white;

    private Color startColor;
    private Color endColor;
    private float lastColorChangeTime;

    private Material material;

    void Start()
    {
        material = GetComponent<Renderer>().material;
        startColor = Color1;
        endColor = Color2;
    }

    void Update()
    {
        var ratio = (Time.time - lastColorChangeTime) / FadeDuration;
        ratio = Mathf.Clamp01(ratio);
        material.color = Color.Lerp(startColor, endColor, ratio);
        //material.color = Color.Lerp(startColor, endColor, Mathf.Sqrt(ratio)); // A cool effect
        //material.color = Color.Lerp(startColor, endColor, ratio * ratio); // Another cool effect

        if (ratio == 1f)
        {
            lastColorChangeTime = Time.time;

            // Switch colors
            var temp = startColor;
            startColor = endColor;
            endColor = temp;
        }
    }
}

Additionally, take a look at tweening libraries. They are very helpful.

http://dotween.demigiant.com/

http://itween.pixelplacement.com/

http://u3d.as/content/dented-pixel/lean-tween/31i

like image 127
Can Baycay Avatar answered Sep 22 '25 21:09

Can Baycay


Building on Can's answer, I've used the Sin function to tighten things up a bit. Math.Sin(Time.time) will give you a value that bounces between -1 and 1, then Math.Abs will restrict it to 0-1. (This gives the pulse an easeOut, easeIn type of pulse effect) You can multiply the Time.time value to adjust the speed. *0.5f = half-speed, *2.0f = double-speed, etc.

Just call setHighlight(true/false) to turn it off and on.

public class prop_highlight : MonoBehaviour {

public Color highlight_color;
private bool is_highlighted = false;
private Material material;

void Start() {
    material = GetComponent<Renderer>().material;
}

public void setHighlight(bool set_highlight) {
    is_highlighted = set_highlight;
    
    if(!set_highlight) material.color = Color.white;
}

void Update() {
    if(is_highlighted) {
        var ratio =  Mathf.Abs(Mathf.Sin(Time.time*4f));
        material.color = Color.Lerp(Color.white, highlight_color, ratio);
    }
}

}

like image 28
falldeaf Avatar answered Sep 22 '25 20:09

falldeaf