using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public enum LightDir { up, down, left, right } /// /// 红绿灯UI /// 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 void Init(bool isGreen, TraficTimeSet set, Vector3 target, LightDir dir,TraficLightUI elseDirLight=null, TraficLightUI paternerLight=null) { image = GetComponent(); 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(); } /// /// 红绿灯切换 /// private void LightChange() { if (_isGreen) { 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) { if (_paternerLight != null && _elseDirLight == null) { this._isGreen = _paternerLight._isGreen; this.image.sprite = _paternerLight.image.sprite; } } } /// /// 屏幕坐标跟随3D空间 /// private void ZoneUI() { if (_target != null) { Vector3 screenPos = Camera.main.WorldToScreenPoint(_target); this.transform.position = screenPos; } } }