GetComponent:NullReferenceException

时间:2015-11-18 20:06:48

标签: c# unity3d raytracing

我收到以下错误:

  

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();
        }
    }

}

1 个答案:

答案 0 :(得分:1)

尝试编写相同的行:

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