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}