using System.Threading; using UnityEngine; using System.Threading.Tasks; public class TurnSignalController : MonoBehaviour { public GameObject leftTurnSignal; public GameObject rightTurnSignal; public GameObject rightTurnSignalGame; public GameObject leftTurnSignalGame; private Task currentBlinkTask = null; private CancellationTokenSource cancellationTokenSource; private int currentSignalType = 0; // 当前的信号类型 public GameObject HighBeamLight; public GameObject LowBeamLight; public void SetSignal(int signalType) { // 如果当前信号类型与请求的信号类型相同,则不执行任何操作 if (currentSignalType == signalType) { return; } currentSignalType = signalType; // 更新当前信号类型 // 取消当前的动画任务(如果存在) if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); // HighBeamLight.SetActive(false); // LowBeamLight.SetActive(false); } cancellationTokenSource = new CancellationTokenSource(); switch (signalType) { case 1: // 左转向灯 currentBlinkTask = BlinkSignalAsync(leftTurnSignal, leftTurnSignalGame,cancellationTokenSource.Token); rightTurnSignal.SetActive(false); break; case 2: // 右转向灯 currentBlinkTask = BlinkSignalAsync(rightTurnSignal, rightTurnSignalGame,cancellationTokenSource.Token); leftTurnSignal.SetActive(false); break; case 3: // 双闪灯 currentBlinkTask = BlinkBothSignalsAsync(cancellationTokenSource.Token); break; // case 4://远光灯 // HighBeamLight.SetActive(true); // break; // case 5://近光灯 // LowBeamLight.SetActive(true); // break; // case 0: // 全部停止 // StopAllSignals(); // break; } } public void OpenLight() { HighBeamLight.SetActive(true); } public void CloseLight() { HighBeamLight.SetActive(false); } private async Task BlinkSignalAsync(GameObject signal, GameObject sinGame,CancellationToken ct) { bool isOn = false; try { while (!ct.IsCancellationRequested) { isOn = !isOn; signal.SetActive(isOn); sinGame.SetActive(isOn); await Task.Delay(500, ct); // 等待500毫秒 } } catch (TaskCanceledException) { // 任务被取消时执行 } signal.SetActive(false); // 确保灯光关闭 sinGame.SetActive(false); } private async Task BlinkBothSignalsAsync(CancellationToken ct) { bool isOn = false; try { while (!ct.IsCancellationRequested) { isOn = !isOn; leftTurnSignal.SetActive(isOn); rightTurnSignal.SetActive(isOn); rightTurnSignalGame.SetActive(isOn); leftTurnSignalGame.SetActive(isOn); await Task.Delay(500, ct); // 等待500毫秒 } } catch (TaskCanceledException) { // 任务被取消时执行 } leftTurnSignal.SetActive(false); rightTurnSignal.SetActive(false); } private void StopAllSignals() { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); } leftTurnSignal.SetActive(false); rightTurnSignal.SetActive(false); } }