如何捕捉从相机到地面的光线
本文关键字:何捕捉 相机 | 更新日期: 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
有以下文档:
https://docs.unity3d.com/ScriptReference/Camera-main.html第一个启用的摄像机标记为"MainCamera"(只读)。
如果场景中没有这样的相机,则返回null。
另一种可能性是你没有给你的(Asker已排除此可能性)plane
变量分配任何东西,我认为这是一个你应该通过检查器分配的公共属性。
如果你想以不同的方式获取你的相机(如果你的脚本附加到它),你可以这样做:
private Camera _cameraComponent;
void Initialize() {
_cameraComponent = GetComponent<Camera>();
}
void Update() {
ray = _cameraComponent.ScreenPointToRay(Input.mousePosition);
...
}
对编辑后问题的回答:
你没有为你的光线投射绘制一个代表性的调试光线。你的射线指向10
的distance
,而你的调试射线指向100
的distance
我怀疑你的飞机比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