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

摘要:
WWWwww=newWWW(GameUrl.Time_Url);=Null){Utils.WriteLog(“UpdateLoginTime”+www.error);MsgBox.Show(“父网络有问题”);Globals.NetWorkAvailable=false;

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

一、应用场景

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

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

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

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

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

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

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

二、设计思路

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

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

  有以下三种情况:

  领取奖励时间为null:

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

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

  逻辑图如下:

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

  

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

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

  二、客户端手动刷新

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

三、核心代码

  //进行联网验证

  

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 = 0; i < tempArray.Length; i++)
        {
            tempArray[i] = tempArray[i].Replace("
", "");
        }
        string year = tempArray[1].Split('=')[1];
        string month = tempArray[2].Split('=')[1];
        string day = tempArray[3].Split('=')[1];
        string hour = tempArray[5].Split('=')[1];
        string minite = tempArray[6].Split('=')[1];
        string second = tempArray[7].Split('=')[1];
        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") + 1) % 7));
                    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('_')[0]) == Reward_Level)
                    {
                       child.GetChild(0).active = true;
                       Set_Refresh(int.Parse(child.name.Split('_')[1]) * 1000, updatetime);
                    }
                    else
                    {
                        child.GetChild(0).active = false;
                    }
                    #endregion

                    //yellow <= Reward_Level
                    //blue > Reward_Level
                    #region
                    if (int.Parse(child.name.Split('_')[0]) <= 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 != 0 && 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 游戏开发应用篇——每日登陆(持久化类实现)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ASP.NET MVC学习笔记(一) 从路由开始创建mvcVue之v-charts单组件封装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python学习之JSON格式的序列化和反序列化

查看json库的方法 import json print("JSON库的主要方法:",json.__all__) ###JSON库的主要方法: ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']dump和dumps的区别 dump是将对象...

Gluster的搭建和使用

Gluster的搭建和使用 序言我们为什么要去使用分布式存储,在一家大型公司或者大规模的集群中,大家可能会经常遇到一个问题,我的数据怎么存放,放在那,数据空间不够了怎么办,这些问题经常困扰着我们。 笔者是在电信的一个部门工作的,我们的环境比较复杂。环境有NAS,各种NFS,还有为了高可用搭建的HA上面跑的共享目录,每次我们遇到的一个最大的问题就是,哪哪哪的...

highcharts配置的效果如下

配置如下: function init(categoryArray,seriesData,month_first_day,month_last_day,currDay){ var chart = Highcharts.chart('container', { chart: { type: 'columnrange...

【转帖】在SQL Server中如何获得刚插入一条新记录的自动ID号

转自http://blog.csdn.net/wangji163163/archive/2008/05/09/2424191.aspx 在SQL Server中如何获得刚插入一条新记录的自动ID号收藏 ---------------------------------------------------------------  使用[IDENT_C...

python与selenium自动化基础-xlrd读取数据,Excel生成报告

代码如下: from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time from log_module import Xlloginfo from userdata import get_webinfo...

ES入门 (7) 语法(5)DQL(2)关键字精确查询/多关键字精确查询/指定查询字段/过滤字段

5 关键字精确查询 term 查询,精确的关键词匹配查询,不对查询条件进行分词。 在 Postman 中,向 ES 服务器发 GET 请求 :http://127.0.0.1:9200/student/_search   服务器响应结果: 6 多关键字精确查询 terms 查询和 term 查询一样,但它允许你指定多值进行匹配。 如果这个字段包含了指...