Unity 3D项目游戏模式下如何渲染射线线条?
Unity游戏模式下渲染射线线条的解决方案
问题根源
你当前使用的OnDrawGizmos()方法仅在Unity编辑器的场景视图中生效,游戏运行(Play模式)时不会渲染这些Gizmos内容,这就是线条在游戏模式下不显示的核心原因。
方案一:使用LineRenderer组件(推荐,操作简单易维护)
- 给挂载
pointer脚本的GameObject添加LineRenderer组件 - 修改脚本代码,通过LineRenderer实现运行时线条渲染:
using UnityEngine; public class pointer : MonoBehaviour { public GameObject currentHitObject; private float currentHitDistance; private Vector3 origin; private Vector3 direction; public float maxDistance; private LineRenderer lineRenderer; void Start() { // 获取或自动添加LineRenderer组件 lineRenderer = GetComponent<LineRenderer>() ?? gameObject.AddComponent<LineRenderer>(); // 配置线条基础属性 lineRenderer.startWidth = 0.02f; lineRenderer.endWidth = 0.02f; lineRenderer.startColor = Color.red; lineRenderer.endColor = Color.red; lineRenderer.useWorldSpace = true; } void Update() { RaycastHit hit; origin = transform.position; direction = transform.forward; if (Physics.Raycast(origin, direction, out hit)) { currentHitDistance = hit.distance; currentHitObject = hit.transform.gameObject; Debug.Log("Done"); } else { currentHitDistance = maxDistance; currentHitObject = null; } // 更新线条的两个端点位置 lineRenderer.SetPosition(0, origin); lineRenderer.SetPosition(1, origin + direction * currentHitDistance); } // 保留该方法用于编辑模式预览(可选) private void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawLine(origin, origin + direction * currentHitDistance); Gizmos.DrawIcon(origin + direction * currentHitDistance, "CrossIcon"); } }
方案二:使用GL类绘制(适合自定义渲染需求)
如果需要更灵活的绘制控制,可通过OnRenderObject()结合GL类实现:
using UnityEngine; public class pointer : MonoBehaviour { public GameObject currentHitObject; private float currentHitDistance; private Vector3 origin; private Vector3 direction; public float maxDistance; public Material lineMaterial; // 需指定一个Unlit/Color材质 void Start() { // 自动创建默认材质(未指定时) if (lineMaterial == null) { lineMaterial = new Material(Shader.Find("Unlit/Color")); lineMaterial.color = Color.red; } } void Update() { RaycastHit hit; origin = transform.position; direction = transform.forward; if (Physics.Raycast(origin, direction, out hit)) { currentHitDistance = hit.distance; currentHitObject = hit.transform.gameObject; Debug.Log("Done"); } else { currentHitDistance = maxDistance; currentHitObject = null; } } private void OnRenderObject() { lineMaterial.SetPass(0); GL.PushMatrix(); GL.LoadIdentity(); GL.Begin(GL.LINES); GL.Color(Color.red); // 定义线条起点和终点 GL.Vertex(origin); GL.Vertex(origin + direction * currentHitDistance); GL.End(); GL.PopMatrix(); } private void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawLine(origin, origin + direction * currentHitDistance); Gizmos.DrawIcon(origin + direction * currentHitDistance, "CrossIcon"); } }
注意事项
- 方案一中的LineRenderer可直接在Inspector面板调整宽度、颜色、材质等属性,无需修改代码
- 方案二中需确保材质使用支持GL绘制的Shader(如
Unlit/Color) - 务必在Inspector面板给
maxDistance赋值,避免线条长度为0
内容的提问来源于stack exchange,提问作者user15365798
相关产品推荐
相关产品推荐

