2014 年 1 月 22 日
新插件合作伙伴:GameAnalytics 介绍
我们很自豪地宣布一个新的 Corona 插件合作伙伴:GameAnalytics!
本文由 GameAnalytics 的软件工程师安娜玛丽亚·托多尔撰写。她专注于与客户保持密切对话,并确保产品满足他们的需求。安娜玛丽亚曾担任编辑,曾花数年时间评论和对 3A 级游戏进行文化分析。安娜本科就读于文化研究和软件工程专业,她目前正在为哥本哈根大学计算机科学(数字互动娱乐方向)硕士课程撰写关于推荐系统的硕士论文。
在昏暗的房间里,一声天意的点击突然打破了寂静。那是最后一次提交代码库的响亮宣告。各地的程序员都如释重负地叹息着,因为他们看到了自己的“孩子”,那个他们花了六个多月时间开发的、即将诞生的游戏。它将变得独立,超越他们的创造者,最重要的是,让那些创造者重获新生。
真的是这样吗?如果您认为您与刚刚开发的游戏的联系会随着发布时间的临近而中断,那就再想想吧。这是开发的诅咒,被困在开发者炼狱中。坚持用“孩子”的比喻,在临近发布时,您的游戏就像一个叛逆的青少年,您需要了解它才能回到正轨。闭上眼睛,祈祷不会让情况好转,肯定也不会让它卖得出去,无论这个想法和“基因”有多么伟大。要让您的游戏扭转局面,您需要事实,您需要数据,您需要行动。总而言之,这就是 GameAnalytics 的全部意义所在;改善您的数字育儿。
那么,我们到底是谁呢?
GameAnalytics 是一项完全免费的在线服务,专为想要更好地了解自己的游戏,并且也想知道如何更好地了解自己游戏的开发者而创建。通过将 GameAnalytics 与您的游戏数据绑定,您可以通过参考基本自动生成的行业标准指标(例如 DAU、MAU、ARPPU、ARPDAU 等),立即了解您的游戏表现。如果这些首字母缩写词对您来说像象形文字,无需担心。我们在我们的博客和我们全面的支持论坛上都解释了所有内容。
投入更多时间进行集成,您可以依靠 GameAnalytics 来调整玩家体验的各个方面,从教程流程到游戏内物品价格、关卡计时器和难度。GameAnalytics 还可以通过其简约、可自定义的仪表板和有针对性的电子邮件报告,成为团队的体验。集成范围的定义完全由您决定。
当然,如果没有任何充分的理由,我们不会出现在这个博客上,因此我很高兴地宣布 GameAnalytics 现在也是 Corona 的官方合作伙伴(我们有自己的插件部分)。这意味着现在只需几分钟即可将您使用 Corona 开发的游戏设置为 GameAnalytics。此外,官方插件利用了 Corona 的一些独特功能,并且能够自动跟踪
- 系统信息
- 平均和临界 FPS
- 错误堆栈跟踪
- 内存警告(仅限 iOS)
- 故事板场景更改
但我不是来推销的;我是来展示和讲述的。如果您想了解有关 GameAnalytics 功能的更多详细信息,请访问此链接。否则...
如果您想放松一下,可以观看此视频,其中介绍了如何设置 GameAnalytics 并将其集成到 Corona 提供的示例应用程序之一中。
或者
您可以阅读下面的 GameAnalytics 设置演练,其中充满了复制粘贴的代码等内容。如果您问我,这是最好的学习方式...
让我们开始吧
要开始使用 GameAnalytics,您首先需要确保已在该服务中注册。您可以直接在 GameAnalytics 网站上注册,之后系统会提示您创建一个工作室和一个逻辑游戏实体。这些对于您开始向我们发送数据是绝对必要的,因为它们为您提供了一个用于您的游戏的唯一标识符(游戏密钥)和您自己的加密密钥,以确保没有人可以拦截和理解您的数据(秘密密钥)。这是我的 Corona 游戏实体以及附加密钥的屏幕截图
示例
基础知识
尽管我们很想用最棒的将 GameAnalytics 集成到实时 Corona 游戏中的例子来让您惊艳,但可用的开源示例有点过时,不具有真正的教育价值。此外,它们不如 Corona 自带的示例应用程序那么容易访问。
因此,为了说明 GameAnalytics 的强大功能,我们选择了 SampleCode / Physics / SimplePool 目录中提供的 SimplePool 示例。
要在您的游戏中使用 GameAnalytics,首先修改项目的 build.settings 文件,在“settings”下包含以下行
1 2 3 4 5 6 7 8 9 |
plugins = { ["plugin.gameanalytics"] = { publisherId = "com.gameanalytics", }, }, |
完整的 SimplePool build.settings 文件如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
settings = { orientation = { default = "portrait", supported = { "portrait" } }, plugins = { ["plugin.gameanalytics"] = { publisherId = "com.gameanalytics", }, }, iphone = { plist = { CFBundleIconFile = "Icon.png", CFBundleIconFiles = { "Icon.png", "Icon-72.png", }, }, }, } |
接下来,通过在代码中要求 GameAnalytics 包,然后使用您相应的游戏密钥和秘密密钥以及所需的构建号初始化它,来配置应用程序以使用 GameAnalytics 包。对于这个特定的游戏,这意味着我必须在物理初始化下方添加以下代码
1 2 3 4 5 6 7 8 9 10 11 |
local physics = require("physics") local GA = require "plugin.gameanalytics" GA.init ( { game_key = '797e949fd13cf58ef1a98255bf9345825', secret_key = '64b58b4f0de247c61a9df9121d970d93f8cd3f09', build_name = "0.1", } ) physics.start() |
信不信由你,就这么简单。你已经可以检查 GameAnalytics 包是否正常工作并将数据正确发送到服务器了。为此,请启用调试模式,设置允许应用程序从模拟器发送信息的选项,并启用系统信息的提交。请不要忘记,您必须在初始化 SDK 之前设置所有这些标志
1 2 3 4 5 6 7 8 9 10 11 |
local GA = require "plugin.gameanalytics" GA.isDebug = true GA.runInSimulator = true GA.submitSystemInfo = true GA.init ( { game_key = '97e949fd13cf58ef1a98255bf9345825', secret_key = '64b58b4f0de247c61a9df9121d970d93f8cd3f09', build_name = "0.1", } ) |
您可以在模拟器和实际设备上查看调试日志。对于 Mac,请使用 Applications/CoronaSDK 文件夹中的“corona-terminal”应用程序启动 Corona SDK,然后打开您的应用程序。在 PC 上,Corona SDK 将为您启动一个 cmd shell 屏幕。打印消息将自动显示在那里。
例如,这是我在 Mac OSX 上的终端窗口
这表明 GameAnalytics 插件已正确初始化。
此处的屏幕截图中的 {“status”:”ok”} 消息表明服务器正在正确接收消息。
当然,一旦消息成功提交到 GameAnalytics 服务器,您也可以在 GameAnalytics 工具的实时选项卡中查看它们
一些高级行为
现在您知道 GameAnalytics 实际上可以工作了,让我们让跟踪更有趣一些。假设您还想通过查看平均 FPS 来跟踪应用程序的实际性能。在初始化 GameAnalytics SDK 之前添加以下设置,以每 10 秒发送一次 FPS 数据
GA.submitAverageFps = true
GA.submitAverageFpsInterval = 10
在终端中,您可以看到事件确实每 10 秒发送一次
这是您在质量仪表板中获得的结果
目前为止还不错。让我们自定义一下!
为此,我们需要查看实际 SimplePool 应用程序的结构。
该应用程序由以下几个部分组成
一个启动画面,可让您选择玩单人或双人游戏以及访问游戏选项
一个选项屏幕,可让您更改台球桌的颜色
实际的游戏屏幕,它是您经典的台球游戏。
这是一个相当简单的应用程序,但仍然有很多有趣的方面可以使用一些跟踪。例如,我们想知道
1. 玩家更喜欢单人还是双人比赛?
这将帮助您了解您的游戏在哪里表现出色:是更好的单人游戏体验还是多人游戏体验?要回答这个问题,您可以创建以下事件层次结构
GameLaunched:onePlayer
GameLaunched:twoPlayer
要将其放入 GameAnalytics 工具中,您可以将以下代码插入 init() 函数中
1 2 3 4 5 6 7 8 9 10 11 |
if mode == onePlayer or mode == twoPlayer then if mode == onePlayer then GA.newEvent ( "design", { event_id = "GameLaunched:onePlayer" } ) else GA.newEvent ( "design", { event_id = "GameLaunched:twoPlayer" } ) end timer.cancel(buzzTimer)-- Removes buzzing animation end |
为了可视化这一点,我们应该在 GameAnalytics 仪表板中创建一个自定义小部件。以下是小部件的设置
这就是最终小部件的样子
2. 哪种台球桌颜色最受欢迎?
如果您想开始销售不同的台球桌颜色,了解哪种颜色最受欢迎肯定会有所帮助。使用以下事件层次结构
TableColor:ColorID
请注意,ColorID 实际上可以使用字符串连接从代码自动分配。将 GA 调用放在 OptionMenu() 函数的 changeFelt() 函数下
1 2 3 4 5 6 7 |
local function changeFelt(event) local feltObject = event.target local feltColor = event.target.id if event.phase == "ended" then GA.newEvent ( "design", { event_id = "TableColor:".. feltColor } ) |
此小部件的设置与上面的小部件类似,它看起来会像这样
3. 当八号球被意外打进并且游戏结束时,统计上桌上还剩下多少个球?
知道桌上还剩下多少个球可以让你了解游戏的难度。也许您想“调整”黑八号球以更改游戏难度。您可以从 gameOver() 函数跟踪此指标
1 2 3 4 5 6 7 8 |
function gameOver() if mode == onePlayer then GA.newEvent ( "design", { event_id = "GameOver:onePlayer:BallsOnTable" , value = 7 - solidTotal } ) else GA.newEvent ( "design", { event_id = "GameOver:twoPlayer:BallsOnTable" , value = 14 - stripeTotal - solidTotal } ) end |
这是你如何为此数据创建一个自定义小部件
对于我的第一次尝试,结果看起来会像这样
总结…
当然,在本文中,我只是略微涉及了 GameAnalytics SDK 可以实现的功能。要了解此插件的完整功能,请访问我们的文档。
莫
发布于 22:06,1 月 22 日太棒了!似乎 GA 在报告事件方面比 Flurry 快得多,还是我弄错了?我喜欢 Flurry,但我无法忍受等待事件显示在仪表板上。迫不及待想尝试一下!
莫
安娜玛丽亚·托多尔
发布于 01:42,1 月 23 日好吧,直接比较是不公平的,但使用 GameAnalytics,您可以通过调试消息在 Corona 编辑器中获得直接反馈。如果您收到“{status:ok}”消息,那么您就可以确定您的消息已到达 GA 服务器。
安德烈亚斯
发布于 01:04,1 月 23 日看起来很有趣!我对 Flurry 不太满意,所以我可能会尝试一下。
一个关于 Android 的问题
是否需要比“android.permission.INTERNET”更多的权限?
谢谢 & 祝好,
安德烈亚斯
安娜玛丽亚·托多尔
发布于 01:41,1 月 23 日感谢大家对 GameAnalytics 的关注。我们真的很感激!
@Mo:好吧,直接比较是不公平的,但使用 GameAnalytics,您可以通过调试消息在 Corona 编辑器中获得直接反馈。如果您收到“{status:ok}”消息,那么您就可以确定您的消息已到达 GA 服务器。
@Andreas:它只使用 “android.permission.INTERNET” 和 “android.permission.ACCESS_NETWORK_STATE”。
赫利俄斯·纳西斯
发布于 12:04,1 月 26 日如果我没记错的话,我想我第一次听说 GA 是从我一位 Unity 开发的朋友那里听说的..很高兴现在 Corona 也提供了 😀
泰勒
发布于 16:18,1 月 27 日我花了几个小时将 GA 集成到我当前的项目中。看起来不错。但是关于在 GA 网站上查看我的项目分析的“实时”屏幕,我有一个问题。顶部会显示一个当前活动会话的框。我只在一个模拟器中运行我的应用程序,但该活动会话计数会在 0 到 4 之间变化。所以,我很困惑为什么它不只显示 1。
另外,我必须说,我仍然对如何构建我的一些消息感到困惑(是依赖于“区域”,还是将区域数据作为消息子字符串的一部分,等等)。我可以使用实时部分来确保消息已到达,这很好,但糟糕的是,我无法看到我的消息在报告中的样子,直到 24 小时后。如果能立即看到它们的样子以及它们之间的关联等等,以便我可以决定我想要使用的结构,那将非常有帮助。
David
发布于 16:51, 1 月 27 日Tyler - 你能在论坛上提出这个问题吗?也许更容易开始对话
http://forums.coronalabs.com/forum/632-gameanalytics/
我也会通知 GA 的人,让他们回答你的问题。
泰勒
发布于 08:33, 1 月 28 日好的,谢谢 Dave。我会把这个问题转移到论坛上。