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
相关产品推荐
相关产品推荐

