You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 3D项目游戏模式下如何渲染射线线条?

Unity游戏模式下渲染射线线条的解决方案

问题根源

你当前使用的OnDrawGizmos()方法仅在Unity编辑器的场景视图中生效,游戏运行(Play模式)时不会渲染这些Gizmos内容,这就是线条在游戏模式下不显示的核心原因。


方案一:使用LineRenderer组件(推荐,操作简单易维护)

  1. 给挂载pointer脚本的GameObject添加LineRenderer组件
  2. 修改脚本代码,通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:05:32