如何在运行时更改 linerenderer 颜色?

How to change linerenderer color at runtime?

默认颜色现在是默认颜色的混合 material :

如果我将模式设置为 None,我希望在运行时或 运行 游戏之前将整个 linerenderer 设置为红色:

我试过了,但是即使我将颜色 属性 设置为红色,也会将 linerenderer 着色为白色:

IEnumerator SelectAnimation(AnimationType animType)
    {
        switch (animType)
        {
            case AnimationType.SingleColorMorph:
                yield return RandomSingleColorMorphing(myLineRenderer, morphTime);
                break;
            case AnimationType.MultiColorMorph:
                yield return RandomMultiColorMorphing(myLineRenderer, morphTime);
                break;
            case AnimationType.Shuffle:
                yield return ShuffleGradient(myLineRenderer, .5f);
                break;
            case AnimationType.Shift:
                yield return AnimateLoop(myLineRenderer);
                break;
            default:
                yield return ggg(Color.red);
                break;
        }
    }

    private Color ggg(Color color)
    {
        Material whiteDiffuseMat = new Material(Shader.Find("Unlit/Texture"));
        whiteDiffuseMat.color = Color.red;
        myLineRenderer.material = whiteDiffuseMat;
        return color;
    }

我还尝试在方法 ggg 中将 myLineRenderer startcolor 和 endcolor 设置为红色而不更改 material 但它没有改变任何东西。

我设法解决了这个问题。例如,在这里我将解释如何更改 two-point 渐变的颜色,但是添加所需的细节取决于您。首先你需要用一些 key-point 来定义一个渐变,因为这个渐变不能直接 lerp 成另一个渐变,你需要 lerp 它的颜色。一个主要的提示是在线渲染器上显示渐变,你需要一个支持它的material。我用了 Particle/ Standard Unlit 没问题。

好的,我在这里设置了 lineRenderer two-point 红色和蓝色渐变(例如):

    private LineRenderer _lineRenderer;
    void Start()
    {
        _lineRenderer = GetComponent<LineRenderer>();
        
        // how to create gradient in script?
        var gradient = new Gradient();
        
        gradient.mode = GradientMode.Blend;

        var gradientColorKeys = new GradientColorKey[2]
        {
            new GradientColorKey(Color.red, .2f),
            new GradientColorKey(Color.blue, .8f)
        };
        
        var alphaKeys = new GradientAlphaKey[2]
        {
            new GradientAlphaKey(1f, .2f),
            new GradientAlphaKey(1f, .8f)
        };

        gradient.SetKeys(gradientColorKeys, alphaKeys);
        
        _lineRenderer.colorGradient = gradient;

        // This enumerator changes color within a specified time
        StartCoroutine(MorphToColor(Color.green, Color.magenta, 2f));
    }

我还在同一个 class 中写了一个颜色变化 Enumarator ,它对两个特定点的颜色进行了渐变:

    public IEnumerator MorphToColor(Color color1, Color color2, float morphTime = 1f)
    {
        Debug.Log("start morph");
        var c1 = _lineRenderer.colorGradient.Evaluate(.2f);
        var c2 = _lineRenderer.colorGradient.Evaluate(.8f);

        var fade = 0f;

        while (fade <= 1)
        {
            var gradient = new Gradient();
            gradient.mode = GradientMode.Blend;
            var gradientColorKeys = new GradientColorKey[2]
            {
                new GradientColorKey(Color.Lerp(c1, color1, fade), .2f),
                new GradientColorKey(Color.Lerp(c2, color2, fade), .8f)
            };
        
            var alphaKeys = new GradientAlphaKey[2]
            {
                new GradientAlphaKey(1f, .2f),
                new GradientAlphaKey(1f, .8f)
            };
            
            gradient.SetKeys(gradientColorKeys, alphaKeys);
            
            _lineRenderer.colorGradient = gradient;
            
            yield return new WaitForEndOfFrame();

            fade += Time.deltaTime/morphTime;
        }
    }

如你所见,结果将是这样的。希望有用。