using UnityEngine; using System.Collections.Generic; using RainbowArt.CleanFlatUI; public class OscilloscopeController : MonoBehaviour { public List targetPoints; // 目标点列表 public float maxDistance = 1f; // 最大检测距离 public WaveformVisualizer waveformVisualizer; //public WaveformVisualizer errorWaveformVisualizer; // 错误波形 public SliderCircular phaseSlider; // 控制相位偏移的旋钮 private float phaseShiftMax = Mathf.PI * 3f; // 最大相位偏移量 private Transform closestTarget; // 最近的目标点 private float clarity; // 清晰度(根据距离计算) private bool isCaptured = false; // 是否已拍照(冻结波形) void Update() { if (!isCaptured) { DetectClosestTarget(); if (closestTarget != null) { var targetData = closestTarget.GetComponent(); if (targetData != null) { waveformVisualizer.clarity = clarity; waveformVisualizer.waveformType = targetData.waveformType; // 处理相位偏移 float phaseShift = 0f; if (phaseSlider != null) { float sliderPhase = (phaseSlider.Value / 10f) * phaseShiftMax; phaseShift = sliderPhase + targetData.initialRandomPhase; // 加上随机初始相位 } if (phaseShift > 1) { waveformVisualizer.SetPhaseShift(phaseShift); } else { waveformVisualizer.SetPhaseShift(0); } } } else { ResetVisualizer(); } } } void ResetVisualizer() { waveformVisualizer.clarity = 0f; waveformVisualizer.waveformType = WaveformType.Noise; waveformVisualizer.ResetWaveform(); } void DetectClosestTarget() { float minDistance = float.MaxValue; closestTarget = null; clarity = 0f; foreach (var target in targetPoints) { float distance = Vector2.Distance(transform.position, target.position); if (distance <= maxDistance && distance < minDistance) { minDistance = distance; closestTarget = target; } } if (closestTarget != null) { clarity = Mathf.Clamp01(1f - (minDistance / maxDistance)); } } }