H_SafeExperienceDrivingSystem/U3D_DrivingSystem/Assets/Script/TurnSignalController.cs

169 lines
4.9 KiB
C#

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);
}
}