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
)并查看实时编辑时会发生什么来证明是这种情况。我想它会重置为零。
我有一个带有脚本的游戏对象,该脚本具有许多不同脚本调用的变量。 例如,一个变量是 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
)并查看实时编辑时会发生什么来证明是这种情况。我想它会重置为零。