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;