需求:
奖品循环滚动(慢 > 快 > 慢 > 停)停到指定奖励的位置
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public enum DrawType { Idle, Start, Center, End, } public class LotteryDraw : MonoBehaviour { public Transform parent; public float position_start; public float position_center; private float position_end; public float speed_start; public float speed_add; public float speed_min; public float speed_max; private DrawType _drawState; public DrawType drawState { get { return _drawState; } set { _drawState = value; switch (_drawState) { case DrawType.Idle: move = false; break; case DrawType.Start: speed_move = speed_start; speed_add = Mathf.Abs(speed_add); move = true; break; case DrawType.Center: dis_cur = 0; GetPrePosition(); break; case DrawType.End: speed_add = -speed_add; break; default: break; } } } private float speed_move; private float dis_max; private float dis_cur; private bool move; private List<Transform> items; private int itemCount = 15; //测试要滚动到指定的格子位置 public int index; private void Awake() { items = new List<Transform>(); //此处的100表示格子大小 float position = position_start; position_end = position_start + 100 * itemCount; for (int i = 0; i < itemCount; i++) { Object prefab = Resources.Load("Item"); ; GameObject go = Instantiate((GameObject)prefab, parent); Transform tr = go.transform; Text text = tr.GetComponentInChildren<Text>(); go.name = "Item_" + i; text.text = i.ToString(); tr.localPosition = new Vector3(position, 0, 0); position += 100; items.Add(tr); } } private void Update() { //按P开始测试 if (Input.GetKeyDown(KeyCode.P)) { drawState = DrawType.Start; } if (move) { if (drawState == DrawType.Center) { dis_cur += speed_move; if (dis_cur >= dis_max) { drawState = DrawType.End; } } else { speed_move += speed_add; if (speed_move >= speed_max) { drawState = DrawType.Center; } if (speed_move <= speed_min) { speed_move = speed_min; if (Mathf.Abs(items[index].localPosition.x - position_center) < speed_min) { drawState = DrawType.Idle; } } } if (move) { Move_Update(); } } } private void Move_Update() { for (int i = 0; i < items.Count; i++) { items[i].Translate(Vector3.right * speed_move); if (items[i].localPosition.x >= position_end) { float out_p = items[i].localPosition.x - position_end; items[i].localPosition = new Vector3(position_start + out_p, 0, 0); } //特效:根据格子位置设置大小 float distance = items[i].localPosition.x - position_center; distance = Mathf.Abs(distance); if (distance < 50) { items[i].localScale = Vector3.one * 1.5f; } else if (distance < 110) { items[i].localScale = Vector3.one * 1.2f; } else { items[i].localScale = Vector3.one; } } } private void GetPrePosition() { dis_max = Mathf.Abs(position_start) + position_end; dis_max = dis_max / 2; dis_max -= items[index].localPosition.x; dis_max -= 400; } }
缺点:
若奖励列表过长,走到指定奖励位置 表现效果(以最小速度)不佳