Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

这篇具有很好参考价值的文章主要介绍了Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近,由于开发需要数据存储服务,就跑去Bmob看看,不看不要紧,发现自己以前创建的应用的数据存储服务居然变成非永久的了,只有一年的免费时间,而且还过期了。这对于我将要开发的软件时很不友好的;因此,我就只能去找与Bmob同类型的后端云服务,就是我接下来要说的leanclound。

需求分析:

1.注册登录功能

2.存储游戏数据

数据包含金币数量、钻石数量和背包道具信息,由于leancloud中不能自己设置主键,为了保证每个用户在数据表中只用唯一一条数据,所以每个用户需要在注册完成后,立即往数据表添加添加一条初始数据而且只能添加一次;

3.排行榜

记录并上传所有用户历史最佳成绩,排行显示

功能实现:

1.注册登录leanclound,新建应用

2.创建class,名字为Gamedate,添加行username(string)、diamond(string)、playeritemsmsg(any),playeritemsmsg是用于存储玩家拥有的道具信息的。

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

3.下载SDK,由于我们只需要存储功能,因此选择下载LeanCloud-SDK-Storage-Unity.ZIP就行了,将解压好的Plugins文件夹直接放置Unity里面就行。

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

4.创建脚本,添加引用,并且在Awake中添加以下代码:

    private void Awake()
    {
        LCApplication.Initialize("你的AppID", "你的AppKey", "你的MasterKey");
    }

这里面的在 AppID这设置里面

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

1.注册功能

    private void LeanCloundSign(string username, string password)
    {
        if (username == string.Empty || password == string.Empty)
        {
            return;
        }
        else
        {
            LCUser user = new LCUser();
            user["username"] = username;
            user["password"] = password;
            user.SignUp().ContinueWith(t =>
            {
                if (t.Exception != null)
                {
                    Debug.Log("用户名已存在");
                }
                else
                {
                    Debug.Log("注册成功");
                }
            });
        }
    }

2.登录功能

    private void LeanCloundLogin(string username, string password)
    {
        var res = LCUser.Login(username, password);
        res.ContinueWith(e =>
        {
            if (e.Exception!=null)
            {
                Debug.Log("登录失败");
            }
            else
            { 
                Debug.Log("登录成功");
            }
           
        });
    }

3.添加玩家初始数据至云数据库,由于我们游戏过程中主要是数据的更新,因此,我们需要在注册完成后立即添加一条初始的数据。

 private void AddPlayerData(string username)
    {
        Player player = new Player();
        string json = JsonUtility.ToJson(player);
        LCObject lc = new LCObject("Gamedate");
        lc["username"] = username;
        lc["diamond"] = 10;
        lc["playeritemsmsg"] = json;
        lc.Save().ContinueWith(e =>
        {
            if (e.Exception != null)
            {
                Debug.Log(e.Exception);
            }
            else
            {
                Debug.Log("上传初始装备数据成功");
            }
        });
    }

4.获取玩家道具信息,在登录完成后,我们就从云数据库拉取一次玩家信息,并赋值给临时的对象来供我们调用,在玩家道具信息发生变更的时候,我们只需要直接更新这个对象,并且将这个更新好的对象传给云端数据库,就可以实现数据同步了。

    private void GetPalyerData(string username)
    {
        LCQuery<LCObject> query = new LCQuery<LCObject>("Gamedate");
        query.WhereEqualTo("username", username);
        query.First().ContinueWith(e =>
        {
            if (e.Exception != null)
            {
                Debug.Log(e.Exception.ToString());
            }
            else
            {
                var res = e.Result;
                JObject json = JObject.Parse(res.ToString());
                player = JsonUtility.FromJson<Player>(json["playeritemsmsg"].ToString());
                foreach (var item in player.ItemMsg)
                {
                    Debug.Log("道具序号:" + item.id + "  拥有数量:" + item.num);
                }
            }

        });
    }

5.更新本地和服务器数据

    public void  UpdatePlayerItemsMsg(int itemid,int count )
    { 
        //更新本地玩家数据
        var item = player.ItemMsg.Where(it => it.id == itemid).FirstOrDefault();
        if (item != null)
        {
            if (count < 0&&item.num<-count)//不允许透支
            {
                return;
            }
            item.num += count;
            if (item.num==0)
            {
                player.ItemMsg.Remove(item);
            }
        }
        else
        {
            if (count>0)
            {
                player.ItemMsg.Add(new PlayItemMsg { id =itemid, num= count });
            }
        }

        foreach (var it in player.ItemMsg)
        {
            Debug.Log("道具序号:" + it.id + "  拥有数量:" + it.num);
        }

        //上传至云数据库
        LCObject lc = LCObject.CreateWithoutData("Gamedate", playerobjectid);
        lc["playeritemsmsg"] = player;
        lc.Save();
    }

6.整合后的脚本大概是这样

using LC.Newtonsoft.Json.Linq;
using LeanCloud;
using LeanCloud.Storage;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;

public class Login : MonoBehaviour  
{
    /// <summary>
    /// 是否登录成功
    /// </summary>
    public static bool isLogin;
    /// <summary>
    /// 登录的账号
    /// </summary>
    public static LCUser _User;
    /// <summary>
    /// 玩家信息
    /// </summary>
    public static Player player;
    /// <summary>
    /// 玩家数据id
    /// </summary>
    public static string  playerobjectid;



    public InputField user;//账号
    public InputField pass;//密码
    public Button sigin;//注册/登录
    public Button tologin;//前往登录
    private bool isLogining;


    private void Awake()
    {
        LCApplication.Initialize("*******", "******", "*******");
        sigin.onClick.AddListener(()=> {
            if (isLogining)
            {
                LeanCloundLogin(user.text,pass.text);
                Debug.Log("登录");
            }
            else
            {
                LeanCloundSign(user.text,pass.text);
                Debug.Log("注册");
            }
        });
        tologin.onClick.AddListener(() =>
        {
            isLogining = true;
            sigin.GetComponentInChildren<Text>().text = "登录";
            tologin.gameObject.SetActive(false);
        });
    }


    /// <summary>
    /// 注册账号
    /// </summary>
    /// <param name="username"></param>
    /// <param name="password"></param>
    private void LeanCloundSign(string username, string password)
    {
        if (username == string.Empty || password == string.Empty)
        {
            return;
        }
        else
        {
            LCUser user = new LCUser();
            user["username"] = username;
            user["password"] = password;
            user.SignUp().ContinueWith(t =>
            {
                if (t.Exception != null)
                {
                    Debug.Log("用户名已存在");///
                }
                else
                {
                    Debug.Log("注册成功");
                    //添加玩家初始数据至数据库
                    AddPlayerData(username);
                }
            });
        }
    }
    /// <summary>
    /// 登录账号
    /// </summary>
    /// <param name="username"></param>
    /// <param name="password"></param>
    private void LeanCloundLogin(string username, string password)
    {
        var res = LCUser.Login(username, password);
        res.ContinueWith(e =>
        {
            if (e.Exception!=null)
            {
                Debug.Log("登录失败");
            }
            else
            {
                isLogin = true;
                _User = e.Result;
                GetPalyerData(e.Result.Username);
                Debug.Log("登录成功");
            }
           
        });
    }
    /// <summary>
    /// 添加玩家初始数据至云数据库
    /// </summary>
    /// <param name="username"></param>
    private void AddPlayerData(string username)
    {
        Player player = new Player();
        string json = JsonUtility.ToJson(player);
        LCObject lc = new LCObject("Gamedate");
        lc["username"] = username;
        lc["diamond"] = 10;
        lc["playeritemsmsg"] = json;
        lc.Save().ContinueWith(e =>
        {
            if (e.Exception != null)
            {
                Debug.Log(e.Exception);
            }
            else
            {
                Debug.Log("上传初始装备数据成功");
            }
        });
    }
    /// <summary>
    /// 获取玩家装备信息
    /// </summary>
    /// <param name="username"></param>
    private void GetPalyerData(string username)
    {
        LCQuery<LCObject> query = new LCQuery<LCObject>("Gamedate");
        query.WhereEqualTo("username", username);
        query.First().ContinueWith(e =>
        {
            if (e.Exception != null)
            {
                Debug.Log(e.Exception.ToString());
            }
            else
            {
                var res = e.Result;
                JObject json = JObject.Parse(res.ToString());
                player = JsonUtility.FromJson<Player>(json["playeritemsmsg"].ToString());
                foreach (var item in player.ItemMsg)
                {
                    Debug.Log("道具序号:" + item.id + "  拥有数量:" + item.num);
                }
                playerobjectid = json["objectId"].ToString();
            }

        });
    }
    /// <summary>
    /// 更新本地和服务器数据
    /// </summary>
    /// <param name="itemid"></param>
    /// <param name="count"></param>
    public void  UpdatePlayerItemsMsg(int itemid,int count )
    { 
        //更新本地玩家数据
        var item = player.ItemMsg.Where(it => it.id == itemid).FirstOrDefault();
        if (item != null)
        {
            if (count < 0&&item.num<-count)//不允许透支
            {
                return;
            }
            item.num += count;
            if (item.num==0)
            {
                player.ItemMsg.Remove(item);
            }
        }
        else
        {
            if (count>0)
            {
                player.ItemMsg.Add(new PlayItemMsg { id =itemid, num= count });
            }
        }

        foreach (var it in player.ItemMsg)
        {
            Debug.Log("道具序号:" + it.id + "  拥有数量:" + it.num);
        }

        //上传至云数据库
        LCObject lc = LCObject.CreateWithoutData("Gamedate", playerobjectid);
        lc["playeritemsmsg"] = player;
        lc.Save();
    }
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            int id = Random.Range(1, 15);
            int num = Random.Range(-5, 6);
            //随机增加或减少道具序号为id的数量num
            UpdatePlayerItemsMsg(id, num);
        }
    }

}
[System.Serializable]
public class Player
{
    public string name;
    public List<PlayItemMsg> ItemMsg;
    public Player()//初始信息
    {
        name = "法外狂徒";
        ItemMsg = new List<PlayItemMsg>() {
            new PlayItemMsg() { id = 1, num = 1 },
            new PlayItemMsg() { id = 2, num = 1 },
            new PlayItemMsg() { id = 27, num = 1 },
            new PlayItemMsg() { id = 3, num = 10 },
            new PlayItemMsg() { id = 4, num = 20 }
        };
    }
}
//玩家拥有装备信息
[System.Serializable]
public class PlayItemMsg
{
    public int id;
    public int num;
}

运行结果:

 Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

改变道具数量:

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

 至此,与云端数据库的通讯就算是完成了,接下来制作一个背包让道具信息更直观的显示出来了,还有就是排行榜的实现,以及AB包的制作、上传、下载和读取等,由于篇幅问题,这些将在下篇文章中介绍。文章来源地址https://www.toymoban.com/news/detail-422985.html

到了这里,关于Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D实现MySql数据库登录与注册功能

    1、界面布局如下: 2、界面控件 1、封装MySql 2、编写登录、注册功能脚本 挂载LoginPanel脚本,并将控件映射到公共属性如下: 有问题请指出,谢谢!

    2024年02月11日
    浏览(53)
  • Android开发----实现登录注册页面(创建本地数据库,对注册的账户密码进行存储)

    写在前面: 本文实现了登录注册页面的开发,创建了本地数据库,存储注册的账户密码。注册账户为手机号,对账户为手机号进行了正则化验证。登录成功跳转至主页面。 20221028-实现登录注册功能 首先说一下,项目部署是在原有项目新建两个activity( 项目右键–new–activi

    2024年02月03日
    浏览(45)
  • dfinity开发——使用互联网身份(internet identity)登录

    1.Internet Identity是由ICP支持的匿名区块链认证框架。用户可以创建自己的身份“锚”,将兼容的加密设备分配写入到当前设备,如笔记本电脑上的指纹传感器、手机上的面部识别系统,或便携式HSM,如YubiKey或Ledger钱包。然后,用户可以使用分配给他们的身份锚设备,注册验证

    2024年02月02日
    浏览(37)
  • Java实现简单的登录,注册拼图游戏

    1.登录页面 点击验证码可更换验证码,点击查看密码可查看输入的密码 2.注册界面 点击注册即可以新用户身份进入游戏 注: 初始用户信息为 用户名:hangman 密码:123456 点击重置即可重新输入密码账号重新注册 3.游戏界面 按下键盘上下左右即可进行移动操作并计算移动的步数.

    2024年02月09日
    浏览(32)
  • Unity实现账号登录,注册功能

    制作了用户登录界面  关于弹窗使用了DOTween插件,实现渐隐渐显效果。 关于账号使用了本地Json读取, 默认账号:YSQS/YSQS1 密码:admin/admin1 注册功能其实应该重构的因为有二次读流的问题存在。 账号注册加入了邀请码(其实就一个if)  接下来就是我那臭死了的源码。 GameSt

    2024年02月11日
    浏览(37)
  • Unity实现登录/注册/审核功能

    2024年01月23日
    浏览(40)
  • [游戏开发][Unity]宏定义的使用

    第一种#if 与#endif写法 第二种 #if #else #endif写法 ,支持逻辑运算符! 第三种 #if #elif #endif写法 C#代码判定平台 Unity支持的平台#define指令如下: 属性: 功能: UNITY_EDITOR 从游戏代码调用Unity编辑器脚本的#define指令。 UNITY_EDITOR_WIN Windows上编辑器代码的#define指令。 UNITY_EDITOR_OSX

    2024年03月15日
    浏览(38)
  • 使用jsp、HttpServlet完成一个登录、注册,并用MySQL连接数据进行操作

    这两个是写数据库的软件。  启动MySQL对应的版本型号。 user表 1.判断存在(有没有login的数据库,有就删掉)即删除。 DROP DATABASE IF EXISTS login; 2.创建数据库,使用数据库  #创建数据库 CREATE DATABASE login; #使用数据库 use login; 3.创建一个表我们这定义叫user,给表增添3条数据 #创

    2024年02月04日
    浏览(45)
  • 【Unity 框架】QFramework v1.0 使用指南 工具篇:05. ResKit 资源管理&开发解决方案 | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    Res Kit,是资源管理快速开发解决方案 特性如下: 可以使用一个 API 从 dataPath、Resources、StreammingAssetPath、PersistentDataPath、网络等地方加载资源。 基于引用计数,简化资源加载和卸载。 拥抱游戏开发流程中的不同阶段 开发阶段不用打 AB 直接从 dataPath 加载。 测试阶段支持只需打

    2024年02月01日
    浏览(50)
  • 【Unity 框架】QFramework v1.0 使用指南 架构篇:03. 引入 Command | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏

    我们回顾一下目前的代码,如下; 现在,数据共享的问题通过 引入 Model 解决了。 这里再次强调一下,需要共享的数据放 Model 里,不需要共享的,能不放就不放。 虽然引入了 Model,但是这套代码随着项目规模的发展还是有很多的问题。 其中最严重也最常见的就是 Controller

    2024年02月06日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包