我从相机拍摄光线到鼠标点击位置和地面的交叉点,但结果是 - 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);
}
}
}
}
请帮帮我,有什么不对?
答案 0 :(得分:1)
您可能没有主摄像头,请确保您的主摄像头具有" MainCamera"自Camera.main
以来的标记包含以下文档:
第一个启用的摄像头标记为" MainCamera" (只读)。
如果场景中没有这样的摄像机,则返回null。
https://docs.unity3d.com/ScriptReference/Camera-main.html
另一种可能性是你没有为(Asker排除了这种可能性) plane
变量分配任何东西,我希望这是一个你应该通过督察分配的公共财产。
如果您想以不同的方式获取相机(如果附加了脚本),您可以这样做:
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