当前位置: 首页 > news >正文

100个 Unity小游戏系列五 -Unity 抽奖游戏专题三老虎机游戏

一、演示效果

二、知识点讲解

2.1 布局

public void CreateItems(SlotsData[] slotsData){isInited = false;slotsPrizeList = new List<SlotsData>();for (int i = 0; i < slotsData.Length; i++){var item = slotsData[i];slotsPrizeList.Add(item);}float bottomY = -itemPadding * frontItemCount;slotEdge = new Vector2(bottomY + itemPadding * slotsPrizeList.Count, bottomY);slotWheelsIds = new int[slotWheels.Length][];slotsStopIdx = new int[slotWheels.Length];for (int i = 0; i < slotWheelsIds.Length; i++){slotWheelsIds[i] = new int[slotsPrizeList.Count];for (int j = 0; j < slotWheelsIds[i].Length; j++){slotWheelsIds[i][j] = slotsPrizeList[j].id;}int halfLen = slotsPrizeList.Count / 2;for (int j = 0; j < halfLen; j++){int randSwapIdx = UnityEngine.Random.Range(0, halfLen + 1);int swapIdx2 = slotsPrizeList.Count - randSwapIdx - 1;int tmpPrizeId = slotWheelsIds[i][swapIdx2];slotWheelsIds[i][swapIdx2] = slotWheelsIds[i][randSwapIdx];slotWheelsIds[i][randSwapIdx] = tmpPrizeId;}}for (int i = 0; i < slotWheels.Length; i++){var wheel = slotWheels[i];for (int j = 0; j < slotWheelsIds[i].Length; j++){var prizeId = slotWheelsIds[i][j];var reward_data = LuckyManager.Instance.GetDataById(rewardDatas, prizeId, out int index);var item = Instantiate(slot_Item, wheel);var pos = item.transform.localPosition;pos.y = slotEdge.y + j * itemPadding;item.transform.localPosition = pos;item.transform.localScale = Vector3.one * itemSize;var reward_img = item.GetComponentInChildren<Image>();reward_img.sprite = itemImgs[reward_data.type - 1];reward_img.SetNativeSize();item.GetComponentInChildren<TextMeshProUGUI>().text = string.Format("{0}", reward_data.amount);item.SetActive(true);}}isInited = true;}

2.2、转动逻辑

 private void OnClickSpin(){if (!isInited || IsRolling){return;}GetSelectIndex();RollSlots(SpinComplete);}public void RollSlots(Action<bool, SlotsData> onSpinCompleted){IsRolling = true;int rewardId = LuckyManager.Instance.CalculateRewardId(rewardDatas);var reward_data = LuckyManager.Instance.GetDataById(rewardDatas, rewardId, out int slot_index);bool isMatched = CalculateSlotStopIndex(reward_data, out slotsStopIdx);int slotWheelsCount = slotWheels.Length;int roundNum = 5;for (int i = 0; i < slotWheels.Length; i++){var wheel = slotWheels[i];var stopIdx = slotsStopIdx[i];float rollDistance = roundNum * (slotEdge.x - slotEdge.y);var offsetY = wheel.GetChild(stopIdx).localPosition.y;rollDistance += offsetY < 0 ? Mathf.Abs(offsetY - slotEdge.y) + slotEdge.x : offsetY;float preframePosY = 0f;float curPosY = 0f;float rollTime = 2.5f;if (rollStyle2){rollTime = 2.5f + i * 0.5f;}else if (rollStyle3){rollTime = 4.5f - i * 0.5f;}else if (rollStyle4){rollTime = 2.5f + i * 2.5f;}var rollAnim = DOTween.To(() => curPosY, (x) => curPosY = x, rollDistance, rollTime);rollAnim.SetEase(Ease.OutQuart);rollAnim.onUpdate = () =>{float deltaY = curPosY - preframePosY;for (int j = 0; j < wheel.childCount; j++){var item = wheel.GetChild(j);float nextPosY = item.transform.localPosition.y - deltaY;var localPosition = item.transform.localPosition;localPosition.y = nextPosY < slotEdge.y ? slotEdge.x - (slotEdge.y - nextPosY) : nextPosY;item.transform.localPosition = localPosition;}preframePosY = curPosY;};rollAnim.onComplete = () =>{if (--slotWheelsCount <= 0){IsRolling = false;onSpinCompleted.Invoke(isMatched, reward_data);}};}}

三、代码完整链接

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

相关文章:

  • Android 四大组件 service
  • Firefox国际版
  • 【调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件】
  • Jeecg | 如何解决 ERR Client sent AUTH, but no password is set 问题
  • 前端应用开发实验:表单控件绑定
  • 什么叫USDT(泰达币)的前世今生!
  • JavaScript tab选项卡切换
  • 分享一个思路,使用插桩技术解决慢查询测试问题
  • 16:00面试,16:08就出来了,问的问题有点变态。。。
  • 【网络版本计算器的实现】
  • Scikit-Learn随机森林回归
  • Java设计模式:享元模式实现高效对象共享与内存优化(十一)
  • 音乐传奇告别之作:《杰作》未解之谜❗❗
  • YOLOv7添加注意力机制和各种改进模块
  • 微信聊天内容怎么监控? | 三款可以监控电脑微信聊天记录的软件大盘点
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 0基础学习移动端适配
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas 五子棋游戏
  • gulp 教程
  • Java深入 - 深入理解Java集合
  • REST架构的思考
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue-router的history模式发布配置
  • 初探 Vue 生命周期和钩子函数
  • 关于springcloud Gateway中的限流
  • 前端代码风格自动化系列(二)之Commitlint
  • 区块链将重新定义世界
  • 为什么要用IPython/Jupyter?
  • 物联网链路协议
  • 《码出高效》学习笔记与书中错误记录
  • ​学习一下,什么是预包装食品?​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #mysql 8.0 踩坑日记
  • (55)MOS管专题--->(10)MOS管的封装
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C语言)共用体union的用法举例
  • (C语言)字符分类函数
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (利用IDEA+Maven)定制属于自己的jar包
  • .Net IE10 _doPostBack 未定义
  • .NET 服务 ServiceController
  • .NET开发者必备的11款免费工具
  • .net快速开发框架源码分享
  • .NET命令行(CLI)常用命令
  • ??在JSP中,java和JavaScript如何交互?