一、演示效果

二、知识点

2.1 布局

 private void CreateItems()
        {
            for (int i = 0; i < rewardDatas.Length; i++)
            {
                var reward_data = rewardDatas[i];
                GameObject fruitOjb;
                if (i < itemRoot.childCount)
                {
                    fruitOjb = itemRoot.GetChild(i).gameObject;
                }
                else
                {
                    fruitOjb = Instantiate(itemRoot.GetChild(0).gameObject, itemRoot);
                }
                fruitOjb.SetActive(true);
                var fruitImg = fruitOjb.transform.Find("Icon").GetComponent<Image>();
                fruitImg.sprite = itemImgs[reward_data.type - 1];
                fruitImg.SetNativeSize();
                fruitImg.transform.localScale = Vector3.one * itemSize;

                var amountTxt = fruitOjb.GetComponentInChildren<TextMeshProUGUI>();
                amountTxt.text = string.Format("{0}", reward_data.amount);

                fruitOjb.transform.localScale = Vector3.one * itemSize;

                cursorLists.Add(fruitOjb.transform.Find("Cursor").gameObject);
                selectLists.Add(fruitOjb.transform.Find("Select").gameObject);
            }
        }

2.2 转动逻辑

private IEnumerator StartSpin(Action<List<RewardData>> onSpinCompleted)
        {

            IsRolling = true;

            ChangeSelectEanble(0, true);
            ChangeCursorEanble(0, true);

            GetSelectIndex();


            int[] rewardIdLists = LuckyManager.Instance.CalculateRewardId(rewardDatas, GetRewardCount());

            int spinCount = rewardIdLists.Length;

            List<RewardData> rewardDataList = new List<RewardData>();


            if (rollStyle3)
            {
                yield return StaraThreeSpine();
            }


            for (int i = 0; i < rewardIdLists.Length; i++)
            {
                var rewardDt = LuckyManager.Instance.GetDataById(rewardDatas, rewardIdLists[i], out int rewardIndex);
                if (rewardDt == null)
                {
                    Debug.LogErrorFormat("水果机表中不存在id:{0}", rewardIdLists[i]);
                    continue;
                }
                int totalLen = itemCount * 3 + rewardIndex;

                if (rollStyle3 || rollStyle2)
                    totalLen = itemCount * 3 - i + rewardIndex;


                int curIndex = startIndexs;
                float spinTime = totalLen * 0.06f;
                var moveAct = DOTween.To(() => curIndex, (x) => curIndex = x, totalLen, spinTime);
                moveAct.SetEase(Ease.Linear);
                moveAct.onUpdate = () =>
                {
                    int fixNum = curIndex % itemCount;
                    startIndexs = fixNum;
                    ChangeCursorEanble(fixNum);
                };
                moveAct.OnComplete(() =>
                {
                    rewardDataList.Add(rewardDt);
                    ChangeSelectEanble(rewardIndex);
                    if (--spinCount <= 0)
                    {
                        IsRolling = false;
                        onSpinCompleted?.Invoke(rewardDataList);
                    }
                });
                if (rollStyle3 || rollStyle2)
                    yield return new WaitForSeconds(spinTime);
            }
        }

四 、代码链接

https://github.com/lixianjun0903/luckydraw-master.git

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐