Unity 之 月签到累计签到代码实现(ScriptableObject应用 | DoTween入场动画)
Unity 之 实现月签到累计签到
- 一,签到效果
- 二,实现步骤
- 2.1 场景搭建
- 2.2 创建配置
- 2.3 编写代码
- 三,拓展:入场动画
一,签到效果
实现效果:
二,实现步骤
2.1 场景搭建
- 创建Image设计为大背景,作为一级父物体,命名为:SignPanel
- 再SignPanel下再创建一个Image,命名为Context。作为所有签到内容的父物体,并在其上添加’Grid Layout Group’,根据签到内容大小调整其数值即可:
- 再创建一个Image,作为签到内容的背景板,在其下一次创建:Image,Text,Button,Image;分别作为每个签到内容的奖励图片,奖励数量,可领取按钮,已领取图片。此物体将作为签到内容的克隆体。
最终搭建场景如下:
2.2 创建配置
通过ScriptableObject
做一个配置文件,里面存储每日签到的奖励类型和数量。创建代码命名为MonthSignAwardData
,继承修改为ScriptableObject
,并给其添加CreateAssetMenu
编辑器拓展。
完整代码如下:
using System;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(fileName = "MonthSignAwardData", menuName = "GameData/MonthSignAwardData", order = 1)]
public class MonthSignAwardData : ScriptableObject
{public List<AwardItem> awardDataList = new List<AwardItem>();
}[Serializable]
public class AwardItem
{/// <summary>/// 奖励类型 0:金币,1:钻石/// </summary>public CurrencyType awardType;// 奖励数量public int awardCount;
}
创建完成此代码就可以在文件中右键 --> Create --> GameData --> MonthSignAwardData。创建出一个MonthSignAwardData
配置文件,然后手动编辑一下奖励内容就可以了。
PS:我这里为了方便演示后面加载,将配置文件直接存储到Resources文件夹下了。
2.3 编写代码
逻辑也比较简单,通过PlayerPrefs存储一个上次签到日期,存储一个上传签到索引。然后通过上次签到日期和本地日期比较判断今日是否已签到。
完整逻辑如下:
using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;public class MonthSignIn : MonoBehaviour
{[Header("奖励图")][SerializeField] private Sprite[] Spr_AwardSprites;[Header("模版")][SerializeField] private GameObject Obj_Item;[Header("内容父物体")][SerializeField] private Transform Tran_Context;[Header("关闭按钮")][SerializeField] private Button Btn_Close;[Header("内容列表")][SerializeField] private List<SignItem> signList;// 配置文件private MonthSignAwardData _signAwardData;// 上次签到索引private int LastSignIndex{get { return PlayerPrefs.GetInt("CzhenyaGameDataLastSignIndex", 0); }set { PlayerPrefs.SetInt("CzhenyaGameDataLastSignIndex", value); }}// 上次签到日期private string LastSignDate{get { return PlayerPrefs.GetString("CzhenyaGameDataLastSignDate", "yy-MM-dd"); }set { PlayerPrefs.SetString("CzhenyaGameDataLastSignDate", value); }}void Start(){Obj_Item.gameObject.SetActive(false);_signAwardData = Resources.Load<MonthSignAwardData>("MonthSignAwardData");signList = new List<SignItem>();for (int i = 0; i < _signAwardData.awardDataList.Count; i++){Transform itemTrans = Instantiate(Obj_Item, Tran_Context).transform;itemTrans.gameObject.SetActive(true);SignItem signItem = new SignItem();signItem.Img_Context = itemTrans.GetChild(0).GetComponent<Image>();signItem.Text_ContextNum = itemTrans.GetChild(1).GetComponent<Text>();signItem.Btn_Receive = itemTrans.GetChild(2).GetComponent<Button>();signItem.Obj_Mask = itemTrans.GetChild(3).gameObject;signItem.Btn_Receive.onClick.AddListener(OnClickReceive);int awardCount = _signAwardData.awardDataList[i].awardCount;int spriteIndex = (int)_signAwardData.awardDataList[i].awardType;signItem.Img_Context.sprite = Spr_AwardSprites[spriteIndex];//signItem.Img_Context.SetNativeSize();signItem.Text_ContextNum.text = "x" + awardCount;signList.Add(signItem);}Btn_Close.onClick.AddListener(OnClickClose);UpdateSignStatus();}/// <summary>/// 更新签到状态/// </summary>void UpdateSignStatus(){for (int i = 0; i < signList.Count; i++){signList[i].Btn_Receive.gameObject.SetActive(false);signList[i].Obj_Mask.SetActive(i < LastSignIndex);}// 今天没签if (!LastSignDate.Contains(DateTime.Today.ToString("MM/dd/yyyy"))){signList[LastSignIndex].Btn_Receive.gameObject.SetActive(true);}}/// <summary>/// 点击签到 -- 领取签到奖励/// </summary>void OnClickReceive(){int curIndex = LastSignIndex;// todo... 恭喜获得Debug.Log("当前领取id:" + curIndex);if (LastSignIndex >= 27){LastSignIndex = 0;}else{LastSignIndex++;}LastSignDate = DateTime.Today.ToString("MM/dd/yyyy");UpdateSignStatus();}/// <summary>/// 关闭面板/// </summary>void OnClickClose(){gameObject.SetActive(false);}}// 签到内容
public class SignItem
{public Image Img_Context;public Text Text_ContextNum;public Button Btn_Receive;public GameObject Obj_Mask;
}public enum CurrencyType
{/// <summary>/// 金币/// </summary>Gold,/// <summary>/// 钻石/// </summary>Gam,
}
将上面代码挂载到SignPanel
,然后将公开变量挨个赋值:
三,拓展:入场动画
将下面代码添加到MonthSignIn
类中,即可实现开篇看到的入场动画效果:
private void OnEnable()
{PlayDoAni();
}
// 播放进入动画
public void PlayDoAni()
{StartCoroutine(DoAni());
}// 入场动画
IEnumerator DoAni()
{for (int i = 1; i < Tran_Context.childCount; i++){Tran_Context.GetChild(i).gameObject.SetActive(false);}for (int i = 1; i < Tran_Context.childCount; i++){Tran_Context.GetChild(i).gameObject.SetActive(true);Tran_Context.GetChild(i).transform.localScale = Vector3.zero;Tran_Context.GetChild(i).DOScale(Vector3.one, 0.2f).SetEase(Ease.OutBack);if (i % 3 == 0){yield return new WaitForSeconds(0.06f);}}
}
Demo下载地址:https://download.csdn.net/download/Czhenya/87021883
Unity 之 月签到累计签到代码实现(ScriptableObject应用 | DoTween入场动画)相关推荐
- 每日持续签到,累计签到,送积分
一,功能要求 如图: 二,数据表字段: 三,相关代码如下: //签到页面(累计签到) public function signedCount(Request $request){ $user_id = ...
- php签到,ThinkPHP签到代码
ThinkPHP签到代码 发表于 2015-12-13 / 3299 次围观 //PHP签到代码 ,不用考滤几月几日,跨年跨月等情况.有问题可以提出 //控制器 public function sig ...
- 鸿蒙石碎片7个有什么奖励,DNF:新活动累计签到7天史诗礼盒曝光,200个史诗碎片,真香?...
原标题:DNF:新活动累计签到7天史诗礼盒曝光,200个史诗碎片,真香? 11月15日更新的新活动中,大家最关注的一个活动是每日签到得好礼活动,活动是11月15日到12月13日,每天刷两次推荐的地下城 ...
- php 实现每日持续签到,累计签到,送积分
php 实现每日持续签到,累计签到,送积分 地址:https://blog.csdn.net/qq_37462176/article/details/79009800#comments
- python脚本自动qq签到_Python爬虫实现自动登录、签到功能 附代码
这篇文章主要介绍了Python爬虫实现自动登录.签到功能的代码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 前几天在一个素材网站上下载东 ...
- redis实现用户签到以及签到统计
1:数据库实现. 最简单的做法就是创建一个表,专门来存取用户的签到信息. 但是呢,这么做会有一个问题? 用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数 ...
- 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到
技术选型 1,前端 小程序原生MINA框架 css JavaScript Wxml 2,管理后台 云开发Cms内容管理系统 web网页 3,数据后台 小程序云开发 云函数 云开发数据库(基于Mongo ...
- mysql 签到_签到功能,用mysql还是redis?
之前发过一篇:点赞功能用mysql还是redismp.weixin.qq.com ?受到大家喜欢,今天看下签到功能怎么选择? 现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到 ...
- java实现年会微信签到,签到后在大屏中展示,导出签到信息
java实现微信签到,签到后在活动大屏中实时展示签到人信息,也可以导出签到人信息用于抽奖. 一.微信公众号申请及配置 1.微信公众号申请,请参考https://jingyan.baidu.com/ar ...
- 微信公众号签到,签到后在活动大屏中实时展示签到人信息,也可以导出签到人信息用于抽奖
根据公司要求,花2天做了一个微信公众号签到,效果不错,记录一下,以做备忘. 完整项目源码下载 一.微信公众号申请及配置 1.微信公众号申请,请参考https://jingyan.baidu.com/a ...
最新文章
- 删除coredump内容
- 操作系统实验1—实现单处理机下的进程调度程序
- ajax firefox,Jquery ajax不在firefox中工作
- 【bzoj3879】SvT 后缀数组+倍增RMQ+单调栈
- 使用Python计算指定目录md5,根据md5找查到相同的文件并打印
- Codeforces 1291 Round #616 (Div. 2) B
- IDEA 创建 SpringCloud项目-多项目方式
- Jquery实用笔记
- putty的基本使用
- leetcode142. 环形链表 II
- raiserror 在 java_SQL 抛出异常错误信息- RAISERROR (存储过程)
- 一个有趣的例子,JS+CSS实现【兴趣是最好的老师】
- (十)统计表速查(标准正态分布、t分布、卡方分布)
- 启发式算法 Heuristic
- 三种梯度下降的方式:批量梯度下降、小批量梯度下降、随机梯度下降
- 将js预编译熟稔于心
- java long保留两位小数
- 机器学习--贝叶斯网
- Day_04 传智健康项目-预约管理-套餐管理
- 新路由D1 网件R6400 测速
热门文章
- 第二部分 项目管理标准
- linux wrf 系统_linux wrf
- ps3无限服务器连接,[攻略] (转) [分享] PS3常见错误代码及解决办法
- 边境的悍匪—机器学习实战:第三章 分类
- 求总体标准差的置信区间_如何计算置信区间
- python中的join是什么意思_python里join是什么意思
- 双耳节拍 枕头_枕头2-9-0快用完了
- 服务器显示器超分辨率,显示器分辨率超频1080超到2K屏方法
- 用计算机写作文教学难点,《用计算机写作文》教学设计
- CWE-通用弱点枚举简介