You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.6 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public enum LightDir
{
up,
down,
left,
right
}
/// <summary>
/// 红绿灯UI
/// </summary>
public class TraficLightUI : MonoBehaviour
{
public Sprite red, yellow, green;
public Vector3 _target;
[SerializeField]
private float redTime, yellowTime, greenTime;
private bool _isRed, _isGreen, _isYellow = false;
private Image image;
[SerializeField]
private float timer = 0f;
private TraficLightUI _elseDirLight;
private TraficLightUI _paternerLight;
private float scale = 0.4f;
public Collider collider;
public void Init(bool isGreen, TraficTimeSet set, Vector3 target, LightDir dir,TraficLightUI elseDirLight=null, TraficLightUI paternerLight=null)
{
image = GetComponent<Image>();
transform.SetParent(TraficLightManager.Instance.GetLightUIParent());
redTime = set.redTime;
yellowTime = set.yellowTime;
greenTime = set.greenTime;
if (isGreen)
{
_isGreen = true;
image.sprite = green;
}
else
{
_isRed = true;
image.sprite = red;
}
_target = target;
//UI方向调整
switch (dir)
{
case LightDir.up:
transform.eulerAngles = new Vector3(0, 0, 90);
break;
case LightDir.down:
transform.eulerAngles = new Vector3(0, 0, -90);
break;
case LightDir.left:
transform.eulerAngles = new Vector3(0, 0, 0);
break;
case LightDir.right:
transform.eulerAngles = new Vector3(0, 0, 180);
break;
}
if (elseDirLight!=null)
{ _elseDirLight = elseDirLight; }
transform.localScale = Vector3.one * scale;
}
private void Update()
{
LightChange();
ZoneUI();
}
/// <summary>
/// 红绿灯切换
/// </summary>
private void LightChange()
{
if (_isGreen)
{
collider.enabled = false;
timer += Time.deltaTime* TraficLightManager.Instance.traficLightTimeScale;
if (timer >= greenTime)
{
_isYellow = true;
image.sprite = yellow;
_isGreen = false;
timer = 0f;
}
}
else if (_isYellow)
{
timer += Time.deltaTime* TraficLightManager.Instance.traficLightTimeScale;
if (timer >= yellowTime)
{
_isRed = true;
image.sprite = red;
_isYellow = false;
timer = 0f;
//让另一方向的灯绿
if (_elseDirLight != null)
{
_elseDirLight._isGreen = true;
_elseDirLight.image.sprite = _elseDirLight.green;
}
}
}else if (_isRed)
{
collider.enabled = true;
if (_paternerLight != null && _elseDirLight == null)
{
this._isGreen = _paternerLight._isGreen;
this.image.sprite = _paternerLight.image.sprite;
}
}
}
/// <summary>
/// 屏幕坐标跟随3D空间
/// </summary>
private void ZoneUI()
{
if (_target != null)
{
Vector3 screenPos = Camera.main.WorldToScreenPoint(_target);
this.transform.position = screenPos;
}
}
}