我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Unity之跑马灯抽奖效果单抽与连抽(附demo)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Unity之跑马灯抽奖效果单抽与连抽(附demo)

本文主要介绍了Unity之跑马灯抽奖效果单抽与连抽,分享给大家,具体如下:

效果图

单次抽奖效果

在这里插入图片描述

跳过动画抽奖效果

在这里插入图片描述

三连抽抽奖效果

在这里插入图片描述

设计思路 点击按钮 ,根据需求(概率)计算本次抽奖获得物品模拟转动 (先加速后减速), 一段时间后停止连抽的情况下等所有奖品动画都表演完成才结束跳过动画设计,有跳过时抽奖速度直接到最大,并进入可中奖 场景搭建

在这里插入图片描述

一个按钮,一个组奖品放到一个父物体上。

在这里插入图片描述

奖品元素,有两种状态,一种旋转状态,一种中奖状态。

代码


using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 跑马灯转盘
/// </summary>
public class RotaryTablePanel : MonoBehaviour
{
    //单次开始抽奖抽奖结束的事件
    private Action<bool> PlayingAction;
    //三连抽开始抽奖抽奖结束的事件
    private Action<bool> PlayingThreeAction;
    //是否是三连抽
    bool isThreeDraw;
    // 抽奖按钮,
    public Button drawBtn;
    //跳过抽奖动画
    public Toggle jumpTgl;
    // 抽奖图片父物体
    public Transform rewardImgTran;
 
    //转动特效
    public Transform eff_TurnFrame;
    //中奖特效
    public Transform eff_SelectFrame;
    // 抽奖图片
    private Transform[] rewardTransArr;
    private RotaryCell[] rewardCellArr;

    // 默认展示状态
    private bool isInitState;
    // 抽奖结束 -- 结束状态,光环不转
    private bool drawEnd;
    // 中奖
    private bool drawWinning;

    [Header("展示状态时间 --> 控制光环转动初始速度")]
    public float setrewardTime = 1f;

    private float rewardTime;
    private float rewardTiming = 0;

    // 当前光环所在奖励的索引
    private int haloIndex = 0;
    // 本次中奖ID
    private int rewardIndex = 0;

    // 点了抽奖按钮正在抽奖
    private bool isOnClickPlaying;

    public bool IsOnClickPlaying
    {
        get => isOnClickPlaying;
        set
        {
            isOnClickPlaying = value;
            if (eff_TurnFrame != null)
            {
                eff_TurnFrame.gameObject.SetActive(isOnClickPlaying);
            }
        }
    }

    public bool DrawWinning
    {
        get => drawWinning;
        set => drawWinning = value;
    }

    public bool DrawEnd
    {
        get => drawEnd;
        set
        {
            drawEnd = value;
            if (eff_SelectFrame != null)
            {
                eff_SelectFrame.gameObject.SetActive(drawEnd);
            }
        }
    }

    /// <summary>
    /// 注册转盘抽奖事件
    /// </summary>
    /// <param name="playingAction"></param>
    public void SetPlayingAction(Action<bool> playingAction, Action<bool> playingThreeAction)
    {
        PlayingAction = playingAction;
        PlayingThreeAction = playingThreeAction;
    }

    public void Start()
    {
        Init();
    }
    public void Init()
    {
         drawBtn.onClick.AddListener(OnClickDrawFun);
        rewardTransArr = new Transform[rewardImgTran.childCount];
        rewardCellArr = new RotaryCell[rewardImgTran.childCount];
        for (int i = 0; i < rewardImgTran.childCount; i++)
        {
            rewardTransArr[i] = rewardImgTran.GetChild(i);
            rewardCellArr[i] = rewardTransArr[i].GetComponent<RotaryCell>();
        }

        // 默认展示时间
        rewardTime = setrewardTime;
        rewardTiming = 0;

        DrawEnd = false;
        DrawWinning = false;
        IsOnClickPlaying = false;

    }

    public void RePrepare()
    {
        if (IsOnClickPlaying)
        {
            return;
        }
        rewardTime = setrewardTime;
        rewardTiming = 0;

        DrawEnd = false;
        DrawWinning = false;
        IsOnClickPlaying = false;
        if (true)
        {
            for (int i = 0; i < rewardCellArr.Length; i++)
            {
                rewardCellArr[i].ShowEff(RotaryCell.EffType.all, false);
            }
        }

    }

    /// <summary>
    /// 从中奖状态恢复到默认状态
    /// </summary>
    /// <param name="index"></param>
    public void RestoreDefault(int index = 0)
    {
        index--;
        rewardCellArr[index].ShowEff(RotaryCell.EffType.all, false);
    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            RePrepare();
        }
        if (Input.GetKeyDown(KeyCode.H))
        {
            OnClickDrawFunThree();
        }
        if (DrawEnd || rewardCellArr == null) return;
        if (!IsOnClickPlaying)
        {
            return;
        }

        // 抽奖展示
        rewardTiming += Time.deltaTime;
        if (rewardTiming >= rewardTime)
        {

            rewardTiming = 0;

            haloIndex++;
            if (haloIndex >= rewardCellArr.Length)
            {
                haloIndex = 0;
            }
            if (isThreeDraw)
                SetHaloThreePos(haloIndex);
            else
                SetHaloPos(haloIndex);
        }
    }

    // 设置光环显示位置
    void SetHaloPos(int index)
    {

        rewardCellArr[index - 1 < 0 ? rewardCellArr.Length - 1 : index - 1].ShowEff(RotaryCell.EffType.turn, false);
        rewardCellArr[index].ShowEff(RotaryCell.EffType.turn, true);

        // 中奖 && 此ID == 中奖ID
        if (DrawWinning && index == rewardIndex)
        {
            rewardCellArr[index].ShowEff(RotaryCell.EffType.select, true);
            rewardCellArr[index].ShowEff(RotaryCell.EffType.turn, false);
            IsOnClickPlaying = false;
            DrawEnd = true;
            if (PlayingAction != null)
            {
                PlayingAction(false);

            }

            //todo...展示中奖物品,维护数据 --> 注意: index是索引
            Debug.Log("恭喜您中奖,中奖物品索引是:" + index + "号");
        }
    }

    void SetHaloThreePos(int index)
    {

        rewardCellArr[index - 1 < 0 ? rewardCellArr.Length - 1 : index - 1].ShowEff(RotaryCell.EffType.turn, false);
        rewardCellArr[index].ShowEff(RotaryCell.EffType.turn, true);

        // 中奖 && 此ID == 中奖ID
        if (DrawWinning && index == indexList.Peek())
        {
            rewardCellArr[index].GetComponent<RotaryCell>().ShowEff(RotaryCell.EffType.select, true);
            rewardCellArr[index].GetComponent<RotaryCell>().ShowEff(RotaryCell.EffType.turn, false);


            indexList.Dequeue();
            //todo...展示中奖物品,维护数据 --> 注意: index是索引
            Debug.Log("恭喜您三连抽中奖,中奖物品索引是:" + index + "号");
            if (indexList.Count == 0)
            {
                if (PlayingThreeAction != null)
                {
                    PlayingThreeAction(false);

                }
                IsOnClickPlaying = false;
                DrawEnd = true;
                isThreeDraw = false;
                return;
            }

            if (jumpTgl != null && jumpTgl.isOn)
            {
                rewardTime = 0.02f;
                DrawWinning = true;
            }
            else
            {
                rewardTime = setrewardTime;
                rewardTiming = 0;
                DrawWinning = false;
                StartCoroutine(StartDrawAni());
            }


        }
    }


    // 点击抽奖按钮
    void OnClickDrawFun()
    {
        if (!IsOnClickPlaying)
        {
            haloIndex = -1;
            RePrepare();

            // 随机抽中ID
            rewardIndex = UnityEngine.Random.Range(0, rewardCellArr.Length);
            Debug.Log("开始抽奖,本次抽奖随机到的ID是:" + rewardIndex);

            IsOnClickPlaying = true;
            DrawEnd = false;
            DrawWinning = false;
            if (PlayingAction != null)
            {
                PlayingAction(true);
            }

            if (jumpTgl != null && jumpTgl.isOn)
            {
                rewardTime = 0.02f;
                DrawWinning = true;
            }
            else
                StartCoroutine(StartDrawAni());
        }
    }

    // 点击抽奖按钮
    public void OnClickDrawFun(int index)
    {
        haloIndex = -1;
        isThreeDraw = false;
        rewardIndex = index - 1;//给lua提供方法,减1
        if (!IsOnClickPlaying)
        {
            RePrepare();
            Debug.Log("开始抽奖,本次抽奖到的ID是:" + rewardIndex);

            IsOnClickPlaying = true;
            DrawEnd = false;
            DrawWinning = false;
            if (PlayingAction != null)
            {
                PlayingAction(true);
            }

            if (jumpTgl != null && jumpTgl.isOn)
            {
                rewardTime = 0.02f;
                DrawWinning = true;
            }
            else
                StartCoroutine(StartDrawAni());
        }
    }

    Queue<int> indexList = new Queue<int>();
    public void OnClickDrawFunThree(Queue<int> _table)
    {
        haloIndex = -1;
        isThreeDraw = true;


        if (!IsOnClickPlaying)
        {
            RePrepare();

            IsOnClickPlaying = true;
            DrawEnd = false;
            DrawWinning = false;
            if (PlayingThreeAction != null)
            {
                PlayingThreeAction(true);
            }

            if (jumpTgl != null && jumpTgl.isOn)
            {
                rewardTime = 0.02f;
                DrawWinning = true;
            }
            else
                StartCoroutine(StartDrawAni());
        }
    }
    public void OnClickDrawFunThree()
    {
        haloIndex = -1;
        isThreeDraw = true;

        indexList.Enqueue(3);
        indexList.Enqueue(7);
        indexList.Enqueue(5);


        //rewardIndex = indexList.Peek();

        if (!IsOnClickPlaying)
        {
            RePrepare();
   

            IsOnClickPlaying = true;
            DrawEnd = false;
            DrawWinning = false;
            if (PlayingThreeAction != null)
            {
                PlayingThreeAction(true);
            }
            if (jumpTgl != null && jumpTgl.isOn)
            {
                rewardTime = 0.02f;
                DrawWinning = true;
            }
            else
                StartCoroutine(StartDrawAni());
        }
    }

    /// <summary>
    /// 开始抽奖动画
    /// 先快后慢 -- 根据需求调整时间
    /// </summary>
    /// <returns></returns>
    IEnumerator StartDrawAni()
    {
        rewardTime = setrewardTime;

        // 加速
        for (int i = 0; i < setrewardTime / 0.05f - 1; i++)
        {
            yield return new WaitForSeconds(0.05f);
            rewardTime -= 0.05f;
        }

        yield return new WaitForSeconds(2f);
        // 减速
        for (int i = 0; i < setrewardTime / 0.05f - 4; i++)
        {
            yield return new WaitForSeconds(0.05f);
            rewardTime += 0.02f;
        }

        yield return new WaitForSeconds(0.5f);
        DrawWinning = true;
    }

    public void OnDestroy()
    {
        Debug.Log("C#的关闭");
    }
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotaryCell : MonoBehaviour
{
    public Transform[] turnEff;
    public Transform[] seletEff;
    public enum EffType
    {
        turn,
        select,
        all,
    }
    public void ShowEff(EffType efftype, bool isShow)
    {

        switch (efftype)
        {
            case EffType.turn:
                for (int i = 0; i < turnEff.Length; i++)
                {

                    turnEff[i].gameObject.SetActive(isShow);
                }
                break;
            case EffType.select:
                for (int i = 0; i < turnEff.Length; i++)
                {

                    seletEff[i].gameObject.SetActive(isShow);
                }
                break;
            case EffType.all:
                for (int i = 0; i < turnEff.Length; i++)
                {
                    turnEff[i].gameObject.SetActive(isShow);
                    seletEff[i].gameObject.SetActive(isShow);
                }
                break;
            default:
                break;
        }



    }

    public void HideAllEff()
    {
        for (int i = 0; i < turnEff.Length; i++)
        {

            turnEff[i].gameObject.SetActive(false);
        }
        for (int i = 0; i < turnEff.Length; i++)
        {

            seletEff[i].gameObject.SetActive(false);
        }
    }

    IEnumerator HideEffAni()
    {
        yield return new WaitForSeconds(0.1f);
        for (int i = 0; i < turnEff.Length; i++)
        {

            turnEff[i].gameObject.SetActive(false);
        }
    }
}

工程项目

下载地址

到此这篇关于Unity之跑马灯抽奖效果单抽与连抽(附demo)的文章就介绍到这了,更多相关Unity 跑马灯抽奖 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Unity之跑马灯抽奖效果单抽与连抽(附demo)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录