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

Unity中Raycast出现两条异向射线的问题求助

问题分析与解决

射线重复显示的原因

  • 你代码中仅调用了一次Debug.DrawRay,出现两条射线的常见原因:
    • 脚本被重复挂载到多个对象(比如同时挂在玩家根对象和相机上)
    • Unity Scene视图默认显示的相机内置射线(并非代码绘制的调试射线)
  • 代码中声明的public Camera cam未被使用,属于冗余代码。

正确实现玩家方向射线

根据你的需求,分两种场景给出实现方案:

场景1:脚本挂在玩家根对象(代表玩家整体朝向)

直接使用玩家对象的transform.forward,确保玩家根对象的朝向与角色实际面向一致:

using UnityEngine;

public class Toast : MonoBehaviour
{
    RaycastHit raycastHit;

    void Update()       
    {
        // 发射射线并检测碰撞,限制最大距离为1000
        if (Physics.Raycast(transform.position, transform.forward, out raycastHit, 1000f))
        {
            // 使用CompareTag替代字符串比较,性能更优
            if (raycastHit.transform.CompareTag("Death"))
            {
                Debug.Log("DIE OF BUTTER");         
            }
        }
        // 绘制红色调试射线,长度1000
        Debug.DrawRay(transform.position, transform.forward * 1000f, Color.red);
    }
}

场景2:脚本挂在相机(FPS视角下的玩家视线)

如果是FPS游戏,射线应从屏幕中心发射,匹配玩家实际视角:

using UnityEngine;

public class Toast : MonoBehaviour
{
    RaycastHit raycastHit;
    Camera playerCam;

    void Start()
    {
        playerCam = GetComponent<Camera>();
    }

    void Update()       
    {
        // 从屏幕中心生成射线
        Ray ray = playerCam.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
        if (Physics.Raycast(ray, out raycastHit, 1000f))
        {
            if (raycastHit.transform.CompareTag("Death"))
            {
                Debug.Log("DIE OF BUTTER");         
            }
        }
        // 绘制蓝色调试射线
        Debug.DrawRay(ray.origin, ray.direction * 1000f, Color.blue);
    }
}

额外优化建议

  • 移除未使用的变量:删除冗余的public Camera cam声明
  • 限制射线距离:在Physics.Raycast中添加最大距离参数,避免无意义的远距离检测
  • 检查挂载对象:确保脚本仅挂载在一个目标对象上,避免重复执行绘制逻辑

内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:18:16