首页 > 解决方案 > 脚本的执行顺序 - 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 调用项目的所有脚本之后执行。

请向我解释这一点,以便解决我的困惑。

标签: c#unity3d

解决方案


您的问题是:为什么 OnEnable() 在其他脚本中在 Awake() 之前执行,对吧?

如果是,那么我想我的回答会对你有所帮助,

我已经多次遇到这个问题,我认为这是因为场景中有很多脚本以及同一个“游戏对象”上有很多脚本,所以有时这些脚本会在不同的帧中运行,就像有时它需要 2或 3 帧结束执行,这就是为什么在某些游戏对象中,Awake 方法和 OnEnable 方法在第 1 帧中运行,而在其他游戏对象中,Awake 方法在第 2 帧或第 3 帧中运行。

为了解决这个问题,通常我从子游戏对象中的所有脚本中删除所有 OnEnable 方法,并将其合并到父游戏对象中的一个或多个主脚本中,例如游戏管理器脚本有一个 OnEnable 方法,我在其中编写了我想要执行的所有代码在其他子脚本中通过在游戏管理器中引用它。


推荐阅读