Unity 之 三种抽奖示例

简介: Unity做的三种抽奖的示例,根据需求修改动画时间和效果以及获取概率,文末附示例链接。

一,跑马灯抽奖

效果图:
1.1
设计思路:

  • 点击按钮 ,根据需求(概率)计算本次抽奖获得物品
  • 模拟转动 (先加速后减速), 一段时间后停止

场景搭建:
1.2
一个按钮,一个组奖品(放到一个父物体上),一个光环(当前选中的那个奖品)

实现代码:

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

public class RotaryTablePanel : MonoBehaviour
{
    // 抽奖按钮,
    public Button drawBtn;
    // 抽奖图片父物体
    public Transform rewardImgTran;
    // 光环
    public Transform HaloImgTransform;
    // 抽奖图片
    private Transform[] rewardTransArr;

    // 默认展示状态
    private bool isInitState;
    // 抽奖结束 -- 结束状态,光环不转
    private bool drawEnd;
    // 中奖
    private bool drawWinning;
    
    // 展示状态时间 --> 控制光环转动速度
    private float rewardTime = 0.8f;
    private float rewardTiming = 0;

    // 当前光环所在奖励的索引
    private int haloIndex = 0;
    // 本次中奖ID
    private int rewardIndex = 0;
    
    // 点了抽奖按钮正在抽奖
    private bool isOnClickPlaying;
    
    void Start()
    {
        drawBtn.onClick.AddListener(OnClickDrawFun);
        rewardTransArr = new Transform[rewardImgTran.childCount];
        for (int i = 0; i < rewardImgTran.childCount; i++)
        {
            rewardTransArr[i] = rewardImgTran.GetChild(i);
        }
        
        // 默认展示时间
        rewardTime = 0.6f;
        rewardTiming = 0;
        
        drawEnd = false;
        drawWinning = false;
        isOnClickPlaying = false;
    }

    
    void Update()
    {
        if (drawEnd) return;
        
        // 抽奖展示
        rewardTiming += Time.deltaTime;
        if (rewardTiming >= rewardTime)
        {
            rewardTiming = 0;
            haloIndex++;
            if (haloIndex >= rewardTransArr.Length)
            {
                haloIndex = 0;
            }
            SetHaloPos(haloIndex);
        }
    }
    
    // 设置光环显示位置
    void SetHaloPos(int index)
    {
        HaloImgTransform.position = rewardTransArr[index].position;

        // 中奖 && 此ID == 中奖ID
        if (drawWinning && index == rewardIndex)
        {
            isOnClickPlaying = false;
            drawEnd = true;
            //todo...展示中奖物品,维护数据 --> 注意: index是索引
            Debug.Log("恭喜您中奖,中奖物品索引是:" + index + "号");
        }
    }

    // 点击抽奖按钮
    void OnClickDrawFun()
    {
        if (!isOnClickPlaying)
        {
            // 随机抽中ID
            rewardIndex =  Random.Range(0, rewardTransArr.Length);
            Debug.Log("开始抽奖,本次抽奖随机到的ID是:" + rewardIndex);
            isOnClickPlaying = true;
            drawEnd = false;
            drawWinning = false;
            StartCoroutine(StartDrawAni());
        }
    }

    /// <summary>
    /// 开始抽奖动画
    /// 先快后慢 -- 根据需求调整时间
    /// </summary>
    /// <returns></returns>
    IEnumerator StartDrawAni()
    {
        rewardTime = 0.8f;
        // 加速
        for (int i = 0; i < 7; i++)
        {
            yield return new WaitForSeconds(0.1f);
            rewardTime -= 0.1f;
        }

        yield return new WaitForSeconds(2f);
        // 减速
        for (int i = 0; i < 5; i++)
        {
            yield return new WaitForSeconds(0.1f);
            rewardTime += 0.1f;
        }
        
        yield return new WaitForSeconds(1f);
        drawWinning = true;
    }
    
}

二,转盘抽奖

效果图:
2.1
设计思路:(和上面差不多)

  • 点击按钮 ,根据需求(概率)计算本次抽奖获得物品索引
  • 根据随机到的索引,计算需要旋转的角度
  • 模拟转动 , 一段时间后停止到计算的角度上

场景搭建:
1.2
一个按钮,一个转盘,一个指针;

实现代码:

using UnityEngine;
using UnityEngine.UI;

public class RotaryDrawDemo : MonoBehaviour
{
    // 转盘
    public Transform RotateTableTrans;
    // 抽奖按钮
    public Button DrawBtn;

    // 转盘区域数 -- (Demo中图片是10份)
    private int rotateTableNumber = 10;
    
    // 旋转动画时间      
    private float rotateTime = 3f;
    private float rotateTiming = 0f;

    /// <summary>
    /// 需要转动到的目标位置
    /// </summary>
    private Quaternion targetAngels = Quaternion.identity;

    // 转动的速度 
    private float rotateSpeed = 20;
    // 模拟抽奖的选择时间 
    private float RotateTime = 3f;

    /// <summary>
    /// 是否开始抽奖转动
    /// </summary>
    private bool isStartRotate = false;
    // 本次中奖ID
    private int rewardIndex = 0;

    void Start()
    {
        DrawBtn.onClick.AddListener(OnClickDrawFun);
    }

    void Update()
    {
        if (!isStartRotate) return;
        
        rotateTiming += Time.deltaTime;
        // 过了动画时间
        if (rotateTiming >= RotateTime)
        {
            RotateTableTrans.Rotate(Vector3.back * 2);
            // 计算当前正在旋转的角度和目标角度的夹角
            if (Quaternion.Angle(RotateTableTrans.rotation, targetAngels) <= 2)
            {
                // 设置目标夹角
                RotateTableTrans.rotation = targetAngels;
                // 转动停止
                isStartRotate = false;

                // todo... 奖品展示,数据维护
                Debug.Log("***** 恭喜或的奖品,奖品索引:" + rewardIndex + " ,转盘角度是:" 
                          + RotateTableTrans.localEulerAngles.z + "*****");
            }
        }
        else
        {
            // 转动转盘(back为顺时针, forward为逆时针)
            RotateTableTrans.Rotate(Vector3.back * 10);
        }
    }

    // 点击抽奖按钮
    void OnClickDrawFun()
    {
        if (!isStartRotate)
        {
            //开始旋转
            isStartRotate = true;
            rotateTiming = 0;

            // 随机到转盘第几块区域
            rewardIndex = Random.Range(0, rotateTableNumber);
            // 根据区域计算角度 --> 36 = 360 / rotateTableNumber;
            float targetRot = rewardIndex * 36; 
            //设置目标位置
            targetAngels = Quaternion.Euler(0, 0, targetRot);
            
            Debug.Log("----- 开始抽奖 随机到的区域,索引是:" + rewardIndex + ",角度是:" + targetRot + "-----");
        }
    }
}

三,老虎机抽奖

效果图:
3.1
具体参考:Unity 之 实现老虎机滚动抽奖效果

相关文章
|
编解码 程序员 atlas
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
图集只是当所有给低昂的纹理需要相同的着色器时采用的一种方法,如果一些纹理需要通过着色器应用独立的图形效果,它们就必须分离到自己的材质中,并在单独的组中打图集。
1754 0
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
|
4月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
102 1
|
4月前
|
开发者 图形学 C#
揭秘游戏沉浸感的秘密武器:深度解析Unity中的音频设计技巧,从背景音乐到动态音效,全面提升你的游戏氛围艺术——附实战代码示例与应用场景指导
【8月更文挑战第31天】音频设计在游戏开发中至关重要,不仅能增强沉浸感,还能传递信息,构建氛围。Unity作为跨平台游戏引擎,提供了丰富的音频处理功能,助力开发者轻松实现复杂音效。本文将探讨如何利用Unity的音频设计提升游戏氛围,并通过具体示例代码展示实现过程。例如,在恐怖游戏中,阴森的背景音乐和突然的脚步声能增加紧张感;在休闲游戏中,轻快的旋律则让玩家感到愉悦。
119 0
|
7月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
158 2
|
Java 图形学 Android开发
Android/iOS内嵌Unity开发示例
Android/iOS内嵌Unity开发示例
529 0
Android/iOS内嵌Unity开发示例
|
网络协议 图形学
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
738 0
Unity【Socket TCP】- 服务端与客户端通讯的简单示例
|
弹性计算 图形学
Unity 之 Pure版Entity Component System (ECS)  官方Rotation示例解析
又有一段时间没有写博客了,真是不爽~~~ 趁着最近两天没事,赶紧补上一篇,这次开始写一篇Pure ECS版本示例解析,对上次Hybrid版本Unity之浅析 Entity Component System (ECS)的补充,使用的是官方案例的Rotation场景。
2034 0
Unity3dC#位运算讲解与示例
C#位运算讲解与示例 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。
1116 0