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.positionCount = samples; lineRenderer.useWorldSpace = false; spriteRenderer = GetComponentInParent(); 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; } }