Unity 制作跑马灯抽奖

一、效果展示

跑马灯抽奖

二、解决方案

  • 动画使用DoTween 插件实现
  • DOPath 按路径移动
  • SetEase 可以设置先快后慢等效果

三、目录结构

在这里插入图片描述

四、代码实现

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;

public class GoLuckyDraw : MonoBehaviour
{
    
        
    private GameObject transparentBox;
    public List<Transform> boxList = new List<Transform>();
    public List<Transform> chooseBoxList = new List<Transform>();
    // 点了抽奖按钮正在抽奖     
    private bool isOnClickPlaying;
    // 获奖id
    private int rewardIndex;
    // 记录上一次的获奖的id
    private int lastIndex = 0;
    void Start()
    {
    
    
        for (int i = 1; i <= 10; i++)
        {
    
    
            var name = "Image_" + i;
            var sprite = transform.Find(name);
            boxList.Add(sprite);
        }

        transparentBox = transform.Find("TransparentBox").gameObject;
        transparentBox.SetActive(false);
        isOnClickPlaying = false;
    }
    
    IEnumerator Move()
    {
    
    
        List<Vector3> waypoints = new List<Vector3>();    
        //先转几圈    
        for (int i = lastIndex; i < boxList.Count; i++)
        {
    
    
            waypoints.Add(boxList[i].position);
        }
        for (int i = 0; i < boxList.Count; i++)
        {
    
    
            waypoints.Add(boxList[i].position);
        }
        for (int i = 0; i < boxList.Count; i++)
        {
    
    
            waypoints.Add(boxList[i].position);
        }
        for (int i = 0; i < boxList.Count; i++)
        {
    
    
            waypoints.Add(boxList[i].position);
        }
        // 最后一圈
        for (int i = 0; i < chooseBoxList.Count; i++)
        {
    
    
            waypoints.Add(chooseBoxList[i].position);
        }
        Tween _tweener = transparentBox.transform.DOPath(waypoints.ToArray(),5,PathType.Linear).SetEase(Ease.InOutSine);
        yield return _tweener.WaitForCompletion();
        transparentBox.gameObject.SetActive(false);
        isOnClickPlaying = false;
        lastIndex = rewardIndex;
    }

    private void chooseIndex( )
    {
    
    
        chooseBoxList.Clear();
        rewardIndex = Random.Range(0, boxList.Count);        
        for (int i = 0; i < rewardIndex; i++)
        {
    
    
            chooseBoxList.Add(boxList[i]);
        }
    }

    public void StartLuckyDraw()
    {
    
    
        if (isOnClickPlaying)
            return;
        chooseIndex();
        transparentBox.gameObject.SetActive(true);
        StartCoroutine(Move());
        isOnClickPlaying = true;
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_56130753/article/details/126441765