有时候我们在Unity项目中,需要在切换平台后,或者项目加载完后,做一些自动化的处理,比如项目加载完后检测一些配置,或者检测项目版本。或者在切换项目平台的时候,需要跟据不同的平台设置不同的字体移除不属于该平台的一些资源等等。下面记录一下如何添加对这两个事件的处理。

  • 1.Unity切换平台事件的处理
    要处理这个事件,我们需要将类实现 IActiveBuildTargetChanged 接口,并重写该接口的 OnActiveBuildTargetChanged方法。那么当切换平台的时候,就会执行这个类的 OnActiveBuildTargetChanged 方法。在这个方法中,我们就可以添加自定义的一些处理逻辑了。代码如下:

    /// <summary>
    /// 切换平台后,对一些资源的处理
    /// 有些资源只有再特定的平台才会使用,再切换平添后,不要的资源要移除或者移动到别的地方
    /// </summary>
    public class BuildTargetChangedTool : IActiveBuildTargetChanged
    {
      public int callbackOrder { get; }
      public void OnActiveBuildTargetChanged(BuildTarget previousTarget, BuildTarget newTarget)
      {
          //切换平台后的一些处理
          PlatformResTool.ProcessFonts(newTarget);
          PlatformResTool.ProcessThirdSDK(newTarget);
          LinkXmlBuildProcessor.LinkXmlOp(newTarget);
          AssetDatabase.Refresh();
      }
    }
    
  • 2.Unity项目加载完事件的处理
    项目加载完成的事件跟切换平台的事件的处理方式不一样,这里需要使用 InitializeOnLoad 这个特性来实现。我们需要给类添加这个特性,同时它需要一个静态构造方法,当项目加载完成后,Unity编辑器就会调用这个静态构造方法,然后在这个静态构造方法中我们就可以添加一些自己的处理逻辑了。代码如下:

    /// <summary>
    /// 工程加载完,要处理这些跟平台相关的资源
    /// </summary>
    [InitializeOnLoad]
    public class StartUpTools
    {
    	static StartUpTools()
    	{
    		if (!EditorApplication.isPlayingOrWillChangePlaymode)
    		{
    			BuildTarget buildTarget = Packager.GetBuildTarget();
    			PlatformResTool.ProcessFonts(buildTarget);
    			PlatformResTool.ProcessThirdSDK(buildTarget);
    			LinkXmlBuildProcessor.LinkXmlOp(buildTarget);
    			AssetDatabase.Refresh();
    		}
    	}
    }