当执行射线投射时,Camera.main为空

8

导致错误的代码:

void Update()
{
    if (Input.touchCount > 0)
    {
        RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position), Vector2.zero);
        if (hit && hit.collider != null && hit.collider.name == "leftTapArea")
        {
            hit.transform.name = "Hit";
        }
    }
}

这段代码提示字符串有问题:

RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position), Vector2.zero);

错误信息:

NullReferenceException: Object reference not set to an instance of an object leftScript.Update () (at Assets/leftScript.cs:16)

该错误是由于对象引用为空导致的。
4个回答

19

你的代码中唯一可能返回 null 的是 Camera.main.ScreenToWorldPoint。这意味着 Camera.main 为空。要初始化 Camera.main,相机必须具有 MainCamera 标签。

选择相机 GameObject 然后将标签更改为 MainCamera。

进入图像描述

如果您不想让相机位于 MainCamera 标签中,您也可以使用 GameObject.Find 直接找到它,然后从中获取 Camera 组件。

Camera cam;

void Start()
{
    cam = GameObject.Find("NameOfCameraGameObject").GetComponent<Camera>();
}

void Update()
{
    if (Input.touchCount > 0)
    {
        RaycastHit2D hit = Physics2D.Raycast(cam.ScreenToWorldPoint(Input.GetTouch(0).position), Vector2.zero);
        if (hit && hit.collider != null && hit.collider.name == "leftTapArea")
        {
            hit.transform.name = "Hit";
        }
    }
}

非常感谢,这很有帮助。 - Sharpy
我明白你所说的我的重复问题...让我尝试一下你的解决方案...谢谢。 - Job_September_2020
太好了!非常感谢。 - Alejandro Teixeira Muñoz

2
请确保在您的场景中有一个带有相机组件和标签“MainCamera”的活动游戏对象。

Tag
(来源:unity3d.com)


0
我遇到了同样的错误。但我的错误在于相机脚本的名称,我将其命名为大写字母"C"的Camera。因此,我无法访问Camera.main。我更改了脚本的名称,更重要的是将类的名称从'Camera'改为'camera'。然后就没有出现错误了。虽然有些晚了,但我认为这可能会帮助其他人。

0

如果你在场景中没有默认添加“Main Camera”游戏对象并在运行时初始化它,那么以下是正确的做法:

//This is needed in order for UnityEngine.Camera.main... to work
public const string CameraGameObjectName = "MainCamera";

init方法的内容:

GameObject cameraGameObject = new GameObject(CameraGameObjectName);
cameraGameObject.tag = CameraGameObjectName;
UnityEngine.Camera camera = cameraGameObject.AddComponent<UnityEngine.Camera>();
Transform cameraPosition = cameraGameObject.GetComponent<Transform>();

您可以随时通过以下方式访问它:

UnityEngine.Camera.main.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接