为 Unity 游戏添加 AVOS Cloud 后端服务

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

2014 年 5 月,AVOS Cloud 已经正式发布了 AVOS Cloud Unity SDK, 相关下载以及文档请用力猛戳:AVOS Cloud Unity 指南
当然本文的主题依然是帮助

正在寻找后端解决方案,或者要为现有 Unity 的游戏添加后端服务模块的开发者们

解决你们一切的后端之忧

blog_image_wangbaoqian

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

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

  • 记录用户打开游戏的时间
  • 记录用户每一局游戏的时长
  • 记录用户每一局点击屏幕的次数
  • 记录用户每次关闭游戏前,总共玩过的局数
  • 记录每一局获取的分数

这样的话,游戏开发者可以有效的根据统计信息随时跟进用户的刚性需求,因为只要使用了 AVOS Cloud 的服务,所有的统计数据都可以在我们的站点进行查询,并且我们已经推出了面向开发者的 AVOS Cloud 统计分析移动客户端已经上线,不出家门,不开电脑,拿出手机,查看自己的游戏的统计信息,是不是听起来就很带感呢?

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

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

初始化 SDK

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

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

功能实现

记录用户打开游戏的时间

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

记录用户每一局游戏的时长

  1. 找到 Assets/Scripts/GameManager.cs,双击在编译器中打开,笔者用的是微软的 Visaul Studio 2013 作为 Unity 辅助开发工具。
  2. Update 方法中使其代码如下:
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 这个自定义事件的方法:
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()的方法内部,添加如下一行代码足矣:

 if ((Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) && !GameManager.gameOver && GameManager.gameStart)
        {
            AVAnalytics.TrackEvent("Tap");//记录用户点击,无需其他参数
            rigidbody2D.velocity = new Vector2(0f, upForce);
        }

记录用户每次关闭游戏前,总共玩过的局数

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

public static int totalGames = 0;

然后将 Update()方法改为如下:

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 中继续添加代码,在发生小鸟撞击水管的语句块中添加如下代码:

#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 整体变成如下:

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 行,就实现了这些数据从本地到服务端的存取。

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

为 Unity 游戏添加 AVOS Cloud 后端服务》上有3条评论

  1. Pingback引用通告: 2014 年 6 月份第三周更新总结 | AVOS Cloud Blog

  2. lofei

    很赞的产品。教程也很简洁明了。使用起来很棒。但是还是有个小小的问题:
    在更新数据时,示例里是运行期间两次调用 SaveAsync 方法完成更新,那假若程序销毁重新打开之后,如何更新数据呢?

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注