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

一、应用场景

  

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

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

  

  初步设想是每日登陆奖励必须有网的情况下才能领取,通过服务器逻辑验证上一次领取时间和登陆时间,产生对应的奖励界面。

  至于领取时间可以采用服务器自动刷新和玩家手动刷新,这里我选择了手动刷新。

  注意,最好不要采用本地时间为基准。

二、设计思路

  玩家持久化类中增加一个领取奖励时间变量,规则如下:

  在每次登陆游戏联网的时候得到服务器的标准网络时间,和上一次的领取奖励时间进行逻辑判断。

  有以下三种情况:

  领取奖励时间为null:

  领取奖励时间和联网验证时间在同一天:

  领取奖励时间和联网验证时间不在同一天:

  逻辑图如下:

  

  

  至于领取时间刷新,则如下图所示有两种情况:

  一、服务器判断逻辑之后自动给客户端刷新

  二、客户端手动刷新

  

三、核心代码

  //进行联网验证

  

if (DebugUtils.HasConnection() && Globals.Me != null)
{ Globals.NetWorkAvailable = true;
//请求服务器刷新
StartCoroutine(UpdateLoginTime());
} public IEnumerator UpdateLoginTime()
{
Debug.Log("privious time is " + Globals.Me.LoginDateTime);
if (!Globals.NetWorkAvailable)
yield break; WWW www = new WWW(GameUrl.Time_Url);
yield return www;
//有错误
#region
if (www.error != null)
{
Utils.WriteLog("UpdateLoginTime" + www.error);
MsgBox.Show("亲 网络有问题哦");
Globals.NetWorkAvailable = false;
}
#endregion
else
{
//解析网络时间
#region
string[] tempArray = www.text.Split(';');
for (int i = ; i < tempArray.Length; i++)
{
tempArray[i] = tempArray[i].Replace("\r\n", "");
}
string year = tempArray[].Split('=')[];
string month = tempArray[].Split('=')[];
string day = tempArray[].Split('=')[];
string hour = tempArray[].Split('=')[];
string minite = tempArray[].Split('=')[];
string second = tempArray[].Split('=')[];
DateTime tmp = DateTime.Parse(year + "-" + month + "-" + day + " " + hour + ":" + minite + ":" + second);
#endregion
Debug.Log("update time" + tmp);
//第一次更新
//这里是服务器逻辑判断
#region
if (Globals.Me.LoginDateTime == null)
{
//调用第一天第一次奖励
if (!PlayerPrefs.HasKey("Reward_Level")){
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
Debug.Log("first" + PlayerPrefs.GetInt("Reward_Level"));
}
else {
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
Debug.Log("first" + PlayerPrefs.GetInt("Reward_Level"));
}
Create_Login_Reward(tmp);
}
#endregion
//不是第一次
else {
//不是同一天更新
#region
if (!isSameDay(tmp))
{
//是连续更新
#region
if (isContinue(tmp))
{
PlayerPrefs.SetInt("Reward_Level", ((PlayerPrefs.GetInt("Reward_Level") + ) % ));
Debug.Log("then" + PlayerPrefs.GetInt("Reward_Level"));
}
#endregion
//不是连续更新
#region
else
{
//调用第一天奖励
PlayerPrefs.SetInt("Reward_Level", (int)(Login_Kind.FirstDay));
Debug.Log("Reset" + PlayerPrefs.GetInt("Reward_Level"));
}
#endregion Create_Login_Reward(tmp);
}
#endregion
//同一天
#region
else
{
Create_Normal();
}
#endregion }
}
}

  //根据联网的服务器逻辑产生对应的奖励列表

 //satisfy update reward condition
//called by other
public void Update_Reward(DateTime updatetime)
{ #region
foreach (Transform child in transform)
{
if (child.name.Contains("_"))
{
int Reward_Level = PlayerPrefs.GetInt("Reward_Level");
//check Reward_Level day
#region
if (int.Parse(child.name.Split('_')[]) == Reward_Level)
{
child.GetChild().active = true;
Set_Refresh(int.Parse(child.name.Split('_')[]) * , updatetime);
}
else
{
child.GetChild().active = false;
}
#endregion //yellow <= Reward_Level
//blue > Reward_Level
#region
if (int.Parse(child.name.Split('_')[]) <= Reward_Level)
{
//yellow
child.GetComponent<ButtonNormal>().OnMouseDown();
}
else
{
//blue
child.GetComponent<ButtonNormal>().OnMouseUpAsButton();
}
#endregion
}
}
#endregion
} public void Set_Refresh(int Add_Number,DateTime RefreshDateTime) {
UI_Get_LoginReword tmp = transform.Find("Get").GetComponent<UI_Get_LoginReword>();
tmp.Add_Number = Add_Number;
tmp.RefreshDateTime = RefreshDateTime;
}

  //采用手动刷新 这里是按下领取奖励按钮之后

public void OnMouseUpAsButton()
{ //print("you enter is " + transform.name);
base.OnMouseUpAsButton(); if (Add_Number != && RefreshDateTime!=DateTime.MinValue) {
//print(Add_Number + "add is ");
//Globals.Me.LoginDateTime = new Nullable<DateTime>(currentTime);
Globals.Me.LoginDateTime = RefreshDateTime;
print("RefreshDateTime is " + Globals.Me.LoginDateTime);
Globals.Me.Gold_Number += Add_Number;
}
}

四、总结

  这里把服务器逻辑放在本地,其实应该放在服务器上的,后期可以考虑采用服务器判断。

  

  

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

  1. 【Unity3D游戏开发】之全局管理类的几种方式 (十六)

    如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...

  2. unity3D游戏开发之详解Animation类和Animator类

    详解Animator类和Animation类 链接: http://wenku.baidu.com/link?url=SiaUYcdrNYjOYrWVDJSKGAYdJOntMTOhsVJtyBk2i ...

  3. [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读

    ---------------------------------------------------------------------------------------------------- ...

  4. NHibernate 之持久化类、拦截器 (第二篇)

    一.持久化类中成员标量的要求 作为被NHibernate使用的持久化类,必须满足以下几点要求: 1.声明读写属性 在NHibernate的使用中,持久化类的成员变量必须声明对应的属性,NHiberna ...

  5. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  6. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    ---------------------------------------------------------------------------------------------------- ...

  7. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

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

    大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3 ...

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

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. UI2_ButtonChess

    // // AppDelegate.m // UI2_ButtonChess // // Created by zhangxueming on 15/6/30. // Copyright (c) 20 ...

  2. MongoDB中的group

    在Mongodb的查询中,有类似于SQL中group by功能的group函数.两者的功能有些类似,但是区别也是比较明显的. 对于SQL来说,group by的作用就是安装依据列来将数据表中的记录分成 ...

  3. HDU1106 排序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1106   Problem Description 输入一行数字,如果我们把这行数字中的‘5’都看成空格 ...

  4. copy con

      在DOS系统中,一些计算机设备也有文件名,叫做设备文件,可以用对应的文件名来操作它.后来的WINDOWS也保留了这些设备文件.比如con表示console(控制台,简单的说就是键盘和屏幕),com ...

  5. sicily 1027 MJ, Nowhere to Hide 字符串匹配与排序

    1027. MJ, Nowhere to Hide Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description On BBS, th ...

  6. 内核中读取UTC时间

        记录这个知识点的原因是因为项目中需要保存充电日志,因此,趁着这个机会,深入了解一下Linux的时间系统. UTC:(Universal Time Coordinated) 协调世界时的缩写   ...

  7. Vim保存文件命令 ":wq" 与 ":x" 的区别

    CSDN转载 [1] Vim是Unix/Linux系统最常用的编辑器之一,在保存文件时,我通常选择":wq",因为最开始学习vim的时候,就只记住了几个常用的命令:也没有细究命令的 ...

  8. sql模糊查询

    SQL 模糊查询 在进行数据库查询时,有完整查询和模糊查询之分. 一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: ...

  9. 《shell脚本if..then..elif..then.if语句的总结》

    第一种: #!/bin/bash service vsftpd start &> /dev/null if [ $? -eq 0 ] then echo "ftp is sta ...

  10. WinDbg 调试.net程序

    WinDbg支持以下三种类型的命令: ·        常规命令,用来调试进程 ·        点命令,用来控制调试器 ·        扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...