为 Unity 游戏添加 LeanCloud 后端服务

发表于2015-07-15
评论1 1.2k浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594
伴随着 unity 蒸蒸日上的前进势头,以及向来冷艳傲娇格调高的 暴雪 都采用 unity3d 来制作魔兽嫡系卡牌游戏 炉石传说 ,如此看,Unity 在 3D 市场上是得到了业界「九袋长老」的认可的,既然 Unity 表现的如此高大上,那么同样与时俱进的 LeanCloud 怎会不与 Unity 共舞一曲《天仙配》呢?

2014 年 5 月,LeanCloud 已经正式发布了 LeanCloud Unity SDK, 相关下载以及文档请用力猛戳:LeanCloud Unity 指南 。
当然本文的主题依然是帮助
正在寻找后端解决方案,或者要为现有 Unity 的游戏添加后端服务模块的开发者们

解决你们一切的 后端之忧




2014 年年初,一款神奇的游戏「Flappy Bird」震惊了手游届,这款游戏最大的特点就是——让广大普通青年和特殊青年发现了自己的手残倾向。

假如现在用 Unity 重写了一版「Flappy Bird」,我想实现比原版多几个功能:

记录用户打开游戏的时间
记录用户每一局游戏的时长
记录用户每一局点击屏幕的次数
记录用户每次关闭游戏前,总共玩过的局数
记录每一局获取的分数
这样的话,游戏开发者可以有效的根据统计信息随时跟进用户的刚性需求,因为只要使用了 LeanCloud 的服务,所有的统计数据都可以在我们的站点进行查询,并且我们已经推出了面向开发者的 LeanCloud 统计分析移动客户端 已经上线,不出家门,不开电脑,拿出手机,查看自己的游戏的统计信息,是不是听起来就很带感呢?

很庆幸,我们不需要重头开始书写「Flappy Bird」的 Unity 版的源代码,在 GitHub 上随便搜就能看见很多可以直接编译运行的。比如笔者随便找了一位来自开挂国家印度的程序员写的一版:coppra/flappy_bird(虽未经授权,不过笔者貌似也没有违反相关授权)
这个版本代码很简洁,很适合做范例,请注意: 本文不是来班门弄斧教各位 Unity 大神如何实现游戏的各种功能和需求,本文旨在帮助 Unity 的大神从数据服务中解脱出来,把更多的激情释放在如何使用 Unity 做出更加酷炫的游戏页面

接下来,如何使用 LeanCloud 轻松搞定以上 5 项需求呢?

初始化 SDK
诸位看官先把刚才提到的 coppra/flappy_bird 这个项目的代码 下载 下来。

1.打开 flappy_bird-masterflappy_bird-masterAssetsScenes 目录下的 one.unity(当然,在进行教程之前必须先安装 Unity)。
2.然后按照 LeanCloud Unity 快速入门 逐步导入 Unity SDK。(这一步很重要后面的教程都与之相关
3.确保 AppID 以及 AppKey 已填写正确。

功能实现

记录用户打开游戏的时间
很高兴的告诉您,只要您在我们的站点上设置了打开 数据统计 这一项功能,游戏在被打开的时候就已经被记录,并且会按照设定的 策略 进行发送到服务端,所以第一项功能已经在 SDK 的层级帮您完成了,怎么样,是不是很性感?(人生苦短,必须性感)

记录用户每一局游戏的时长
1.找到 Assets/noxsss/GameManager.cs,双击在编译器中打开,笔者用的是微软的 Visaul Studio 2013 作为 Unity 辅助开发工具。
2.在 Update 方法中使其代码如下:

[C#] 纯文本查看 复制代码
void Update()
{
if (!gameStart)
{
if (Input.GetMouseButtonDown(0))
{
AVAnalytics.StartEvent("OneGame", new Dictionary<string, object>
{
{"startSilgelGameTime",DateTime.UtcNow.ToString()}
});//记录玩家点击屏幕游戏开始的时间。
gameStart = true;
}
}
if (gameStart)
if (Input.GetKeyUp(KeyCode.Escape))
{
Application.Quit();
}
}


1.然后切换到 bird.cs 中,添加结束 OneGame 这个自定义事件的方法:
[C#] 纯文本查看 复制代码
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "scoreMaker")
{
GameManager.score += 1;
Destroy(other.gameObject);
}
else
{
AVAnalytics.StopEvent("OneGame");//本局结束,只要调用一下事件终止方法,SDK会自动计算开始到结束之间的间隔发送到服务端。
gameObject.collider2D.isTrigger = false;
AudioSource.PlayClipAtPoint(hit, Camera.main.transform.position);
if (GameManager.score > PlayerPrefs.GetInt("highscore"))
{
guiManager.medal = true;
}
GameManager.gameOver = true;
}
}


以上添加的 2 条语句,就完成了一个客户端自定事件记录,如此做,在我们的站点后台就能查看到这个事件的统计数据。

记录用户每一局点击屏幕的次数
同样还是在 bird.cs 下,在 32 行的 Update() 的方法内部,添加如下一行代码足矣:

[C#] 纯文本查看 复制代码
if ((Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) && !GameManager.gameOver && GameManager.gameStart)
{
AVAnalytics.TrackEvent("Tap");//记录用户点击,无需其他参数
rigidbody2D.velocity = new Vector2(0f, upForce);
}


记录用户每次关闭游戏前,总共玩过的局数
切回 GameManager.cs,为它添加一个静态属性,用来记录一次会话中,玩家总共玩过的局数。

[C#] 纯文本查看 复制代码
public static int totalGames = 0;


然后将 Update() 方法改为如下:
[C#] 纯文本查看 复制代码
void Update()
{
if (!gameStart)
{
if (Input.GetMouseButtonDown(0))
{
AVAnalytics.StartEvent("OneGame", new Dictionary<string, object>
{
{"startSilgelGameTime",DateTime.UtcNow.ToString()}
});//记录玩家点击屏幕游戏开始的时间。
gameStart = true;
totalGames++;
}
}
if (gameStart)
if (Input.GetKeyUp(KeyCode.Escape))
{
AVAnalytics.TrackEvent("QuitGame", new Dictionary<string, object>
{
{"totalGames",totalGames}
});
Application.Quit();
}
}


也只是多了 2 条语句就完成了这一个功能。

记录每一句获取的分数
这个可能是所有游戏最核心的一部分了,在如今社交碎片化的年代,你打个飞机都得让好友知道你打得多么高的分数,把分数记录在一个 稳定的,可靠的,存取速度快的 的服务端,是多么重要的一件事情,那么这个功能就得用到 AVOS Cloud 最基本的数据存储功能。

打开 bird.cs,在 OnTriggerEnter2D 中继续添加代码,在发生小鸟撞击水管的语句块中添加如下代码:

[C#] 纯文本查看 复制代码
#region 把这次的分数记录到AVOS Cloud的服务端
AVObject gameScore = new AVObject("GameScore");//创建一个GameScore对象
gameScore["score"] = GameManager.score;//将分数记录下来
gameScore["playerName"] = "DemoUser";//标记一下用户,这里写死只做示意
gameScore["deviceID"] = SystemInfo.deviceUniqueIdentifier;//顺便利用Unity的API
gameScore.SaveAsync();
#endregion


使 OnTriggerEnter2D 整体变成如下:
[C#] 纯文本查看 复制代码
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "scoreMaker")
{
GameManager.score += 1;
Destroy(other.gameObject);
}
else
{
AVAnalytics.StopEvent("OneGame");//本局结束,只要调用一下事件终止方法,SDK会自动计算开始到结束之间的间隔发送到服务端。
#region 把这次的分数记录到AVOS Cloud的服务端
AVObject gameScore = new AVObject("GameScore");
gameScore["score"] = GameManager.score;
gameScore["playerName"] = "DemoUser";
gameScore["deviceID"] = SystemInfo.deviceUniqueIdentifier;
gameScore.SaveAsync();
#endregion
gameObject.collider2D.isTrigger = false;
AudioSource.PlayClipAtPoint(hit, Camera.main.transform.position);
if (GameManager.score > PlayerPrefs.GetInt("highscore"))
{
guiManager.medal = true;
}
GameManager.gameOver = true;
}
}


结语
通过以上这些添加的代码,总共不超过 20 行,就实现了这些数据从本地到服务端的存取。

LeanCloud 一直致力于提高开发体验,提供稳定,快速,轻而足量的云服务。Unity 是我们比较看重的一块市场,在 3D 以及跨平台双重优势下,Unity 必将能挑战游戏引擎在 Mobile 市场霸主地位。

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台