fix(eye): 遮罩 shader 失败时跳过全屏黑屏

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-02 17:36:39 +08:00
co-authored by Cursor
parent b26f7d0222
commit 0832e4cac1
3 changed files with 62 additions and 5 deletions
+1
View File
@@ -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
@@ -23,9 +23,14 @@ namespace AibisDream
/// <summary>Persistence:本遮罩=0UI Canvas=1Dialog Canvas=3。</summary>
[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<Image>();
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;
+1
View File
@@ -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}