H_SafeExperienceDrivingSystem/U3D_DrivingSystem/Assets/Script/TurnSignalController.cs

107 lines
3.0 KiB
C#

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