在Unity2019.3中更快地进入运行模式(PlayMode)

2021/01 23 20:01

https://docs.unity3d.com/2019.3/Documentation/Manual/ConfigurableEnterPlayMode.html

https://blogs.unity3d.com/2019/11/05/enter-play-mode-faster-in-unity-2019-3/

https://docs.unity3d.com/2019.3/Documentation/Manual/ConfigurableEnterPlayModeDetails.html

运行模式(PlayMode)是Unity工作的核心,随着项目变得越来越复杂,进入和退出运行模式变成越来越慢,工作效率就越来越低;在Unity2019.3中引入了一个可快速进入运行模式的实验功能。

根据测试结果,根据不同的项目,启动快速运行模式后,可节省50%~90%的等待时间;

当前在Unity中进入运行模式,Unity会做2件事情:重置脚本状态 [域重载(Domain Reload)],以及重新加载场景;

开启方法为: File / Project Settings / Editor / Enter Play Mode Settings 中,勾上 Enter Play Mode Options ( Experimental );

而且后面还有2个选项:重新域 和 重载场景;
这些选项可以在没有代码更改的情况下,禁用 域和重新场景;

下图展示了禁用域重载和场景重载,进入运行模式的过程

注意:此功能处于实验阶段,有些软件包可能会有问题。

禁用了域重载后如何正确修改脚本?

我们需要修改脚本中静态对象和事件,以确保进入运行模式时正确重置脚本环境;

使用[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]属性,并显式重置该值,以确保在禁用域重载时,相关内容被重置:

using UnityEngine;
 
public class StaticCounterExampleFixed : MonoBehaviour
{
  static int counter = 0; 
 
 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
  static void Init()
  {
    counter = 0;   
  }
 
  void Update()
  {
    if (Input.GetButtonDown("Jump"))
    {
      counter++;
    }
  }
}

如下代码在禁用域重载后会出问题,因为每次启动Start时都会添加Quit方法

using UnityEngine;
public class StaticEventExample : MonoBehaviour
{
    void Start()
    {
        Debug.Log("Registering quit function");
        Application.quitting += Quit;
    }
    
    static void Quit()
    {
        Debug.Log("Quitting!");
    }
}

使用 [RuntimeInitializeOnLoadMethod] 属性解决:

using UnityEngine;
public class StaticEventExampleFixed : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod]
    static void RunOnStart()
    {
        Debug.Log("Unregistering quit function");
        Application.quitting -= Quit;
    }
 
    void Start()
    {
        Debug.Log("Registering quit function");
        Application.quitting += Quit;
    }
 
    static void Quit()
    {
        Debug.Log("Quitting the Player");
    }
}