Unity静态实例在实时代码更新时变为空引用

时间:2015-01-05 23:17:55

标签: static unity3d nullreferenceexception

我有一个带有脚本的GameObject,该脚本包含许多不同脚本调用的变量。 例如,一个变量是Vector2,游戏中的所有其他移动对象都使用它来知道地图的移动方式。

此脚本具有自身的静态实例,它将自身应用于Start()。

一切都运行良好,但我遇到了一个问题,如果我在游戏运行时编辑任何代码,当游戏加载新代码并尝试继续时,任何从实例调用的内容gameObject获取NullReferenceException。

我已经尝试过设置单身人士,希望可能会解决这个问题,但这些也会产生同样的效果。

有没有人知道是否有使用全局类实例的方法?我发现能够编辑代码并在实时游戏中刷新它是非常有用的......这不像拥有包含频繁共享变量的静态实例那样有用。这似乎是人们之前应该反对的东西,但对于我的生活,我似乎无法在网上找到任何关于它的东西。

我使用C#btw =]谢谢!

编辑:添加GameController类的代码。

public class GameController : MonoBehaviour 
{
    public static GameController Instance;
    public int score;
    public GameObject debugText;
    public UnityEngine.UI.Text scoreText;

    public float sfxVolume = 1;

    public Vector2 scrollSpeedBase;
    public Vector2 scrollSpeed;
    public Vector3 scrollSpeedV3;
    public float mapExitPoint;
    public float timeDelta;


    void Start () 
    {
        Instance = this;
        score = 0;
        UpdateScore();
    }
}

2 个答案:

答案 0 :(得分:3)

我怀疑你看到的是在其他脚本Start()调用之后调用Start()中的静态实例设置。

你可以:

  • 设置脚本执行顺序优先级,使其先运行(或将初始化移至Awake方法)

  • 使用单例样式设置,其中有一个Getter方法,可以在调用时初始化静态变量。

答案 1 :(得分:3)

我怀疑这是实时编辑的限制。

考虑一下:你已经编辑过一堂课。为了使用更新的文件,必须重新编译代码并注入"进入正在运行的游戏而不是原始版本。虽然您的组件的任何实例可以被序列化和反序列化以在编辑后提供一定程度的连续性(即,未重命名的字段将保留其值),但静态字段赢得了'是的 - 而且,Start在游戏中间重新运行是没有意义的,这是Instance设置的地方。

你可以通过在你的类中存储另一个静态变量来证明这种情况(一个更简单的变量 - 比如int),看看你在编辑时会发生什么。我想象它会重置为零。