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

Unity Static Instance becomes Null Reference on live code update

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

此脚本有一个自身的静态实例,它在 Start() 上应用了自身。

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

我已经尝试设置单例,希望这样可以解决问题,但效果相同。

有谁知道是否有办法使用 class 的全局实例?我发现能够在实时游戏中编辑代码并刷新它非常有用……但不如拥有包含频繁共享变量的静态实例有用。这似乎是人们以前应该遇到的事情,但对于我来说,我似乎无法在网上找到任何关于它的信息。

顺便说一句,我正在使用 C# =] 谢谢!

编辑:为 GameController 添加代码 class。

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

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

你可以:

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

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

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

考虑一下:您编辑了 class。为了使用更新后的文件,必须重新编译代码并将 "injected" 替换为 运行ning 游戏中的原始版本。虽然组件的任何 实例 都可以序列化和反序列化以提供一定程度的连续性 post-edit(即未重命名的字段将保留其值),静态field 不会 - 而且,Start 在游戏中间重新 运行 是没有意义的,这是你的 Instance 设置的地方。

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