fix(eye): 遮罩 shader 失败时跳过全屏黑屏
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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:本遮罩=0,UI Canvas=1,Dialog 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;
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user