using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Scripting; [Preserve] public class SkipUnityLogo { [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSplashScreen)] private static void CancelSplashScreen() { #if UNITY_IOS // iOS 16+ 上 Task.Run 在 BeforeSplashScreen 阶段可能无法及时调度, // 改用同步调用,确保 SplashScreen 被可靠停止。 try { SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate); } catch (System.Exception) { // 如果 SplashScreen 已经不存在或已被禁用,忽略异常 } #else // Android 等平台:同步调用 SplashScreen.Stop 在 BeforeSplashScreen 阶段 // 会导致主线程死锁(Player Loop 尚未完全初始化),必须通过 Task.Run 异步执行。 System.Threading.Tasks.Task.Run(() => SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate)); #endif } #if !UNITY_IOS // Android 等平台上,BeforeSplashScreen 阶段的 Task.Run 可能因时序竞争 // 而被引擎忽略,SubsystemRegistration 阶段引擎子系统已就绪,作为保底调用确保 Stop 生效。 [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] private static void CancelSplashScreenFallback() { try { SplashScreen.Stop(SplashScreen.StopBehavior.StopImmediate); } catch (System.Exception) { // 如果 SplashScreen 已在上面的回调中停止,这里的 Stop 会抛异常,忽略即可 } } #endif }