using System.Threading; using UnityEngine; using System.Threading.Tasks; public enum TurnSignalState { 左转向, 右转向, 双闪, 空 } 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 GameObject leftTurnSignal2; public GameObject rightTurnSignal2; public TurnSignalState turnSignalState; public void SetSignal(int signalType) { // 如果当前信号类型与请求的信号类型相同,则不执行任何操作 if (currentSignalType == signalType) { return; } currentSignalType = signalType; // 更新当前信号类型 // 取消当前的动画任务(如果存在) if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); // HighBeamLight.SetActive(false); // LowBeamLight.SetActive(false); // rightTurnSignalGame.SetActive(false); // leftTurnSignalGame.SetActive(false); } turnSignalState = TurnSignalState.空; cancellationTokenSource = new CancellationTokenSource(); switch (signalType) { case 1: // 左转向灯 turnSignalState = TurnSignalState.左转向; currentBlinkTask = BlinkSignalAsync(leftTurnSignal, leftTurnSignal2,leftTurnSignalGame,cancellationTokenSource.Token); rightTurnSignal.SetActive(false); break; case 2: // 右转向灯 turnSignalState = TurnSignalState.右转向; currentBlinkTask = BlinkSignalAsync(rightTurnSignal, rightTurnSignal2,rightTurnSignalGame,cancellationTokenSource.Token); leftTurnSignal.SetActive(false); break; case 3: // 双闪灯 turnSignalState = TurnSignalState.双闪; 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 signal2, GameObject sinGame,CancellationToken ct) { bool isOn = false; try { while (!ct.IsCancellationRequested) { isOn = !isOn; signal.SetActive(isOn); signal2.SetActive(isOn); sinGame.SetActive(isOn); await Task.Delay(500, ct); // 等待500毫秒 } } catch (TaskCanceledException) { // 任务被取消时执行 } signal.SetActive(false); // 确保灯光关闭 signal2.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); leftTurnSignal2.SetActive(isOn); rightTurnSignal2.SetActive(isOn); rightTurnSignalGame.SetActive(isOn); leftTurnSignalGame.SetActive(isOn); rightTurnSignalGame.SetActive(isOn); leftTurnSignalGame.SetActive(isOn); await Task.Delay(500, ct); // 等待500毫秒 } } catch (TaskCanceledException) { // 任务被取消时执行 } leftTurnSignal.SetActive(false); rightTurnSignal.SetActive(false); leftTurnSignal2.SetActive(false); rightTurnSignal2.SetActive(false); } public void StopAllSignals() { if (cancellationTokenSource != null) { cancellationTokenSource.Cancel(); cancellationTokenSource.Dispose(); } leftTurnSignal.SetActive(false); rightTurnSignal.SetActive(false); leftTurnSignal2.SetActive(false); rightTurnSignal2.SetActive(false); } }