Files
aibis-dream/Assets/Scripts/FixSystem/Scope/ErrorWaveformVisualizer.cs
T
2024-10-14 13:30:01 +08:00

114 lines
3.3 KiB
C#

using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class ErrorWaveformVisualizer : MonoBehaviour
{
private int samples = 1024;
private float amplitude = 0.5f;
private LineRenderer lineRenderer;
private SpriteRenderer spriteRenderer;
private float spriteWidth;
private float spriteHeight;
private float[] errorWaveformData;
private WaveformVisualizer waveformVisualizer;
private int[] spikeIndices;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = samples;
lineRenderer.useWorldSpace = false;
spriteRenderer = GetComponentInParent<SpriteRenderer>();
if (spriteRenderer != null)
{
spriteWidth = spriteRenderer.bounds.size.x;
spriteHeight = spriteRenderer.bounds.size.y;
lineRenderer.sortingLayerID = spriteRenderer.sortingLayerID;
lineRenderer.sortingOrder = spriteRenderer.sortingOrder + 1;
}
else
{
Debug.LogError("Could not find SpriteRenderer in parent object.");
}
errorWaveformData = new float[samples];
// 定义突刺的位置索引(在波形的 1/4 和 3/4 位置)
spikeIndices = new int[] { samples / 4, samples * 3 / 4 };
}
public void SetWaveformVisualizer(WaveformVisualizer visualizer)
{
waveformVisualizer = visualizer;
if (waveformVisualizer.displayData.Length != samples)
{
Debug.LogError("WaveformVisualizer data length does not match samples.");
return;
}
}
void Update()
{
if (waveformVisualizer != null)
{
// 更新错误波形数据,使其与基础波形一致
for (int i = 0; i < samples; i++)
{
errorWaveformData[i] = waveformVisualizer.displayData[i];
}
DrawErrorWaveform();
}
}
void DrawErrorWaveform()
{
// 绘制波形和突刺
for (int i = 0; i < samples; i++)
{
float x = ((float)i / (samples - 1)) * spriteWidth - (spriteWidth / 2f);
float y = errorWaveformData[i];
// 检查当前索引是否为突刺位置
// if (System.Array.IndexOf(spikeIndices, i) >= 0)
// {
// // 获取波形在该点的振幅
// float baseAmplitude = waveformVisualizer.displayData[i];
// // if(baseAmplitude-amplitude/3<0)
// // {
// // y=amplitude/3;
// // }
// if(Mathf.Abs(baseAmplitude)-amplitude/2<0)
// {
// if(baseAmplitude<0)
// {
// y=-amplitude/2;
// }
// else
// {
// y=amplitude/2;
// }
// }
// }
y *= (spriteHeight / 2f);
Vector3 position = new Vector3(x, y, 0);
lineRenderer.SetPosition(i, position);
}
lineRenderer.startColor = Color.red;
lineRenderer.endColor = Color.red;
lineRenderer.startWidth = 0.05f;
lineRenderer.endWidth = 0.05f;
}
}