GetComponent: NullReferenceException

本文关键字:NullReferenceException GetComponent | 更新日期: 2023-09-27 18:22:44

我得到以下错误:

NullReferenceException:对象引用未设置为对象的实例

当尝试在此行拾取对象时:

Ray ray = mainCamera.GetComponent<Camera>().ScreenPointToRay(new Vector3(x, y));

完整代码:

using UnityEngine;
using System.Collections;
public class pickupobject : 
MonoBehaviour {
    GameObject mainCamera;
    public float distance;
    GameObject carryObject;
    bool carrying;
    void start() {
        mainCamera = GameObject.FindWithTag("MainCamera");
    }
    void pickup()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            int x = Screen.width / 2;
            int y = Screen.height / 2;
            Ray ray = mainCamera.GetComponent<Camera>().ScreenPointToRay(new Vector3(x, y));
            // Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))
            {
                pickupcube p = hit.collider.GetComponent<pickupcube>();
                if (p != null)
                {
                    carrying = true;
                    carryObject = p.gameObject;
                }
            }
        }
    }
    void carry(GameObject o)
    {
        o.GetComponent<Rigidbody>().isKinematic = true;
        o.transform.position = mainCamera.transform.position + mainCamera.transform.forward * distance;
    }
    // Update is called once per frame
    void Update()
    {
        if (carrying)
        {
            carry(carryObject);
        }
        else
        {
            pickup();
        }
    }
}

GetComponent: NullReferenceException

试着像这样写同一行:

Ray ray = Camera.main.gameObject.GetComponent<Camera>().ScreenPointToRay(new Vector3(x, y, 0));

首先,FindWithTag和任何Find都非常广泛(在您的情况下无关紧要,因为您只调用过一次,但只是为了记录在案),您应该在那里检查拼写,并尝试使用Debug.Log();打印到mainCamera、Ray等的控制台值,看看何时会得到意外结果。现在只需试试我的代码,它几乎是一样的,只是对相机使用了不同的引用

http://docs.unity3d.com/ScriptReference/Camera-main.html