Unity 启动 Logo 去除|SkipSplash 未生效问题(PC 版本)

摘要
Unity 在 PC 平台启动时默认会显示 Unity Logo 启动画面。
通常通过添加 SkipSplash.cs 脚本可以跳过该启动 Logo。
但有时发现脚本未生效——本文将介绍该问题的原因与解决方案,包括 启动顺序冲突RuntimeInitializeOnLoads.json 手动修复 方法。


一、基础实现:SkipSplash.cs 脚本

在大多数情况下,只需要在项目中添加以下脚本,并确保其位于非 Editor 文件夹中(如 Assets/Scripts),即可跳过启动 Logo。

#if !UNITY_EDITOR
using UnityEngine;
using UnityEngine.Rendering;

public class SkipSplash
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)]
    private static void BeforeSplashScreen()
    {
#if UNITY_WEBGL
        Application.focusChanged += Application_focusChanged;
#else
        System.Threading.Tasks.Task.Run(AsyncSkip);
#endif
    }

#if UNITY_WEBGL
    private static void Application_focusChanged(bool obj)
    {
        Application.focusChanged -= Application_focusChanged;
        SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate);
    }
#else
    private static void AsyncSkip()
    {
        SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate);
    }
#endif
}
#endif

 二、问题:添加脚本后仍未生效

有时即使添加了上述脚本,Unity 启动 Logo 仍会显示。

原因分析

该问题通常是由于:

多个带有 RuntimeInitializeOnLoadMethod 的方法在启动时冲突
导致 SkipSplash.BeforeSplashScreen() 没有被优先执行。

三、解决方案一:调整启动顺序并重新打包

可通过修改其他脚本的 [RuntimeInitializeOnLoadMethod] 执行时机来避免冲突。

枚举值 调用时机 常见用途
BeforeSplashScreen 最早执行(在 Unity Logo 之前) 初始化框架或日志系统
SubsystemRegistration 注册子系统时 注册自定义系统(底层逻辑)
BeforeSceneLoad 场景加载前 初始化配置、单例管理等
AfterSceneLoad 场景加载后 依赖场景内容的初始化
AfterAssembliesLoaded 所有程序集加载后 类型缓存、反射系统初始化

建议
SkipSplash 保持 BeforeSplashScreen
将冲突脚本(通常来自第三方插件)改为 BeforeSceneLoad 或更后。

修改后重新 Build Player 即可。


四、解决方案二:修改 RuntimeInitializeOnLoads.json

如果不方便改源码或重新打包,也可以直接修改 Unity 打包生成的配置文件。

文件位置

打包后在以下目录找到:

<BuildFolder>/YourApp_Data/RuntimeInitializeOnLoads.json

示例内容如下:

{"root":[
    {"assemblyName":"Assembly-CSharp","nameSpace":"","className":"SkipSplash","methodName":"BeforeSplashScreen","loadTypes":3,"isUnityClass":false},
    {"assemblyName":"Unity.RenderPipelines.Core.Runtime","nameSpace":"UnityEngine.Rendering","className":"DebugUpdater","methodName":"RuntimeInit","loadTypes":0,"isUnityClass":true},
    {"assemblyName":"Unity.VisualScripting.Core","nameSpace":"Unity.VisualScripting","className":"RuntimeVSUsageUtility","methodName":"RuntimeInitializeOnLoadBeforeSceneLoad","loadTypes":1,"isUnityClass":true},
    {"assemblyName":"Coffee.UIEffect","nameSpace":"Coffee.UIEffectInternal","className":"UIExtraCallbacks","methodName":"InitializeOnLoad","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"Coffee.UIEffect","nameSpace":"Coffee.UIEffects","className":"ImageProxy","methodName":"InitializeOnLoad","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"Coffee.UIEffect","nameSpace":"Coffee.UIEffects","className":"TmpProxy","methodName":"InitializeOnLoad","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"UniTask","nameSpace":"Cysharp.Threading.Tasks","className":"PlayerLoopHelper","methodName":"Init","loadTypes":2,"isUnityClass":false},
    {"assemblyName":"Vuplex","nameSpace":"Vuplex.WebView","className":"StandaloneWebView","methodName":"_initializePlugin","loadTypes":3,"isUnityClass":false},
    {"assemblyName":"Vuplex","nameSpace":"Vuplex.WebView.Internal","className":"BaseWebView","methodName":"_staticInit","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"Vuplex","nameSpace":"Vuplex.WebView.Internal","className":"ThreadDispatcher","methodName":"_initialize","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"Vuplex","nameSpace":"Vuplex.WebView.Internal","className":"WebPluginFactory","methodName":"_beforeSceneLoad","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"Vuplex","nameSpace":"Vuplex.WebView.Internal","className":"MacWebPluginRegistrant","methodName":"_registerPlugin","loadTypes":1,"isUnityClass":false},
    {"assemblyName":"Vuplex","nameSpace":"Vuplex.WebView.Internal","className":"WindowsWebPluginRegistrant","methodName":"_registerPlugin","loadTypes":1,"isUnityClass":false}]}

冲突点

可以看到:

{"className":"SkipSplash","methodName":"BeforeSplashScreen","loadTypes":3}
{"className":"StandaloneWebView","methodName":"_initializePlugin","loadTypes":3}

loadTypes 都为 3 (BeforeSplashScreen),说明它们执行顺序冲突。


解决办法

  1. 将冲突的插件(如 Vuplex.WebView.StandaloneWebView)的
    loadTypes 值修改为 其他非 3 值(如 1 或 2)。

  2. 保存文件

  3. 再次启动 Unity,即可看到启动 Logo 被成功跳过


五、总结

问题现象 原因 解决方式
添加 SkipSplash.cs 无效 启动方法顺序冲突 修改启动顺序或调整 JSON
仍显示 Logo 其他插件抢先执行 BeforeSplashScreen 改为 BeforeSceneLoad 或更后
不想重新打包 手动改 RuntimeInitializeOnLoads.json 修改 loadTypes

实践建议

  • 优先方法:修改脚本启动顺序(代码层面最干净)

  • 调试时机:使用 Debug.Log("BeforeSplash") 验证执行顺序

  • 谨慎操作:直接编辑 RuntimeInitializeOnLoads.json 时务必备份


参考资料与扩展阅读


SEO 标签(关键词)

Unity 启动画面、SkipSplash 无效、Unity SplashScreen 去除、
RuntimeInitializeOnLoadMethod 执行顺序、Unity PC 启动优化、
RuntimeInitializeOnLoads.json、Unity 启动 Logo 跳过、Unity BeforeSplashScreen 冲突

!仅记录方法,内容格式由Ai整理优化,可能存在错误

Logo

这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!

更多推荐