C# 创造统一的脉动色彩

C# 创造统一的脉动色彩,c#,unity3d,C#,Unity3d,我正在用UNITY 3d制作一个游戏对象来“脉冲”它的颜色 我希望颜色在两种颜色之间不断变换 以下是我的代码,它不工作(我在更新函数中执行此操作): 我是新来的。我做错了什么?如果为fadeSpeed(如10)选择一个合适的值,则代码正在工作。(不要忘记初始化TargetColor,比如void Start(){TargetColor=Color.gray;}) 您以错误的方式使用Lerp。这会使颜色在长时间内达到其目标值。将此调试日志添加到更新中的某个位置,您可以看到问题: Log(“当前颜色

我正在用UNITY 3d制作一个游戏对象来“脉冲”它的颜色

我希望颜色在两种颜色之间不断变换

以下是我的代码,它不工作(我在更新函数中执行此操作):


我是新来的。我做错了什么?

如果为fadeSpeed(如10)选择一个合适的值,则代码正在工作。(不要忘记初始化TargetColor,比如
void Start(){TargetColor=Color.gray;}

您以错误的方式使用Lerp。这会使颜色在长时间内达到其目标值。将此调试日志添加到更新中的某个位置,您可以看到问题:

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;
        }
    }
}
公共类彩色闪烁器:单行为
{
公共浮点数=1f;
公共颜色Color1=Color.gray;
公共颜色Color2=Color.white;
私用彩色startColor;
私人色彩;
私人浮动时间;
私人材料;
void Start()
{
material=GetComponent().material;
startColor=Color1;
endColor=Color2;
}
无效更新()
{
var比率=(Time.Time-lastColorChangeTime)/FadeDuration;
比率=Mathf.Clamp01(比率);
material.color=color.Lerp(起始颜色、结束颜色、比率);
//material.color=color.Lerp(startColor,endColor,Mathf.Sqrt(ratio));//很酷的效果
//material.color=color.Lerp(startColor,endColor,ratio*ratio);//另一种很酷的效果
如果(比率==1f)
{
lastColorChangeTime=Time.Time;
//调色
var temp=起始颜色;
startColor=endColor;
endColor=温度;
}
}
}
此外,还可以看看tweening库。他们很有帮助


基于Can的回答,我使用了Sin函数来收紧一些东西。 Math.Sin(Time.Time)会给你一个介于-1和1之间的值,然后Math.Abs会将它限制为0-1。(这会给脉冲一种脉冲效应)您可以乘以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);
    }
}
public class prop_highlight:monobhavior{
公共色彩突出色彩;
private bool突出显示=false;
私人材料;
void Start(){
material=GetComponent().material;
}
公共无效设置高光(布尔设置高光){
is_highlighted=设置_highlight;
如果(!set_highlight)material.color=color.white;
}
无效更新(){
如果(是否突出显示){
var比率=Mathf.Abs(Mathf.Sin(Time.Time*4f));
material.color=color.Lerp(color.white,highlight\u color,ratio);
}
}

}

您确定TargetColor有一个值作为开始吗?在我看来,除了TargetColor不是Color.white或Color.gray之外,您的代码应该在任何情况下都能工作。工作起来很有魅力!
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);
    }
}