Unity Canvas场景下Line Renderer无法显示,求拖拽连线实现指导
解决Canvas上拖拽绘制箭头(Line Renderer不显示)的实操步骤
一、先搞定Line Renderer的基础配置
- 绑定到Canvas层级:把带Line Renderer的GameObject设为Canvas的子物体,或者将Line Renderer的
Render Mode改成和Canvas匹配的模式——如果Canvas是Screen Space - Overlay,Line Renderer也选这个;如果是Screen Space - Camera,则保持一致,避免渲染层级不匹配导致看不见。 - 必设材质与宽度:Line Renderer必须挂材质,直接用
UI/Default材质就行(适配UI渲染),同时把Start Width和End Width设成0.1以上的数值,默认0的话肯定看不见。 - 初始化顶点数量:拖拽连线至少需要2个顶点,初始化时先给Line Renderer设
positionCount = 2,起点可以先设成点击的文字位置,拖拽时更新第二个点。
二、坐标转换是核心坑点
Canvas UI用的是屏幕/本地坐标,Line Renderer默认认世界坐标,必须转对:
点击文字时,用
EventSystem.current.IsPointerOverGameObject()确认点到了目标,然后拿文字的transform.position(世界坐标)当Line Renderer的起点。拖拽时处理鼠标坐标:
- 如果是Overlay模式:直接取
Input.mousePosition,但要把Z轴设成Canvas的planeDistance(默认是10),不然Z轴不对会看不见。 - 如果是Camera模式:用
Camera.main.ScreenToWorldPoint(Input.mousePosition)转换,2D场景下把Z轴设为0。
参考代码片段:
private bool isDragging; public LineRenderer lineRenderer; public Canvas canvas; // 给文字按钮绑定这个点击事件 public void OnTextClicked() { isDragging = true; lineRenderer.positionCount = 2; lineRenderer.SetPosition(0, transform.position); } void Update() { if (!isDragging) return; Vector3 mousePos; if (canvas.renderMode == RenderMode.ScreenSpaceOverlay) { mousePos = Input.mousePosition; mousePos.z = canvas.planeDistance; } else { mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); mousePos.z = 0; } lineRenderer.SetPosition(1, mousePos); // 松开鼠标结束拖拽 if (Input.GetMouseButtonUp(0)) { isDragging = false; // 这里可以加判断是否拖拽到另一个文字的逻辑 } }- 如果是Overlay模式:直接取
三、箭头的简易实现
Line Renderer本身画不了箭头,得额外处理:
- 在Line Renderer的终点放一个箭头图标(Image),拖拽时让图标跟着终点走,然后计算角度让图标朝向起点:
arrowTransform.rotation = Quaternion.LookRotation(Vector3.forward, startPos - endPos); - 或者用两个Line Renderer,一个画主线,一个在终点画两条短线段组成箭头(计算角度后设置线段位置)。
四、最后排查常见问题
- 遮挡检查:确认Line Renderer所在物体的
Sorting Layer和Canvas一致,且Order in Layer比文字高,别被文字挡住。 - 相机设置:如果用Camera模式,Canvas的
Render Camera必须是场景里的主相机,且相机裁剪平面要包含Line Renderer的位置。 - 组件状态:检查Line Renderer组件有没有被勾选启用,有没有被代码意外禁用。
内容的提问来源于stack exchange,提问作者Salman Moussa
相关产品推荐
相关产品推荐

