169 lines
4.9 KiB
C#
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);
|
|
}
|
|
}
|