diff --git a/Assets/Scenes/PeipeiFixScene.unity b/Assets/Scenes/PeipeiFixScene.unity index ddc4c979b..02fb78829 100644 --- a/Assets/Scenes/PeipeiFixScene.unity +++ b/Assets/Scenes/PeipeiFixScene.unity @@ -972,6 +972,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: sortingOrder: 0 + overlayShader: {fileID: 4800000, guid: 6652ed847ed1bc641bd702f03c650adf, type: 3} --- !u!1 &136303348 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/MiniGame/Peipei/Eye/EyeViewportOverlay.cs b/Assets/Scripts/MiniGame/Peipei/Eye/EyeViewportOverlay.cs index f1933af87..55281c470 100644 --- a/Assets/Scripts/MiniGame/Peipei/Eye/EyeViewportOverlay.cs +++ b/Assets/Scripts/MiniGame/Peipei/Eye/EyeViewportOverlay.cs @@ -23,9 +23,14 @@ namespace AibisDream /// Persistence:本遮罩=0,UI Canvas=1,Dialog Canvas=3。 [SerializeField] private int sortingOrder; + [Tooltip("Assign in Inspector so the shader is included in builds. Falls back to Shader.Find at runtime.")] + [SerializeField] private Shader overlayShader; + private Canvas overlayCanvas; private Image overlayImage; private Material instanceMaterial; + private bool overlayShaderAvailable; + private bool overlayFallbackLogged; private EyeVisualSettings activeSettings; private Coroutine autoBlinkRoutine; private Tween blinkTween; @@ -251,6 +256,7 @@ namespace AibisDream return Application.isPlaying && moduleActive && !editorPreviewActive + && overlayShaderAvailable && settings != null && settings.enableViewportOverlay; } @@ -279,6 +285,12 @@ namespace AibisDream } PrepareHierarchyIfNeeded(); + if (!overlayShaderAvailable || instanceMaterial == null) + { + DisableOverlayFallback(); + return; + } + ApplyCanvasRenderSettings(); activeSettings = settings; ApplySettings(settings); @@ -409,6 +421,16 @@ namespace AibisDream EnsureOverlayHierarchy(); hierarchyReady = overlayCanvas != null; + if (!overlayShaderAvailable || instanceMaterial == null) + { + if (moduleActive || editorPreviewActive) + { + DisableOverlayFallback(); + } + + yield break; + } + if (activeSettings != null && instanceMaterial != null) { PushViewportParams(activeSettings); @@ -447,19 +469,49 @@ namespace AibisDream overlayImage = imageGo.AddComponent(); overlayImage.raycastTarget = false; overlayImage.color = Color.black; - SetupMaterial(); + if (!TrySetupOverlayMaterial()) + { + SetOverlayActive(false); + } } ApplyCanvasRenderSettings(); } - private void SetupMaterial() + private void DisableOverlayFallback() { - Shader shader = Shader.Find("UI/EyeViewportOverlay"); + StopEffects(); + SetOverlayActive(false); + + if (overlayFallbackLogged) + { + return; + } + + overlayFallbackLogged = true; + Debug.LogWarning( + "[EyeViewportOverlay] 遮罩 shader 不可用,已跳过眼洞遮罩(视觉模块仍可正常使用,只是没有椭圆暗角/眨眼)。", + this); + } + + private bool TrySetupOverlayMaterial() + { + overlayShaderAvailable = false; + + Shader shader = overlayShader != null + ? overlayShader + : Shader.Find("UI/EyeViewportOverlay"); + if (shader == null) { Debug.LogError("[EyeViewportOverlay] 找不到 UI/EyeViewportOverlay shader。", this); - return; + return false; + } + + if (!shader.isSupported) + { + Debug.LogError("[EyeViewportOverlay] UI/EyeViewportOverlay shader 在当前平台不受支持。", this); + return false; } instanceMaterial = new Material(shader) @@ -468,6 +520,8 @@ namespace AibisDream hideFlags = HideFlags.DontSave }; overlayImage.material = instanceMaterial; + overlayShaderAvailable = true; + return true; } private void ApplyCanvasRenderSettings() @@ -478,7 +532,8 @@ namespace AibisDream } overlayCanvas.renderMode = RenderMode.ScreenSpaceCamera; - overlayCanvas.worldCamera = ResolveUICamera(); + Camera uiCamera = ResolveUICamera(); + overlayCanvas.worldCamera = uiCamera; overlayCanvas.planeDistance = OverlayPlaneDistance; overlayCanvas.sortingLayerName = OverlaySortingLayer; overlayCanvas.sortingOrder = sortingOrder; diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset index be851a423..307f43c67 100644 --- a/ProjectSettings/GraphicsSettings.asset +++ b/ProjectSettings/GraphicsSettings.asset @@ -34,6 +34,7 @@ GraphicsSettings: - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 4800000, guid: 6652ed847ed1bc641bd702f03c650adf, type: 3} m_PreloadedShaders: [] m_PreloadShadersBatchTimeLimit: -1 m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}