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

时间:2016-09-14 10:23:31

标签: c# unity3d

我从相机拍摄光线到鼠标点击位置和地面的交叉点,但结果是 - 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);                
            }
        }
    } 
}

请帮帮我,有什么不对?

1 个答案:

答案 0 :(得分:1)

您可能没有主摄像头,请确保您的主摄像头具有" 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);
    ...
}

回答编辑过的问题:

您没有为您的光线投射绘制代表性调试光线。你的光线照射到distance 10,而你的调试光线会传到distance 100

我怀疑你的飞机距离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