如何捕捉从相机到地面的光线

本文关键字:何捕捉 相机 | 更新日期: 2023-09-27 18:06:53

我从相机上拍了一条射线到与我的地面相交的位置,鼠标点击,但结果- NullReferenceException。下面是代码:

public class StopperByClick : MonoBehaviour
{
    public Ray ray;
    public RaycastHit hit;
    public GameObject cube;
    public GameObject plane;

    void Update()
    {
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Vector3 dir = transform.TransformDirection(Vector3.forward * 100);
        Debug.DrawRay(transform.position, dir, Color.green);
        if (Input.GetMouseButton(0))
        {
            if (Physics.Raycast(ray, out hit, 10) && hit.collider.gameObject == plane)
            {
                float x = (hit.point.x > 67232f) ? hit.point.x : 67232f;
                float y = (hit.point.y > 22544f) ? hit.point.y : 22544.5f;
                float z = (hit.point.z > 46474f) ? hit.point.z : 46474f;
                Vector3 pos = new Vector3(x, y, z);
                cube.transform.position = pos;
                Instantiate(cube);
                //Debug.Log(hit.transform.position.x + " " + hit.transform.position.y + " " + hit.transform.position.z);                
            }
        }
    } 
}

请帮帮我,怎么了?

如何捕捉从相机到地面的光线

你可能没有主摄像机,确保你的主摄像机有"MainCamera"标签,因为Camera.main有以下文档:

第一个启用的摄像机标记为"MainCamera"(只读)。

如果场景中没有这样的相机,则返回null。

https://docs.unity3d.com/ScriptReference/Camera-main.html

另一种可能性是你没有给你的plane变量分配任何东西,我认为这是一个你应该通过检查器分配的公共属性。(Asker已排除此可能性)


如果你想以不同的方式获取你的相机(如果你的脚本附加到它),你可以这样做:

private Camera _cameraComponent;
void Initialize() {
    _cameraComponent = GetComponent<Camera>();
}
void Update() {
    ray = _cameraComponent.ScreenPointToRay(Input.mousePosition);
    ...
}

对编辑后问题的回答:

你没有为你的光线投射绘制一个代表性的调试光线。你的射线指向10distance,而你的调试射线指向100distance

我怀疑你的飞机比10单位远(由提问者在评论中确认)


对错误位置注释的回答:

float x = (hit.point.x > 67232f) ? hit.point.x : 67232f;
float y = (hit.point.y > 22544f) ? hit.point.y : 22544.5f;
float z = (hit.point.z > 46474f) ? hit.point.z : 46474f;

这些是导致该行为的行。你所创建的所有多维数据集都来自于你所设置的最小值以下的点击,因此它们将在这些最小值处生成。

如果您混淆了,x = (x > n) ? x : n;表示如果x低于n,则设x = n。可以表达float x = Mathf.min(hit.point.x, 67343f)

我很好奇你这样做的原因。你能保证立方体不会从平面上衍生出来吗?如果是这样,这是不必要的,因为你的光线投射只能给你平面上的点。在这种情况下,你应该简单地删除这3行,并使cub.transform.position = hit.point