using System; using System.Collections.Generic; using System.Text; using UnityEngine; //选择效果脚本,不能编辑到UI里边,只能动态添加 public class UISpriteSelectEffect: MonoBehaviour { private class SpriteMover { private UISprite _handleSpr = null; private Vector3 _startPos = Vector3.zero; private Vector3 _endPos = Vector3.zero; private Vector3 _endPosOrgin = Vector3.zero; private float _timer = 0f; private float _maxTime = 0f; private float _changeLerpValue = 0f; private bool _moving = false; private bool _isEnd = false; public bool Moving { get { return _moving; } } public bool IsEnd { get { return _isEnd; } } public Color Color { set { if (_handleSpr != null) { _handleSpr.color = value; } } } public SpriteMover(UISprite spr, Vector3 st, Vector3 ed, float speed) { _handleSpr = spr; _startPos = st; _endPosOrgin = ed; var nor = (ed - st).normalized; var length = Vector3.Distance(st, ed); var movelength = length + spr.width; _endPos = _startPos + nor * movelength; _maxTime = movelength / speed; _changeLerpValue = length / movelength; _moving = false; _handleSpr.fillAmount = 0f; } public void StartMove() { _handleSpr.transform.localPosition = _startPos; _handleSpr.fillAmount = 0f; _handleSpr.invert = false; _timer = 0f; _moving = true; } public void Update() { if (!_moving) return; _timer += Time.deltaTime; float lerp = _timer / _maxTime; var noncePos = Vector3.Lerp(_startPos, _endPos, lerp); _handleSpr.transform.localPosition = noncePos; if (lerp < _changeLerpValue) { _handleSpr.invert = false; _isEnd = false; _handleSpr.fillAmount = Vector3.Distance(noncePos, _startPos) / _handleSpr.width; } else { _handleSpr.invert = true; _isEnd = true; _handleSpr.fillAmount = (_handleSpr.width - Vector3.Distance(noncePos, _endPosOrgin)) / _handleSpr.width; } if (lerp > 1f) { _moving = false; } } } private UISprite _left = null; private UISprite _right = null; private UISprite _top = null; private UISprite _down = null; [SerializeField] private float _moveSpeed = 300f; [SerializeField] private bool _refresh = false; [SerializeField] private Color _startColor = Color.white; [SerializeField] private Color _endColor = Color.white; [SerializeField] [Range(0.5f, float.MaxValue)] private float _colorMaxTime = 1f; private List _moverList = new List(); private int _moveIndex = 0; private int _moveIndex2 = 0; private float _colorTimer = 0f; private bool _colorAdd = false; public float MoveSpeed { get { return _moveSpeed; } set { _moveSpeed = value; } } public Color StartColor { get { return _startColor; } set { _startColor = value; } } public Color EndColor { get { return _endColor; } set { _endColor = value; } } public int Width { set { UIWidget wid = gameObject.GetComponent(); if (wid != null && wid.width != value) { wid.width = value; _refresh = true; } } } public int Height { set { UIWidget wid = gameObject.GetComponent(); if (wid != null && wid.height != value) { wid.height = value; _refresh = true; } } } private void Start() { _refresh = true; Refresh(); } private void Refresh() { if (!_refresh) return; _refresh = false; _moverList.Clear(); UIWidget wid = gameObject.GetComponent(); int minWidth = Math.Min(wid.width, wid.height); var tleft = transform.Find("left"); _left = tleft != null ? tleft.GetComponent() : null; if (_left != null) { _left.transform.localScale = Vector3.one; _left.transform.localRotation = Quaternion.Euler(new Vector3(0f, 0f, -90f)); _left.type = UIBasicSprite.Type.Filled; _left.flip = UIBasicSprite.Flip.Nothing; _left.fillDirection = UIBasicSprite.FillDirection.Horizontal; _left.pivot = UIWidget.Pivot.Left; if (_left.width > minWidth) { _left.width = minWidth; } SpriteMover mover = new SpriteMover(_left, new Vector3(-wid.width / 2, -wid.height / 2), new Vector3(-wid.width / 2, wid.height / 2), _moveSpeed); _moverList.Add(mover); } var ttop = transform.Find("top"); _top = ttop != null ? ttop.GetComponent() : null; if (_top != null) { _top.transform.localScale = Vector3.one; _top.transform.localRotation = Quaternion.Euler(new Vector3(0f, 0f, 180f)); _top.type = UIBasicSprite.Type.Filled; _top.flip = UIBasicSprite.Flip.Nothing; _top.fillDirection = UIBasicSprite.FillDirection.Horizontal; _top.pivot = UIWidget.Pivot.Left; if (_top.width > minWidth) { _top.width = minWidth; } SpriteMover mover = new SpriteMover(_top, new Vector3(-wid.width / 2, wid.height / 2), new Vector3(wid.width / 2, wid.height / 2), _moveSpeed); _moverList.Add(mover); } var tright = transform.Find("right"); _right = tright != null ? tright.GetComponent() : null; if (_right != null) { _right.transform.localScale = Vector3.one; _right.transform.localRotation = Quaternion.Euler(new Vector3(0f, 0f, 90f)); _right.type = UIBasicSprite.Type.Filled; _right.flip = UIBasicSprite.Flip.Nothing; _right.fillDirection = UIBasicSprite.FillDirection.Horizontal; _right.pivot = UIWidget.Pivot.Left; if (_right.width > minWidth) { _right.width = minWidth; } SpriteMover mover = new SpriteMover(_right, new Vector3(wid.width / 2, wid.height / 2), new Vector3(wid.width / 2, -wid.height / 2), _moveSpeed); _moverList.Add(mover); } var tdown = transform.Find("down"); _down = tdown != null ? tdown.GetComponent() : null; if (_down != null) { _down.transform.localScale = Vector3.one; _down.transform.localRotation = Quaternion.Euler(new Vector3(0f, 0f, 0f)); _down.type = UIBasicSprite.Type.Filled; _down.flip = UIBasicSprite.Flip.Nothing; _down.fillDirection = UIBasicSprite.FillDirection.Horizontal; _down.pivot = UIWidget.Pivot.Left; if (_down.width > minWidth) { _down.width = minWidth; } SpriteMover mover = new SpriteMover(_down, new Vector3(wid.width / 2, -wid.height / 2), new Vector3(-wid.width / 2, -wid.height / 2), _moveSpeed); _moverList.Add(mover); } if (_moverList.Count > 0) { _moverList[0].StartMove(); } _moveIndex = 0; if (_moverList.Count >= 4) { _moveIndex2 = 2; _moverList[2].StartMove(); } else { _moveIndex2 = -1; } } private void Update() { Refresh(); _colorTimer += Time.deltaTime; Color color; if (_colorAdd) { color = Color.Lerp(_startColor, _endColor, _colorTimer / _colorMaxTime); } else { color = Color.Lerp(_endColor, _startColor, _colorTimer / _colorMaxTime); } if (_colorTimer > _colorMaxTime) { _colorTimer = 0f; _colorAdd = !_colorAdd; } for (int i = 0; i < _moverList.Count; ++i) { _moverList[i].Color = color; _moverList[i].Update(); } if(_moverList.Count > _moveIndex) { if (_moverList[_moveIndex].IsEnd) { ++_moveIndex; if (_moverList.Count > _moveIndex) { _moverList[_moveIndex].StartMove(); } else { _moveIndex = 0; _moverList[_moveIndex].StartMove(); } } } if (_moveIndex2 >= 0 && _moverList.Count > _moveIndex2) { if (_moverList[_moveIndex2].IsEnd) { ++_moveIndex2; if (_moverList.Count > _moveIndex2) { _moverList[_moveIndex2].StartMove(); } else { _moveIndex2 = 0; _moverList[_moveIndex2].StartMove(); } } } } }