Unity UI Canvas上两GameObject间绘制自定义线条不显示问题求解
无法渲染的核心原因及对应修复方案
- 坐标空间不匹配
你在OnPopulateMesh中直接使用的BeginPoint、EndPoint大概率是世界坐标或者父Canvas下的全局坐标,而UI Graphic生成网格要求顶点坐标必须是当前UILineRenderer所在的RectTransform的局部坐标。Gizmos默认使用世界坐标绘制所以能正常显示,UI mesh使用了错误的坐标就会出现在可视范围外。
修复方法:在赋值vertex.position前将坐标转换为局部坐标:
// 把世界坐标转成当前RectTransform的局部坐标 beginOrigin = transform.InverseTransformPoint(beginOrigin); endOrigin = transform.InverseTransformPoint(endOrigin);
- 三角形索引顺序错误导致背面剔除
你当前的第二个三角形索引2,3,0不符合UI默认的正面顺时针缠绕顺序,会被当作背面剔除掉,最终两个三角形都无法正常显示。
正确的四边形三角拆分索引应该是:
vh.AddTriangle(0, 1, 2); vh.AddTriangle(1, 3, 2);
- 缺少UV参数赋值
默认UI材质需要顶点携带合法的UV坐标,你使用的UIVertex.simpleVert默认UV可能不在有效区间,导致材质采样后完全透明。
修复方法:给每个顶点赋值uv0即可,纯色材质下随便填写合法值都可以:
vertex.uv0 = new Vector2(0, 0);
- 参数修改后未标记网格脏
你修改BeginPoint、Thickness等公开参数后,Unity不会自动触发OnPopulateMesh重绘,需要在参数变更时调用SetVerticesDirty(),可以通过属性封装或者Update中检测变更实现。 - 其他排查项
- 检查Graphic组件的
color属性Alpha值是否为0 - 检查父节点是否存在
Mask/RectMask2D组件裁剪了线条区域 - 确认当前使用的材质不需要额外的顶点属性或纹理
内容的提问来源于stack exchange,提问作者SvenL
相关产品推荐
相关产品推荐

