feat(peipei): 错色 Error overlay 淡入淡出驱动

自动绑定 sibling Error Sprite,并在 WrongColor 状态切换时同步 overlay alpha。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-30 16:14:10 +08:00
co-authored by Cursor
parent 04b441d977
commit 29a1c7d7cb
@@ -1,3 +1,4 @@
using System;
using AibisDream;
using AibisDream.Kit;
using AibisDream.Utility;
@@ -6,17 +7,23 @@ using UnityEngine;
public class EyeTarget : MonoBehaviour
{
private static readonly int AlphaId = Shader.PropertyToID("_Alpha");
public Transform targetTransform;
[Header("Optional overlay sprite for UF imagination")]
[SerializeField] private SpriteRenderer imageSpriteRender;
[Header("Wrong-color overlay (e.g. plantError); auto-resolved from sibling if unset")]
[SerializeField] private SpriteRenderer wrongColorSpriteRenderer;
[SerializeField] private Shader unifiedSpriteShader;
[SerializeField] private EyeTargetVisual unifiedVisual;
public Color _color;
private EyeVisualSettings visualSettings = new();
private Material wrongColorMaterial;
private void Awake()
{
@@ -27,6 +34,7 @@ public class EyeTarget : MonoBehaviour
return;
}
EnsureWrongColorOverlay();
EnsureUnifiedVisual(spriteRenderer);
DisableLegacyChildRenderers();
DisableLegacySiblingRenderers();
@@ -53,6 +61,7 @@ public class EyeTarget : MonoBehaviour
public void KillVisualTweens()
{
unifiedVisual?.KillActiveTweens();
wrongColorMaterial?.DOKill();
}
private void EnsureVisualReady()
@@ -115,11 +124,13 @@ public class EyeTarget : MonoBehaviour
public void SetToNoWrongColor()
{
unifiedVisual?.SetWrongColor(0f);
SetWrongColorOverlayAlpha(0f);
}
public void SetToWrongColor()
{
unifiedVisual?.SetWrongColor(1f);
SetWrongColorOverlayAlpha(1f);
}
public void FadeOut(float duration)
@@ -139,11 +150,13 @@ public class EyeTarget : MonoBehaviour
public void WrongColorIn(float duration)
{
unifiedVisual?.TweenWrongColor(1f, duration)?.SetEase(Ease.InOutSine);
TweenWrongColorOverlay(1f, duration);
}
public void WrongColorOut(float duration)
{
unifiedVisual?.TweenWrongColor(0f, duration)?.SetEase(Ease.InOutSine);
TweenWrongColorOverlay(0f, duration);
}
public void BlurIn(float duration)
@@ -291,6 +304,90 @@ public class EyeTarget : MonoBehaviour
/// <summary>
/// 禁用同组下旧版 overlay(如 posterNoColor / computernocolor),避免盖住 unified 效果。
/// </summary>
private void EnsureWrongColorOverlay()
{
if (wrongColorSpriteRenderer == null && transform.parent != null)
{
string errorName = $"{gameObject.name}Error";
foreach (var renderer in transform.parent.GetComponentsInChildren<SpriteRenderer>(true))
{
if (string.Equals(renderer.gameObject.name, errorName, StringComparison.OrdinalIgnoreCase))
{
wrongColorSpriteRenderer = renderer;
break;
}
}
}
if (wrongColorSpriteRenderer == null)
{
return;
}
wrongColorMaterial = Application.isPlaying
? wrongColorSpriteRenderer.material
: wrongColorSpriteRenderer.sharedMaterial;
wrongColorSpriteRenderer.enabled = true;
SetWrongColorOverlayAlpha(0f);
}
private void SetWrongColorOverlayAlpha(float alpha)
{
if (wrongColorSpriteRenderer == null)
{
return;
}
alpha = Mathf.Clamp01(alpha);
if (alpha > 0f)
{
wrongColorSpriteRenderer.gameObject.SetActive(true);
wrongColorSpriteRenderer.enabled = true;
}
if (wrongColorMaterial != null && wrongColorMaterial.HasProperty(AlphaId))
{
wrongColorMaterial.SetFloat(AlphaId, alpha);
}
if (alpha <= 0f)
{
wrongColorSpriteRenderer.gameObject.SetActive(false);
}
}
private void TweenWrongColorOverlay(float alpha, float duration)
{
if (wrongColorSpriteRenderer == null || wrongColorMaterial == null || !wrongColorMaterial.HasProperty(AlphaId))
{
return;
}
if (alpha > 0f)
{
wrongColorSpriteRenderer.gameObject.SetActive(true);
wrongColorSpriteRenderer.enabled = true;
}
wrongColorMaterial.DOKill();
wrongColorMaterial
.DOFloat(alpha, AlphaId, duration)
.SetEase(Ease.InOutSine)
.OnComplete(() =>
{
if (alpha <= 0f && wrongColorSpriteRenderer != null)
{
wrongColorSpriteRenderer.gameObject.SetActive(false);
}
});
}
private static bool IsWrongColorOverlayRenderer(SpriteRenderer renderer)
{
return renderer != null
&& renderer.gameObject.name.EndsWith("Error", StringComparison.OrdinalIgnoreCase);
}
private void DisableLegacySiblingRenderers()
{
Transform groupRoot = transform.parent;
@@ -316,6 +413,11 @@ public class EyeTarget : MonoBehaviour
continue;
}
if (IsWrongColorOverlayRenderer(renderer))
{
continue;
}
renderer.enabled = false;
}
}