using AibisDream.Utility; using TMPro; using UnityEngine; using Random = UnityEngine.Random; namespace AibisDream.FixSystem { public class OscilloscopeSystem : MonoBehaviour { #region 组件索引 private BodyModuleSystem _bodyModuleSystem; private TMP_Text _screenText; private WaveformLine _waveformLine; private ScanLine _scanLine; private SpriteRenderer _screen; private WaveSlider _waveSlider; private SpriteButton _deepinButton; #endregion #region 状态 public bool isScanning; public bool isPlaying; public bool canScan; #endregion private void Awake() { FixSystemCenter.SystemDic.Register(this); InitComponentRefs(); } private void InitComponentRefs() { _bodyModuleSystem = GetComponentInParent(); _screenText = transform.Find("Screen Text").GetComponent(); _waveformLine = transform.Find("Waveform Visualizer").GetComponent(); _scanLine = transform.Find("Scan Line").GetComponent(); _screen = transform.Find("Screen").GetComponent(); _waveSlider = transform.Find("Wave Slider").GetComponent(); _deepinButton = new SpriteButton(transform.Find("Deepin Button").gameObject, false); _waveformLine.SetLineSize(_screen.bounds.size.x, _screen.bounds.size.y); _scanLine.SetScreenSize(_screen.bounds.size.x, _screen.bounds.size.y); _screenText.text = ""; _deepinButton.OnButtonDown += StartScan; _scanLine.ScanErrorEvent += OnScanSuccess; } private void Update() { _deepinButton.CheckButtonClick(); } #region 对外开放 /// /// 屏幕上播放波形 /// /// 波形类型 /// 是否有错误 public void PlayWave(WaveformType waveformType, bool hasError) { _waveSlider.InitSlider(); isPlaying = true; canScan = hasError; _deepinButton.SetActive(canScan); var initialRandomPhase = Mathf.PI * Random.Range(7, 13) * 0.1f; _waveformLine.PlayWave(waveformType, initialRandomPhase, hasError); } /// /// 停止播放波形 /// public void StopWave() { isPlaying = false; canScan = false; isScanning = false; _deepinButton.SetActive(false); _waveSlider.InitSlider(); _waveformLine.StopWave(); _scanLine.CloseScan(); } /// /// 调整相位 /// public void AdjustPhaseShift(float phaseShift) { if (isPlaying) { _waveformLine.AdjustPhaseShift(phaseShift); } } /// /// 开始扫描 /// public void StartScan() { if (!canScan) return; float spikeX = _waveformLine.GetSpikeX(); StartCoroutine(_scanLine.ScanForError(spikeX)); } /// /// 扫描成功后 /// public void OnScanSuccess() { _bodyModuleSystem.HandleDeepIn(); _ = CommonUtil.Delay(2000, StopWave); } /// /// 显示消息 /// /// 消息 public void ShowScreenMessage(string message, Color textcolor) { _screenText.text = message; _screenText.color=textcolor; } /// /// 清除消息 /// public void ClearScreenMessage() { _screenText.text = ""; _screenText.color=Color.white; } #endregion } public enum WaveformType { Default, Sine, Square, Triangle, Sawtooth, HotNoise, Composite, Pulse } }