Unity3D 游戏开发应用篇——每日登陆(持久化类实现)

  上一篇中我们实现用本地文件实现了持久化类的保存,当然小型数据用PlayerPrefs存储,或者采用XML服务器持久化也行。因为我涉及的角色类和玩家类数据比较多,加上项目要求尽量少与服务器交互,所以采用了本地持久化。废话不多说,进入主题

一、应用场景

  

  项目要实现这么一个每日登陆的功能,设计如下:

  我们假设每天9点刷新登陆奖励,中断一天则从第一天开始:

  

  初步设想是每日登陆奖励必须有网的情况下才能领取,有网才能更新每天第一次登陆时间,进行服务器验证,之后的登陆时间如果小于一天则不记录。

  然后根据连续登陆天数更新奖励列表。这里第一次登陆时间是持久化保存的。

  如果没有网的情况下使用本地时间更新每天第一次登陆时间,出现如下后果:

  玩家今天只需要多次设定好本地时间,分别为今天,明天,后天的8点,规则却判定一天内有多次第一次登陆,也就是说可以无限刷金币。

  下图可以多次刷金币

  

二、设计思路

  玩家持久化类中增加一个第一次登陆时间属性,规则如下:

  如果没有网,则该属性是一个默认值,永远满足第一天登陆规则:

  如果有网,则该属性被服务器刷新,并且一天内登陆不会被重复刷新:在明天的登陆中才会被刷新,可以满足第二天登陆的奖励:

                                 在明天没有登陆,第三天登陆刷新登陆时间,重置第一天登陆奖励。

三、核心代码

  //有网的情况下,才生成每日登陆奖励预设,可以刷新玩家是持久化类每天第一次登陆时间

  //当然此时的玩家持久化类已经加载,每天第一次登陆时间永远是默认的

 if (DebugUtils.HasConnection())
{
//print(DebugUtils.HasConnection());
Globals.NetWorkAvailable = true;
Instantiate(Login_Reward);
}

  //Login_Reward 的组件脚本

  //更新角色每天第一次登陆时间,然后和上一个第一次登陆时间进行比较,判断更新奖励列表

  //当然我这里写的比较简单,应该还要保证一天内其他登陆时间不会刷新,这里的代码都是初步代码,后期我还会更新


        IEnumerator Start() {
//已经联网的情况下
//服务器更新游戏的角色登陆时间
if (Globals.Me != null && Globals.NetWorkAvailable) {
Nullable<DateTime> pervious = Globals.Me.LoginDateTime;
//wait update
yield return StartCoroutine(Globals.Me.UpdateLoginTime());
Nullable<DateTime> now = Globals.Me.LoginDateTime;
DebugUtils.Assert(now.HasValue&&pervious.HasValue);
//print(now.Value.Second);
Update_Reward();
}
}

  //Update_Reward判断

  //根据两次的第一次登陆来判断是否连续登陆,更新奖励列表

  //if中的主要是一些更新操作

  


        void Update_Reward(Nullable<DateTime> pervious, Nullable<DateTime> now)
{
//if true
//satisfy update reward condition
if (Judge_Update_Reward_Condition())
{
//get the reward level
//这个变量我放在持久化类中
#region
if (!PlayerPrefs.HasKey("Reward_Level"))
{
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
print("first" + PlayerPrefs.GetInt("Reward_Level"));
}
else
{
PlayerPrefs.SetInt("Reward_Level", ((PlayerPrefs.GetInt("Reward_Level") + 1) % 7));
print("then" + PlayerPrefs.GetInt("Reward_Level"));
}
#endregion
//Update Reward
#region
foreach (Transform child in transform)
{
if (child.name.Contains("_")) {
int tmp = PlayerPrefs.GetInt("Reward_Level");
child.GetChild(0).active = (int.Parse(child.name.Split(‘_‘)[0]) == tmp ? true : false);
//print(transform.GetChild(0).name);
if (int.Parse(child.name.Split(‘_‘)[0]) <= tmp)
{
child.GetComponent<ButtonNormal>().OnMouseDown();
}
else {
child.GetComponent<ButtonNormal>().OnMouseUpAsButton();

}
}
}
#endregion
}

}

四、总结

  其实这些持久化类本身最好还是存放在服务器中比较好,后期估计要做一点改动。

  

时间: 2024-08-08 04:32:38

Unity3D 游戏开发应用篇——每日登陆(持久化类实现)的相关文章

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra

【Unity3D游戏开发】—— PlayerPrefs类实现本地持久化数据存储

在很多游戏中都会有"存储进度","读取进度"等菜单,或者当我们进入下一个场景时有些数据需要带入下一个场景.这就需要数据储存.Unity中提供了一个用于本地持久化保存于读取数据的类--PlayerPrefs. 它是以键值对的形式将数据保存在文件中. 下面来看看PlayerPrefs的简单用法.. //得到存储的数据 Grade = PlayerPrefs.GetFloat("mGrade", 0.0f).ToString(); //获取浮点型 Ag

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

第一篇:Unity3d游戏开发之移动端完整包更新方案

由于Unity没法进行热更新,也就是局部更新,所以如果你在设计之前没有考虑好使用Lua,反射,或者其他方式实现热更新,但是又要面临游戏上线那么你可以考虑使用完整包更新,其实这对于游戏包不是很大的情况下,也是一个不错的选择,当然设计者在设计之初都想好了热更新那就宁当别论了. Unity3d 在移动端考虑Android和Ios平台的完整包更新 实现逻辑: 首先检查本地的版本和服务器的版本是否相同,如果相同则直接进入游戏,如果不同则下载服务器的最新文件,然后根据最新文件到资源服务器下载最新的安装包 我

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本

[Unity3D]Unity3D游戏开发之继续探索NGUI

大家好,我是秦元培.欢迎大家关注我的博客.我的博客地址是blog.csdn.net/qinyuanpei. 博主近期開始研究NGUI了,但是说实话,博主感觉NGUI的东西似乎有些分散,由于网上大部分的资料都仅仅是简单地解说怎样使用NGUI,并没有从实质性的原理出发来解说NGUI的内涵,这就和我们学习.NET仅仅会拖控件是一样的.并不能把握事物内在的东西.所以,博主推荐大家从官方提供的样例入手研究NGUI.博主这几天基本上都在看NGUI的演示样例程序,自我感觉内容比較杂吧.在今天的文章中,博主将讲

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者: