You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:36:01