using System; using System.Collections; using UnityEngine; namespace AibisDream.FixSystem { public class ScanLine : MonoBehaviour { #region 组件索引 private LineRenderer _line; private OscilloscopeSystem _oscilloscopeSystem; #endregion #region 部分参数(后面改成从screen获取) private float _screenLeftX; private float _screenRightX; private float _topY; private float _bottomY; private const float ScanSpeed = 2f; public event Action ScanErrorEvent; #endregion private void Awake() { InitComponentRefs(); } private void InitComponentRefs() { _oscilloscopeSystem = GetComponentInParent(); _line = GetComponent(); _line.enabled = false; _line.positionCount = 2; } public IEnumerator ScanForError(float spikeX) { _line.enabled = true; _oscilloscopeSystem.isScanning = true; // 初始化扫描线 InitStartLine(); // 扫描线右移 var currentX = _screenLeftX; var lastX = currentX; while (currentX <= _screenRightX) { // 横坐标右移 currentX += Time.deltaTime * ScanSpeed; SetLinePos(currentX); // 检查是否扫到尖峰 if (CheckSpikeInRange(lastX, currentX, spikeX)) { // 修改线条 MarkLineAsError(spikeX); // 触发扫描事件 yield return new WaitForSeconds(1f); ScanErrorEvent?.Invoke(); break; } lastX = currentX; yield return null; } _oscilloscopeSystem.isScanning = false; } private void InitStartLine() { // 初始状态是一根靠左的竖线 SetLinePos(_screenLeftX); _line.enabled = true; _line.startColor = Color.white; _line.endColor = Color.white; } private void SetLinePos(float posX) { var topPosition = new Vector3(posX, _topY, 0); var bottomPosition = new Vector3(posX, _bottomY, 0); _line.SetPosition(0, topPosition); _line.SetPosition(1, bottomPosition); } private bool CheckSpikeInRange(float x1, float x2, float spikeX) { var left = Mathf.Min(x1, x2); var right = Mathf.Max(x1, x2); return spikeX >= left && spikeX <= right; } private void MarkLineAsError(float spikeX) { SetLinePos(spikeX); _line.startColor = Color.red; _line.endColor = Color.red; } public void CloseScan() { _line.enabled = false; } public void SetScreenSize(float width, float height) { _screenLeftX = - width / 2; _screenRightX = width / 2; _topY = height / 2; _bottomY = - height / 2; } } }