Unity编辑器为切换平台,工程加载完成事件添加自动处理

有时候我们在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(); } } }

June 26, 2023 · 1 min · 74 words · Link

Unity编辑器-persistentDataPath-dataPath-streamingAssetsPath

Unity中persistentDataPath, dataPath, streamingAssetsPath在不同的平台对应的路径 为了方便以后的开发,自己结合官方资料和自己的实际开发,把上面的路径变量在不同的平台对应的正式路径总结一下 Application.persistentDataPath 官方参考:https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Application-persistentDataPath.html 对app是只读的,对玩家来说读写都可以,如果是IOS或者安卓,该路径指向设备的公共目录 app更新的时候,不会删除该目录,但是用户自己是可以对该目录增删改查的 平台 指向的位置 Windows Store Apps %userprofile%\AppData\Local\Packages&lt;productname>\LocalState Windows Editor and Standalone Player %userprofile%\AppData\LocalLow&lt;companyname>&lt;productname> WebGL /idbfs/<md5 hash of data path> 该路径是URL最后一个斜杠“/”和“?”之间的字符串 Linux $XDG_CONFIG_HOME/unity3d 或者$HOME/.config/unity3d iOS /var/mobile/Containers/Data/Application/<guid>/Documents tvOS 不支持且返回空字符串 Android 通常指向/storage/emulated/0/Android/data/<packagename>/files,有的老机型可能指向SD卡的路径 Mac 指向用户的Library目录,通常该目录是隐藏的,现在Unity是指向~/Library/Application Support/company name/product name Application.dataPath 官方参考:https://docs.unity3d.com/2020.3/Documentation/ScriptReference/Application-streamingAssetsPath.html 对玩家和app都是只读的,是指设备的游戏目录,只能读取 根据不同的平台,游戏目录不一样 平台 指向位置 Unity Editor <项目路径>/Assets Mac player <path to player app bundle>/Contents iOS player <path to player app bundle>/<AppName.app>/Data Win/Linux player <游戏的可执行文件的数据目录> (请注意Linux目录是大小写敏感的,window不是) WebGL 玩家数据目录的绝对URL(没有具体的文件名) Android 通常指向APK,如果你使用的是安卓分包,那么它指向OBB(也就是说游戏数据文件都保存到了OBB文件中) Windows Store Apps 是一个指向玩家数据目录的绝对路径 注意:PC上返回的路径是用反斜杠(“\”)做分割的 ...

October 27, 2022 · 1 min · 150 words · Link

在Unity编辑器不同位置添加菜单

在Unity编辑器不同位置添加菜单 有时候由于自定义工作流的需要,我们需要在编辑器中添加我们自己的菜单,用来执行不同的操作,这里介绍在编辑器的不同位置该如何添加菜单,比如在主菜单添加,Hierarchy, Project,Inspector等位置。主菜单通过下拉列表弹出,Hierarchy,Project和Inspector分别是鼠标右键弹出。 在主菜单中弹出 using UnityEngine; using UnityEditor; using System.Collections; public class ExampleClass : MonoBehaviour { // Add Example1 has priority of 100 [MenuItem("Example/Example1", priority = 1)] public static void Example1() { print("Example/Example1"); } // Example2 has a priority of 111 which is 11 more than Example1. // This will cause a divider to be created. [MenuItem("Example/Example2", priority = 11)] public static void Example2() { print("Example/Example2"); } } 效果如下图: 注意当两个菜单的 priority 差值大于10【小于等于10不会有】的时候,菜单之间会自动生成一条横线。并且 priority 越大,菜单就会在越下面 在Hierarchy中弹出 using UnityEngine; using UnityEditor; using System.Collections; public class ExampleClass : MonoBehaviour { // Add Example1 has priority of 100 [MenuItem("GameObject/Example1", priority = 1)] public static void Example1() { print("Example/Example1"); } // Example2 has a priority of 111 which is 11 more than Example1. // This will cause a divider to be created. [MenuItem("Example/Example2", priority = 12)] public static void Example2() { print("Example/Example2"); } } 效果如下图: 注意它会出现在两个位置 在主菜单的GameObject子菜单下: ...

September 22, 2022 · 2 min · 280 words · Link