Unity中所有LineRenderer颜色一致?期望两黄一蓝未实现
解决LineRenderer设置颜色后全部一致的问题
问题场景
在Unity项目中,为左眼、右眼和手指对象分别添加LineRenderer组件,调用SetUpLineRenderer方法为双眼设置Color.yellow,手指设置Color.blue,但运行后所有LineRenderer颜色完全相同,无法实现两黄一蓝的效果。
相关代码
初始化LineRenderer的代码:
// Initialize and set up the LineRenderers for the eyes and finger leftEyeLineRenderer = eyeLeft.gameObject.AddComponent<LineRenderer>(); rightEyeLineRenderer = eyeRight.gameObject.AddComponent<LineRenderer>(); fingerLineRenderer = finger.gameObject.AddComponent<LineRenderer>(); SetUpLineRenderer(leftEyeLineRenderer, Color.yellow); SetUpLineRenderer(rightEyeLineRenderer, Color.yellow); SetUpLineRenderer(fingerLineRenderer, Color.blue);
设置LineRenderer的方法代码:
private void SetUpLineRenderer(LineRenderer lineRenderer, Color color) { // Create a simple unlit material that supports vertex colors Material lineMaterial = new Material(Shader.Find("Standard")); lineRenderer.material = lineMaterial; lineRenderer.startColor = color; lineRenderer.endColor = color; lineRenderer.startWidth = 0.01f; lineRenderer.endWidth = 0.01f; }
效果截图

问题原因
你使用的Standard Shader是为3D物体设计的,它不会直接读取LineRenderer的startColor和endColor属性,颜色会受场景光照、Shader默认参数影响,导致所有线条显示相同颜色。
修复方案
方案1:替换为支持LineRenderer颜色的Shader
将创建Material时的Shader改为专门支持2D/线条渲染的无光照Shader,比如Sprites/Default(内置管线)或Universal Render Pipeline/Unlit(URP管线),这类Shader会直接响应LineRenderer的颜色设置。
修改后的SetUpLineRenderer方法:
private void SetUpLineRenderer(LineRenderer lineRenderer, Color color) { // 使用支持LineRenderer颜色的无光照Shader Material lineMaterial = new Material(Shader.Find("Sprites/Default")); lineRenderer.material = lineMaterial; lineRenderer.startColor = color; lineRenderer.endColor = color; lineRenderer.startWidth = 0.01f; lineRenderer.endWidth = 0.01f; }
方案2:复用Material+MaterialPropertyBlock(性能更优)
多次创建Material会增加性能开销,推荐复用同一个Material实例,通过MaterialPropertyBlock动态修改颜色:
// 声明全局共享Material private Material sharedLineMaterial; void Awake() { // 初始化共享Material,使用支持LineRenderer的Shader sharedLineMaterial = new Material(Shader.Find("Sprites/Default")); } private void SetUpLineRenderer(LineRenderer lineRenderer, Color color) { lineRenderer.material = sharedLineMaterial; // 创建属性块,动态修改颜色 MaterialPropertyBlock props = new MaterialPropertyBlock(); lineRenderer.GetPropertyBlock(props); props.SetColor("_Color", color); lineRenderer.SetPropertyBlock(props); lineRenderer.startWidth = 0.01f; lineRenderer.endWidth = 0.01f; }
效果说明
修改后,左眼和右眼的LineRenderer会显示黄色,手指的LineRenderer会显示蓝色,符合预期效果。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

