如何在运行时更改 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;
}
}
如你所见,结果将是这样的。希望有用。
默认颜色现在是默认颜色的混合 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;
}
}
如你所见,结果将是这样的。希望有用。