Unity中的对象引用问题

时间:2014-06-17 16:43:37

标签: c# scripting unity3d object-reference

我关注a tutorial series

我遇到了一个问题。我理解错误信息是什么:

Object reference not set to an instance of an object

表示,但我不确定为什么会出现此消息。我不确定为什么它不能引用它。我是Unity的新手。

我还在documents/UnityProjects/PongTutorial创建了我的项目,其中PongTutorial是此项目的名称。

我为Unity项目创建了一个文件夹,以便将它们保存在一起。在名为UnityProjects的文件夹中创建我的Unity项目而不是在My Documents文件夹中创建每个项目时会出现问题吗?

我创建了一个gameManager并附加了一个名为GameSetup的脚本,其中此脚本中的代码为:

using UnityEngine;
using System.Collections;

public class GameSetup : MonoBehaviour 
{
    Camera mainCam;
    BoxCollider2D topWall, bottomWall, leftWall, rightWall;
    Transform player1, player2;

    // Use this for initialization
    void Start () 
    {
    }

    // Update is called once per frame
    void Update () 
    {
        topWall.size = new Vector2(mainCam.ScreenToWorldPoint(new Vector3(Screen.width * 2f, 0f, 0f)).x, 1f);
        topWall.center = new Vector2(0f, mainCam.ScreenToWorldPoint(new Vector3(0f, Screen.height, 0f)).y + 0.5f);
    }
}

我已在MonoDevelop中为此脚本清理,构建和重建Assembly-CSharp,并在MonoDevelop中PongTutorial,我收到有关mainCam的警告以及所有类型的变量BoxCollider2D

这些警告表示它们从未被分配给,因此将具有空值,这是真的。但是,我收到了object reference not set to an instance of an objecttopWall.size行的topWall.center

我刚刚尝试创建新对象。例如,在Start我有mainCam = new Camera(),但这似乎不起作用。在视频中,在我的情况下,变量在GM或GameManager的Inspector中可见。但是,对我来说情况并非如此。

2 个答案:

答案 0 :(得分:4)

首先需要公开变量,否则它们不会显示在检查器中:

public class GameSetup : MonoBehaviour {

public Camera mainCam;
public BoxCollider2D topWall, bottomWall, leftWall, rightWall;
public Transform player1, player2;

// rest of your code...

}

然后将一些游戏对象(附有适当的组件)拖动到检查器中的新字段中。这应该修复“未设置为对象实例的对象引用”错误消息。此错误消息基本上意味着您正在尝试对没有设置值的变量执行操作。

答案 1 :(得分:2)

Jan解决了这个问题,但我只是想提供一个替代方案,以防你的成员变成私人。

只需将<Serialize>装饰放在要在检查器中显示的成员上。

<Serialize>
Camera mainCam;
<Serialize>
private BoxCollider2D topWall, bottomWall, leftWall, rightWall;