Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕捉从摄像机到地面的光线?_C#_Unity3d - Fatal编程技术网

C# 如何捕捉从摄像机到地面的光线?

C# 如何捕捉从摄像机到地面的光线?,c#,unity3d,C#,Unity3d,我用鼠标点击的位置和我的地面将一条光线从相机射向交点,但结果-NullReferenceException。代码如下: public class StopperByClick : MonoBehaviour { public Ray ray; public RaycastHit hit; public GameObject cube; public GameObject plane; void Update() { ray =

我用鼠标点击的位置和我的地面将一条光线从相机射向交点,但结果-
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);                
            }
        }
    } 
}

请帮帮我,怎么了?

您可能没有主摄像头,请确保您的主摄像头带有“main camera”标签,因为
摄像头。main
有以下文档:

第一个启用的摄像头标记为“MainCamera”(只读)

如果场景中没有此类摄影机,则返回null

另一种可能是,您没有为
平面
变量分配任何东西,我认为这是一个公共属性,您应该通过inspector进行分配。(Asker排除了这种可能性)


如果希望以不同方式获取相机(如果脚本已连接到相机),可以执行以下操作:

private Camera _cameraComponent;

void Initialize() {
    _cameraComponent = GetComponent<Camera>();
}

void Update() {
    ray = _cameraComponent.ScreenPointToRay(Input.mousePosition);
    ...
}
这些是导致这种行为的原因。您创建的所有立方体都是通过低于您设置的最小值的单击来创建的,因此它们是在这些最小值下生成的

如果您感到困惑,
x=(x>n)?x:n
表示如果
x
低于
n
,则使
x=n
。可以表示为
float x=Mathf.min(hit.point.x,67343f)


我很好奇你这样做的原因。你确定立方体不能从飞机上繁殖吗?如果是,这是不必要的,因为光线投射只能在平面上为您提供点。在这种情况下,您只需删除这3行,并使
cub.transform.position=hit.point

我可以看到您提供的示例代码<当存在未分配的引用变量时,代码>NullReferenceException
通常以统一形式出现。因此,请提供实际/完整的代码。还要提到,代码在哪一行抛出异常。请参见:ray对象为null!我编辑代码。请告诉我怎么了?没关系。如果您正在调用
Camera.main
它不关心您从哪里调用它,它将始终返回第一个已启用的标记为“MainCamera”的摄像头。请指定摄像头的位置和楼层的位置(可能太远)?你能确保你的
plane
变量设置正确吗(它可能比较为空)?@AndrewLawmaking增加光线的长度。只是为了测试它是否正常工作,您可以将它从10设置为一些大的数字,比如10000左右。这可能是因为您对所有这些数字都应用了限制,这取决于您的平面有多大,
float x=(hit.point.x>67232f)?命中点x:67232f
将把所有多维数据集放在
x=67232f
上。我可以问一下为什么您的对象距离0这么远吗?它们都位于
67232、22544.5、46474
?进行检查的原因是什么?如果光线与平面碰撞,立方体应始终位于平面上的相应点。
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;