最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity之跑馬燈抽獎效果單抽與連抽(附demo)

 更新時間:2021年05月11日 10:36:56   作者:https://blog.csdn.net/weixin_44186849/article/details/116570111  
這篇文章主要介紹了Unity之跑馬燈抽獎效果單抽與連抽,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文主要介紹了Unity之跑馬燈抽獎效果單抽與連抽,分享給大家,具體如下:

效果圖

單次抽獎效果

在這里插入圖片描述

跳過動畫抽獎效果

在這里插入圖片描述

三連抽抽獎效果

在這里插入圖片描述

設(shè)計思路 點擊按鈕 ,根據(jù)需求(概率)計算本次抽獎獲得物品模擬轉(zhuǎn)動 (先加速后減速), 一段時間后停止連抽的情況下等所有獎品動畫都表演完成才結(jié)束跳過動畫設(shè)計,有跳過時抽獎速度直接到最大,并進入可中獎 場景搭建

在這里插入圖片描述

一個按鈕,一個組獎品放到一個父物體上。

在這里插入圖片描述

獎品元素,有兩種狀態(tài),一種旋轉(zhuǎn)狀態(tài),一種中獎狀態(tài)。

代碼

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

/// <summary>
/// 跑馬燈轉(zhuǎn)盤
/// </summary>
public class RotaryTablePanel : MonoBehaviour
{
    //單次開始抽獎抽獎結(jié)束的事件
    private Action<bool> PlayingAction;
    //三連抽開始抽獎抽獎結(jié)束的事件
    private Action<bool> PlayingThreeAction;
    //是否是三連抽
    bool isThreeDraw;
    // 抽獎按鈕,
    public Button drawBtn;
    //跳過抽獎動畫
    public Toggle jumpTgl;
    // 抽獎圖片父物體
    public Transform rewardImgTran;
 
    //轉(zhuǎn)動特效
    public Transform eff_TurnFrame;
    //中獎特效
    public Transform eff_SelectFrame;
    // 抽獎圖片
    private Transform[] rewardTransArr;
    private RotaryCell[] rewardCellArr;

    // 默認展示狀態(tài)
    private bool isInitState;
    // 抽獎結(jié)束 -- 結(jié)束狀態(tài),光環(huán)不轉(zhuǎn)
    private bool drawEnd;
    // 中獎
    private bool drawWinning;

    [Header("展示狀態(tài)時間 --> 控制光環(huán)轉(zhuǎn)動初始速度")]
    public float setrewardTime = 1f;

    private float rewardTime;
    private float rewardTiming = 0;

    // 當前光環(huán)所在獎勵的索引
    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>
    /// 注冊轉(zhuǎn)盤抽獎事件
    /// </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>
    /// 從中獎狀態(tài)恢復(fù)到默認狀態(tài)
    /// </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;
        }

        // 抽獎?wù)故?
        rewardTiming += Time.deltaTime;
        if (rewardTiming >= rewardTime)
        {

            rewardTiming = 0;

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

    // 設(shè)置光環(huán)顯示位置
    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...展示中獎物品,維護數(shù)據(jù) --> 注意: 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...展示中獎物品,維護數(shù)據(jù) --> 注意: 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>
    /// 開始抽獎動畫
    /// 先快后慢 -- 根據(jù)需求調(diào)整時間
    /// </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#的關(guān)閉");
    }
}

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);
        }
    }
}

工程項目

下載地址

到此這篇關(guān)于Unity之跑馬燈抽獎效果單抽與連抽(附demo)的文章就介紹到這了,更多相關(guān)Unity 跑馬燈抽獎 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • unity實現(xiàn)鼠標跟隨(ITween)

    unity實現(xiàn)鼠標跟隨(ITween)

    這篇文章主要為大家詳細介紹了unity實現(xiàn)鼠標跟隨,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C# 循環(huán)判斷會進來幾次的實現(xiàn)代碼

    C# 循環(huán)判斷會進來幾次的實現(xiàn)代碼

    這篇文章主要介紹了C# 循環(huán)判斷會進來幾次的實現(xiàn)代碼,代碼中就一個循環(huán),循環(huán)的判斷是從一個函數(shù)獲取值,需要的朋友可以參考下
    2018-06-06
  • Unity實現(xiàn)角色受擊身體邊緣發(fā)光特效

    Unity實現(xiàn)角色受擊身體邊緣發(fā)光特效

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)角色受擊身體邊緣發(fā)光特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • c#中 String和string的區(qū)別介紹

    c#中 String和string的區(qū)別介紹

    String和string的區(qū)別有哪些,想有很多朋友都不知道吧,在本文將為大家詳細介紹下,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-10-10
  • C#調(diào)用QQ_Mail發(fā)送郵件實例代碼兩例

    C#調(diào)用QQ_Mail發(fā)送郵件實例代碼兩例

    這篇文章介紹了C#調(diào)用QQ_Mail發(fā)送郵件的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#驗證給定字符串形式日期是否合法的方法

    C#驗證給定字符串形式日期是否合法的方法

    這篇文章主要介紹了C#驗證給定字符串形式日期是否合法的方法,實例分析了C#針對字符串及日期的操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C# SQLite執(zhí)行效率的優(yōu)化教程

    C# SQLite執(zhí)行效率的優(yōu)化教程

    這篇文章主要給大家介紹了關(guān)于C# SQLite執(zhí)行效率優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用C# SQLite具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • c#版json數(shù)據(jù)解析示例分享

    c#版json數(shù)據(jù)解析示例分享

    JSON(全稱為JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。它是基于JavaScript語法標準的一個子集。 JSON采用完全獨立于語言的文本格式,可以很容易在各種網(wǎng)絡(luò)、平臺和程序之間傳輸。JSON的語法很簡單,易于人閱讀和編寫,同時也易于機器解析和生成
    2014-03-03
  • Unity3D開發(fā)教程:憤怒的小鳥

    Unity3D開發(fā)教程:憤怒的小鳥

    這篇文章詳細的講解了如何從0開發(fā)出一個Unity3D的小游戲憤怒的小鳥,本文包含大量的圖片與文字描述,也含有大量的源代碼,可以讓你快速入手,希望本篇文章對你有所幫助
    2021-06-06
  • C#中的in參數(shù)與性能分析詳解

    C#中的in參數(shù)與性能分析詳解

    這篇文章主要給大家介紹了關(guān)于C#中in參數(shù)與性能分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

运城市| 开化县| 专栏| 石林| 余姚市| 锦州市| 澳门| 比如县| 吉林省| 封开县| 深泽县| 铁力市| 泰顺县| 永修县| 青田县| 仪征市| 绍兴市| 托里县| 板桥市| 澄城县| 萨迦县| 西充县| 夏河县| 曲靖市| 英山县| 突泉县| 潞西市| 大埔县| 离岛区| 炎陵县| 九江县| 阜新| 耒阳市| 白沙| 汉源县| 镇巴县| 广饶县| 武鸣县| 海淀区| 双辽市| 太仆寺旗|