统一创造脉冲颜色

时间:2015-04-02 06:57:02

标签: c# unity3d

我正在制作一个游戏对象'脉冲'它的颜色,UNITY 3d。

我希望颜色能够在两种颜色之间转换,

以下是我的代码,它不起作用(我在更新功能中这样做):

      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;
                }

            }

我对此很陌生。我做错了什么?

2 个答案:

答案 0 :(得分:3)

如果您为fadeSpeed选择适当的值,则代码正常工作。(并且不要忘记初始化TargetColor,如void Start() {TargetColor = Color.gray;}

你正在以错误的方式使用Lerp。这导致颜色在长镜头中达到目标值。将此调试日志添加到Update中的某个位置,您可以看到问题:

  

Debug.Log(“当前颜色:”+ renderer.material.color);

如果我需要自己编码,我会做这样的事情:

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;
        }
    }
}

此外,请查看补间库。他们非常有帮助。

  

http://dotween.demigiant.com/

     

http://itween.pixelplacement.com/

     

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

答案 1 :(得分:0)

以 Can 的回答为基础,我使用了 Sin 函数来稍微收紧一些事情。 Math.Sin(Time.time) 会给你一个在 -1 和 1 之间反弹的值,然后 Math.Abs​​ 会将它限制为 0-1。 (这使脉冲具有 easeOuteaseIn 类型的脉冲效果)您可以乘以 Time.time 值来调整速度。 *0.5f = 半速,*2.0f = 双速等

只需调用 setHighlight(true/false) 即可将其关闭和打开。

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);
    }
}

}