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

Unity射线投射仅从原点生效问题求助

Unity射线投射仅从原点生效问题求助

兄弟我太懂你这种头疼的情况了——本来在原点的时候射线准得一批,角色一挪位置,射线方向就跟鼠标对不上了,明明起点还是枪的位置,就是方向偏得离谱对吧?

先帮你揪出问题根源:你现在处理鼠标坐标转世界坐标的方式有问题,硬设worldPosition.z = 0这种操作完全没考虑相机的投影关系,当角色离开原点,相机的视角和位置变化会直接导致这个转换出来的方向跑偏。而且你在FixedUpdate里处理鼠标点击也不太合适,FixedUpdate是固定时间步长更新,很容易错过单次的鼠标点击事件,应该放到Update里处理。

给你一套直接能用的修正方案,核心是用Unity官方推荐的ScreenPointToRay方法来生成正确的射线方向:

修正后的代码示例

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Gun : MonoBehaviour
{
    public int gunDamage = 5;

    void Update()
    {
        // 先判断鼠标没点在UI上,避免误触发
        if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())
        {
            // 生成一条从相机出发、穿过鼠标屏幕位置的射线
            Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition);
            
            // 我们需要的是射线的方向,然后从枪的位置沿着这个方向发射
            Vector3 rayDirection = mouseRay.direction;
            Ray gunRay = new Ray(transform.position, rayDirection);

            // 执行射线检测
            if (Physics.Raycast(gunRay, out RaycastHit hitInfo))
            {
                // 这里写击中后的逻辑,比如给目标加伤害
                Debug.Log($"击中了物体:{hitInfo.collider.gameObject.name}");
                // 示例:如果目标有Enemy组件,就调用受伤方法
                // Enemy targetEnemy = hitInfo.collider.GetComponent<Enemy>();
                // if (targetEnemy != null)
                // {
                //     targetEnemy.TakeDamage(gunDamage);
                // }
            }

            // 绘制调试射线,方便你在Scene视图里看射线方向对不对
            Debug.DrawRay(transform.position, rayDirection * 100f, Color.red, 0.2f);
        }
    }
}

关键知识点说明

  • 用ScreenPointToRay替代手动转坐标:这个方法会自动根据相机的类型(透视/正交)计算出正确的世界空间射线,完全不用你手动处理z值的问题,从根源上避免方向偏移。
  • 把输入逻辑移到Update:Input.GetMouseButtonDown是帧相关的事件,放在Update里才能准确捕捉到每一次点击。
  • 添加UI点击判断:EventSystem.current.IsPointerOverGameObject()能防止你点击UI按钮时也发射射线,提升体验。

额外注意事项

  • 确保你的主相机挂了MainCamera标签,不然Camera.main会找不到相机;如果是用的玩家视角相机,直接获取那个相机的引用会更稳妥。
  • 检查射线的碰撞层设置,确保你想击中的物体在射线检测的层范围内,没有被LayerMask过滤掉。

备注:内容来源于stack exchange,提问作者John McCann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 10:14:50