为 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 方法完成更新,那假若程序销毁重新打开之后,如何更新数据呢?

    回复

发表评论

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