100个 Unity小游戏系列三 -Unity 抽奖游戏专题一 转盘抽奖游戏

2024-05-28 18:28

本文主要是介绍100个 Unity小游戏系列三 -Unity 抽奖游戏专题一 转盘抽奖游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 、效果展示

二、知识点

2.1 布局需要实现功能

1、转动的根目录为itemSpinRoot

2、创建对应的item

3、每个item转动的角度

2.2 代码

public class WheelDialog : UIBase{[SerializeField] Button btnClick;[SerializeField] Button btnClose;[SerializeField] Sprite[] itemImgs;[SerializeField] Transform itemParent;Transform itemSpinRoot;[Header("物体数量")][SerializeField] int ItemCount = 8;private float item_rangle;private RewardData[] rewardDatas;protected internal override void OnInit(UIView view){base.OnInit(view);item_rangle = 360f / ItemCount;//转动的根目录为itemSpinRootitemSpinRoot = itemParent.parent;btnClick.onClick.RemoveAllListeners();btnClick.onClick.AddListener(OnClickSpin);btnClose.onClick.RemoveAllListeners();btnClose.onClick.AddListener(OnCloseEvent);rewardDatas = LuckyManager.Instance.GetDefaultWheelData(ItemCount);//创建对应的itemCreateItems(rewardDatas);}protected internal override void OnOpen(object userData){base.OnOpen(userData);ResetWheels();}private void ResetWheels(){}private void CreateItems(RewardData[] wheel_tb){Vector3 init_pos = itemParent.GetChild(0).transform.localPosition;if (wheel_tb.Length != ItemCount){Debug.LogError("wheel_tb.Count !=  wheel_count !!!");}for (int i = 0; i < wheel_tb.Length; i++){var reward_data = wheel_tb[i];var next_rot = Quaternion.Euler(0, 0, i * item_rangle);var next_pos = next_rot * init_pos;GameObject item;if (i + 1 <= itemParent.childCount){item = itemParent.GetChild(i).gameObject;}else{item = Instantiate(itemParent.GetChild(0).gameObject, itemParent);}//每个item转动的角度item.transform.localPosition = next_pos;item.transform.localRotation = next_rot;var reward_text = item.GetComponentInChildren<TextMeshProUGUI>();var reward_img = item.GetComponentInChildren<Image>();reward_img.sprite = itemImgs[reward_data.type - 1];reward_img.SetNativeSize();reward_text.text = string.Format("{0}", reward_data.amount);item.GetComponentInChildren<ParticleSystem>().GetComponent<Renderer>().sortingOrder = m_Canvas.sortingOrder + 1;}}private void OnClickSpin(){if (IsRolling){return;}StartSpin(SpinComplete);}}

三、转动核心逻辑

3.1 知识点

1、DOTween实现转动角度方法实现

public static TweenerCore<float, float, FloatOptions> To(
DOGetter<float> getter,
DOSetter<float> setter,
float endValue,
float duration)
{
return DOTween.ApplyTo<float, float, FloatOptions>(getter, setter, endValue, duration);
}

2、设置转动模式

roll_act.SetEase(GetEase());

3.2 代码

 private void StartSpin(Action<RewardData> onSpinCompleted){IsRolling = true;int rewardId = LuckyManager.Instance.CalculateRewardId(rewardDatas);var reward_data = LuckyManager.Instance.GetDataById(rewardDatas, rewardId, out int wheel_index);//初始角度float cur_angle = itemSpinRoot.localRotation.eulerAngles.z;int round_count = UnityEngine.Random.Range(4, 5);//最后要转动的角度float final_angle = -item_rangle * wheel_index + 360 * round_count;float duration = 2.5f;// DOTween实现转动角度方法实现1var roll_act = DOTween.To(() => cur_angle, (x) => cur_angle = x, final_angle, duration);//转动模式设置roll_act.SetEase(GetEase());roll_act.onUpdate = () =>{// DOTween实现转动角度方法实现2itemSpinRoot.localRotation = Quaternion.Euler(0, 0, cur_angle);};roll_act.OnComplete(() =>{IsRolling = false;onSpinCompleted.Invoke(reward_data);});}

四、完整代码

using UnityEngine;
using DG.Tweening;
using System;
using UnityEngine.UI;
using TMPro;namespace Pillow.Lucky
{public class WheelDialog : UIBase{[SerializeField] Button btnClick;[SerializeField] Button btnClose;[SerializeField] Sprite[] itemImgs;[SerializeField] Transform itemParent;Transform itemSpinRoot;[Header("物体数量")][SerializeField] int ItemCount = 8;private float item_rangle;private RewardData[] rewardDatas;protected internal override void OnInit(UIView view){base.OnInit(view);item_rangle = 360f / ItemCount;//转动的根目录为itemSpinRootitemSpinRoot = itemParent.parent;btnClick.onClick.RemoveAllListeners();btnClick.onClick.AddListener(OnClickSpin);btnClose.onClick.RemoveAllListeners();btnClose.onClick.AddListener(OnCloseEvent);rewardDatas = LuckyManager.Instance.GetDefaultWheelData(ItemCount);//创建对应的itemCreateItems(rewardDatas);}protected internal override void OnOpen(object userData){base.OnOpen(userData);ResetWheels();}private void ResetWheels(){}private void CreateItems(RewardData[] wheel_tb){Vector3 init_pos = itemParent.GetChild(0).transform.localPosition;if (wheel_tb.Length != ItemCount){Debug.LogError("wheel_tb.Count !=  wheel_count !!!");}for (int i = 0; i < wheel_tb.Length; i++){var reward_data = wheel_tb[i];var next_rot = Quaternion.Euler(0, 0, i * item_rangle);var next_pos = next_rot * init_pos;GameObject item;if (i + 1 <= itemParent.childCount){item = itemParent.GetChild(i).gameObject;}else{item = Instantiate(itemParent.GetChild(0).gameObject, itemParent);}//每个item转动的角度item.transform.localPosition = next_pos;item.transform.localRotation = next_rot;var reward_text = item.GetComponentInChildren<TextMeshProUGUI>();var reward_img = item.GetComponentInChildren<Image>();reward_img.sprite = itemImgs[reward_data.type - 1];reward_img.SetNativeSize();reward_text.text = string.Format("{0}", reward_data.amount);item.GetComponentInChildren<ParticleSystem>().GetComponent<Renderer>().sortingOrder = m_Canvas.sortingOrder + 1;}}private void OnClickSpin(){if (IsRolling){return;}StartSpin(SpinComplete);}private void StartSpin(Action<RewardData> onSpinCompleted){IsRolling = true;int rewardId = LuckyManager.Instance.CalculateRewardId(rewardDatas);var reward_data = LuckyManager.Instance.GetDataById(rewardDatas, rewardId, out int wheel_index);//初始角度float cur_angle = itemSpinRoot.localRotation.eulerAngles.z;int round_count = UnityEngine.Random.Range(4, 5);//最后要转动的角度float final_angle = -item_rangle * wheel_index + 360 * round_count;float duration = 2.5f;// DOTween实现转动角度方法实现1var roll_act = DOTween.To(() => cur_angle, (x) => cur_angle = x, final_angle, duration);//转动模式设置roll_act.SetEase(GetEase());roll_act.onUpdate = () =>{// DOTween实现转动角度方法实现2itemSpinRoot.localRotation = Quaternion.Euler(0, 0, cur_angle);};roll_act.OnComplete(() =>{IsRolling = false;onSpinCompleted.Invoke(reward_data);});}void SpinComplete(RewardData rewardData){UIManager.Instance.ShowRewardDialog(rewardData, itemImgs);}private Ease GetEase(){int index = GetSelectLayoutIndex();switch (index){case 2:return Ease.OutBack;case 3:return Ease.OutQuad;case 4:return Ease.OutQuart;case 5:return Ease.OutCubic;case 6:return Ease.OutCirc;case 1:default:return Ease.Linear;}}}}

五、代码链接

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

这篇关于100个 Unity小游戏系列三 -Unity 抽奖游戏专题一 转盘抽奖游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011344

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI