c# - 脚本的执行顺序 - Awake 和 OnEnable
问题描述
我正面临与脚本执行顺序相关的问题,尽管我是一位经验丰富的 Unity 开发人员,但我并不在意这一点。所以我想对此进行解释。
这是我的 MenuContoller 脚本代码:
public class MainMenuController : MonoBehaviour
{
[SerializeField] Text bestScoreText;
[SerializeField] Toggle soundToggle;
private void OnEnable()
{
Init();
}
private void Init()
{
if (GameManager.Instance == null)
Debug.Log("null game manager");
GameManager.Instance.PlayerLives = 0;
bestScoreText.text = DataStorage.RetrieveBestScore().ToString("D5");
SoundManager.Instance.IsSoundEnabled = DataStorage.RetrieveSoundStatus() == GameConstants.STAT_ON ? true : false;
soundToggle.isOn = !SoundManager.Instance.IsSoundEnabled;
}
}
这是我的 GameManager 脚本代码:
public class GameManager : MonoBehaviour
{
private static GameManager instance;
//
private int levelIndex;
private int gameScore;
private int playerLives;
void Awake()
{
instance = this;
}
public static GameManager Instance
{
get
{
return instance;
}
}
}
我在执行期间收到 NullReferenceException:
现在我无法理解 - OnEnable 方法是如何在其他脚本的 Awake 方法之前执行的?
由于这个原因,我得到一个空引用异常。根据我的理解,所有脚本 Awake 方法首先执行,然后在 OnEanble 调用项目的所有脚本之后执行。
请向我解释这一点,以便解决我的困惑。
解决方案
您的问题是:为什么 OnEnable() 在其他脚本中在 Awake() 之前执行,对吧?
如果是,那么我想我的回答会对你有所帮助,
我已经多次遇到这个问题,我认为这是因为场景中有很多脚本以及同一个“游戏对象”上有很多脚本,所以有时这些脚本会在不同的帧中运行,就像有时它需要 2或 3 帧结束执行,这就是为什么在某些游戏对象中,Awake 方法和 OnEnable 方法在第 1 帧中运行,而在其他游戏对象中,Awake 方法在第 2 帧或第 3 帧中运行。
为了解决这个问题,通常我从子游戏对象中的所有脚本中删除所有 OnEnable 方法,并将其合并到父游戏对象中的一个或多个主脚本中,例如游戏管理器脚本有一个 OnEnable 方法,我在其中编写了我想要执行的所有代码在其他子脚本中通过在游戏管理器中引用它。
推荐阅读
- java - 更改 Java 中的默认输入和输出流
- excel - 发送小瓶电子邮件时宏excel文件不显示代码
- android - 下一个和上一个操作不适用于 MediaButtonReceiver
- python-3.x - '无法导入'bs4' pylint' - vs 代码
- file - 从 Files.com 读取文件内容
- javascript - Fabric js折线对象在撤消织物历史后位置错误
- javascript - Node JS readdir 回调从未被调用
- c++ - 在 C++ 类中包装老式 C 库(以及没有用户参数的回调)
- python - 使用井筒/管道的方位角、倾角和测量深度(MD)查找纬度/经度坐标
- python - python将一维概率数组转换为二维数组