using UnityEngine; /// /// 鼠标悬停时物体呼吸效果的脚本 /// public class HoverBreathingEffect : MonoBehaviour { [Header("呼吸灯设置")] public Color breathColor = Color.cyan; // 呼吸灯颜色 public float breathSpeed = 1.7f; // 呼吸速度 [Range(0f, 1f)] public float minIntensity = 0.2f; // 最小亮度 [Range(0f, 1f)] public float maxIntensity = 0.8f; // 最大亮度 [Header("悬停触发设置")] public float hoverDelay = 1.5f; // 悬停触发延时(秒) private Material originalMaterial; private Material breathMaterial; private Renderer objectRenderer; private bool isHovering = false; private float hoverTimer = 0f; private bool isBreathing = false; private float breathPhase = 0f; void Start() { // 获取渲染器和原始材质 objectRenderer = GetComponent(); if (objectRenderer != null) { originalMaterial = objectRenderer.material; // 创建用于呼吸效果的新材质实例,避免影响其他物体 breathMaterial = new Material(originalMaterial); objectRenderer.material = breathMaterial; } else { Debug.LogWarning("HoverBreathingEffect 需要 Renderer 组件。", this); enabled = false; } } void OnMouseEnter() { // 鼠标进入,开始计时 isHovering = true; hoverTimer = 0f; } void OnMouseExit() { // 鼠标移出,重置所有状态 isHovering = false; hoverTimer = 0f; StopBreathing(); } void Update() { HandleHoverTimer(); if (isBreathing) { UpdateBreathingEffect(); } } /// /// 悬停时间计算 /// void HandleHoverTimer() { if (isHovering && !isBreathing) { hoverTimer += Time.deltaTime; if (hoverTimer >= hoverDelay) { // 达到延时,开始呼吸效果 StartBreathing(); } } } /// /// 开始出发呼吸灯效果 /// void StartBreathing() { isBreathing = true; breathPhase = 0f; // 可以在这里触发音效或其他事件 // Debug.Log("开始呼吸效果: " + gameObject.name); } /// /// 结束呼吸灯效果 /// void StopBreathing() { if (isBreathing) { isBreathing = false; // 恢复为原始材质颜色 if (breathMaterial != null && originalMaterial != null) { breathMaterial.color = originalMaterial.color; } } } /// /// 刷新显示颜色 /// void UpdateBreathingEffect() { // 使用正弦函数计算平滑的呼吸曲线 breathPhase += breathSpeed * Time.deltaTime; float t = (Mathf.Sin(breathPhase) + 1f) * 0.5f; // 将范围映射到 0~1 float intensity = Mathf.Lerp(minIntensity, maxIntensity, t); // 混合呼吸颜色和原始颜色 Color targetColor = Color.Lerp(originalMaterial.color, breathColor, intensity); breathMaterial.color = targetColor; // 如果也想影响自发光(如果Shader支持),可以取消注释下行 // breathMaterial.SetColor("_EmissionColor", targetColor * intensity); } }