using UnityEngine;
///
/// 物体高亮效果:鼠标悬停时切换 Emission 或轮廓材质。
/// 挂在可交互的 3D 物体上。
///
public class HighlightEffect : MonoBehaviour
{
[Header("高亮设置")]
[SerializeField] private Color _highlightColor = Color.yellow;
[SerializeField] private float _highlightIntensity = 0.5f;
[Header("可选 - 使用 Outline 组件")]
[SerializeField] private bool _useOutline = true;
[SerializeField] private float _outlineWidth = 0.02f;
private Renderer[] _renderers;
private Material[] _originalMaterials;
private Material[] _highlightMaterials;
private bool _isHighlighted;
[Header("考核高亮 - 始终显示")]
public bool AlwaysHighlighted;
private void Start()
{
_renderers = GetComponentsInChildren();
}
private void OnMouseEnter()
{
if (_isHighlighted) return;
SetHighlight(true);
}
private void OnMouseExit()
{
if (AlwaysHighlighted) return;
SetHighlight(false);
}
public void SetHighlight(bool on)
{
_isHighlighted = on;
if (_renderers == null) return;
foreach (var r in _renderers)
{
if (r == null) continue;
foreach (var mat in r.materials)
{
if (on)
{
mat.EnableKeyword("_EMISSION");
mat.SetColor("_EmissionColor", _highlightColor * _highlightIntensity);
}
else
{
mat.DisableKeyword("_EMISSION");
}
}
}
}
/// 闪烁效果,用于提示用户点击
public void Flash(float duration = 0.5f)
{
StopAllCoroutines();
StartCoroutine(FlashRoutine(duration));
}
private System.Collections.IEnumerator FlashRoutine(float duration)
{
float half = duration / 2f;
SetHighlight(true);
yield return new WaitForSeconds(half);
SetHighlight(false);
yield return new WaitForSeconds(half);
SetHighlight(true);
yield return new WaitForSeconds(half);
SetHighlight(false);
}
}