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); } }