Unity Prebuild阶段设置SplashScreen Logo不生效如何解决?
Unity构建预处理阶段设置SplashScreen.logos不生效问题解决方案
问题原因
- Unity构建管线中,启动屏关联资源的收集步骤执行时机,早于
IPreprocessBuildWithReport.OnPreprocessBuild和RegisterBuildPlayerHandler回调的触发时机。BackgroundColor这类纯值类型配置不需要绑定额外资源,后续修改仍能同步到最终构建配置;但logos字段依赖Sprite资源引用,必须在资源收集阶段就将对应纹理纳入启动屏专用构建资源列表,回调阶段修改时资源收集已经完成,新增的Sprite不会被打包到启动屏资源中,因此配置不生效。 - 若动态生成的Sprite为临时内存对象,没有作为项目内资源完成完整的导入、序列化流程,即便修改时机正确,构建管线也无法定位到对应纹理资源,同样会导致配置失效。
可行解决方案
方案1:自定义构建入口提前修改配置
如果使用自定义按钮触发构建,将修改SplashScreen配置的逻辑放到调用构建接口之前执行,此时资源收集还未启动,配置可正常生效。示例代码:
public static void CustomBuildProject() { // 1. 动态生成Splash纹理,保存到Assets目录并完成导入 string pngSavePath = "Assets/Editor/GeneratedSplash.png"; File.WriteAllBytes(pngSavePath, generatedPngBytes); AssetDatabase.ImportAsset(pngSavePath); TextureImporter importer = AssetImporter.GetAtPath(pngSavePath) as TextureImporter; importer.textureType = TextureImporterType.Sprite; importer.SaveAndReimport(); Sprite splashScreenSprite = AssetDatabase.LoadAssetAtPath<Sprite>(pngSavePath); // 2. 提前修改SplashScreen配置 PlayerSettings.SplashScreen.logos = new[] { PlayerSettings.SplashScreenLogo.Create(3f, splashScreenSprite) }; AssetDatabase.SaveAssets(); // 3. 触发构建 BuildPlayerOptions buildOptions = new BuildPlayerOptions { scenes = EditorBuildSettings.scenes.Select(s => s.path).ToArray(), locationPathName = "Build/Test.apk", target = BuildTarget.Android, options = BuildOptions.None }; BuildPipeline.BuildPlayer(buildOptions); }
方案2:监听构建目标变化提前同步配置
如果使用Unity默认的构建入口(即通过File > Build Settings触发构建),可以通过InitializeOnLoad监听构建目标变更事件,提前完成SplashScreen配置更新,确保构建启动时资源收集阶段能读到最新的logo配置。示例代码:
[InitializeOnLoad] public static class SplashScreenAutoConfig { static SplashScreenAutoConfig() { EditorApplication.activeBuildTargetChanged += OnBuildTargetChanged; // 编辑器启动时先更新一次配置 UpdateSplashLogoConfig(); } private static void OnBuildTargetChanged(BuildTarget oldTarget, BuildTarget newTarget) { UpdateSplashLogoConfig(); } private static void UpdateSplashLogoConfig() { // 此处复用方案1中的动态生成、导入Sprite的逻辑 Sprite splashScreenSprite = GetGeneratedSplashSprite(); PlayerSettings.SplashScreen.logos = new[] { PlayerSettings.SplashScreenLogo.Create(3f, splashScreenSprite) }; AssetDatabase.SaveAssets(); } }
方案3:替换为自定义启动场景
如果不想适配Unity内置启动屏的时机限制,可以完全放弃内置SplashScreen的logos配置,新增一个空的启动场景作为构建列表的第一个场景,将动态生成的Splash纹理放到启动场景的UI组件上展示,展示完成后再跳转到主业务场景。该方案兼容性更高,不需要处理构建管线的时机问题。
内容的提问来源于stack exchange,提问作者user3211306
相关产品推荐
相关产品推荐

