88 lines
2.7 KiB
C#
88 lines
2.7 KiB
C#
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using RainbowArt.CleanFlatUI;
|
|
|
|
public class OscilloscopeController : MonoBehaviour
|
|
{
|
|
public List<Transform> 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<TargetPointData>();
|
|
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));
|
|
}
|
|
}
|
|
} |