高重玩价值是一款出色游戏的基本特征之一。 只要情节非常简单,即使情节非常简单的游戏也可以在Google Play上获得成功。 如果您是狂热的游戏玩家,您可能已经知道什么是重播价值。 如果您不这样做,则可以将其视为即使达到其主要目标,用户仍将再次玩游戏的可能性。
通过使用事件和任务API(它们是Google Play游戏服务 API的子集),您可以极大地提高游戏的重播价值,更不用说使它们更具挑战性和趣味性了。 在本教程中,我将向您展示如何充分利用这两个API。
1.了解事件和任务
游戏中发生的任何事情都可以视为事件。 通过使用事件API记录足够的事件,您可以密切分析用户的行为。 您可以推断出详细信息,例如用户可以在游戏中走多远,杀死多少敌人以及他们收集了多少游戏资源。 有了这些细节,您就可以轻松地改进游戏,使其更有趣。
但是,事件API很少单独使用。 大多数开发人员将其与quests API一起使用来创建任务。 顾名思义,追求是用户获得某些奖励所能达到的次要目标。 例如,如果您要创建一个用户尝试保存公主的游戏,则可以向其中添加一个任务,要求用户必须找到至少100个戒指。
如果您还没有猜到,可以使用事件来定义任务的完成标准。 在上面的示例中,找到戒指将是必须将任务标记为完成的100次事件。
尽管任务与成就有一些相似之处,但两者之间还是有一些重要区别:
- 您无需编写任何代码即可向游戏中添加新任务,只要它所依赖的事件已成为游戏的一部分即可。
- 任务是有时间限制的。 例如,您可以安排一个新任务在圣诞节前一周开始,并要求用户在圣诞节前夕完成任务。
- 用户只有选择参与后才能完成任务。
有了许多有趣的任务,其中一些任务计划每周或每月重复一次,您可以毫不费力地让用户多次玩游戏。
2.创建事件
登录到Play开发者控制台,然后通过单击游戏板图标打开“ 游戏服务”屏幕。
接下来,选择要向其中添加事件的游戏,然后打开“ 事件”部分。
按添加事件按钮开始创建事件。 在弹出的表单中,为事件指定一个有意义的名称。 继续上一步的示例,我将事件称为Collect Ring 。
![创建事件对话框](https://i-blog.csdnimg.cn/blog_migrate/76bdd8f9055135602db504bf5bf6b478.png)
按下“ 保存”按钮后,您将能够看到事件的ID。 为了能够在您的Android Studio项目中使用该事件,您必须将ID作为新的<string>
标签添加到games-ids.xml文件中。
<string name="event_collect_ring">ABCDEFabcdef123</string>
3.创建任务
创建任务稍微复杂一些。 首先转到“ 任务”部分,然后按“ 添加任务”按钮。 为任务指定一个吸引人的名称和易于理解的描述。 两者都很重要,因为它们会被用户读取。 一个看起来不太有趣的任务不太可能会看到很多参与者。
![任务名称和说明](https://i-blog.csdnimg.cn/blog_migrate/6c675605f3bdf7124158c8cd03c105b1.png)
接下来,向下滚动到“ 完成条件”部分。 在“ 查找事件”字段中,键入您先前创建的事件的ID。 在下一个输入字段中,您必须指定事件必须发生多少次才能完成任务。
在计划部分中,指定任务的开始日期和时间 。 为了能够立即开始执行任务,您可以选择今天的日期。
您还必须通过在“天数”字段中输入一个值来指定任务的持续时间。 (可选)您可以选择在几乎没有时间时通知任务参与者。
任务必须有奖励-用户为什么还要选择参与? 您可以通过上传奖励文件(可以是任何格式的文件)来指定奖励是什么。 大多数开发人员选择使用JSON格式。 这是示例奖励文件:
{
points: 3000,
max_lives: 15
}
值得注意的是,奖励文件的内容对于Play游戏服务API并不重要。 解析并在游戏中使用它们是您的责任。
在“ 奖励数据”部分中,按“ 浏览”按钮并上传您创建的奖励文件。
![完成标准时间表和奖励数据部分](https://i-blog.csdnimg.cn/blog_migrate/cb39eb0a2c15c0cd3b59b2e89fd6d0c2.png)
最后,按保存以生成任务的ID。 (可选)您可以复制ID并将其作为另一个<string>
标记添加到Android Studio项目的games-ids.xml文件中。
<string name="quest_please_the_princess">BCDEABCD123</string>
4.显示任务界面
Quests API提供了一个活动,可以显示游戏中所有可用的任务。 该活动还允许用户加入任务。
要打开任务活动,必须使用Games.Quests
类的getQuestsIntent()
方法getQuestsIntent()
创建一个意图。 作为参数,它需要一个GoogleApiClient
对象和一个int
数组,该数组指定要显示的任务的类型。 以下是一些常见的任务类型值:
-
Quests.SELECT_OPEN
,用户可以立即参与的任务。
-
Quests.SELECT_UPCOMING
,一个尚未开始的任务。
-
Quests.SELECT_COMPLETED
,用户已经完成的一项任务。
-
Quests.SELECT_ACCEPTED
,用户当前正在参与的任务。
创建Intent
对象后,可以将其传递给startActivityForResult()
方法以显示quests活动。
以下代码显示了如何打开任务活动并显示四种类型的任务:
Intent intent = Games.Quests.getQuestsIntent(apiClient,
new int[]{
Quests.SELECT_OPEN,
Quests.SELECT_UPCOMING,
Quests.SELECT_ACCEPTED,
Quests.SELECT_COMPLETED
});
startActivityForResult(intent, 0);
任务活动如下所示:
![可用任务](https://i-blog.csdnimg.cn/blog_migrate/4a973eee3623bc8b53f3999c6c11d85e.png)
用户通过按“ 接受”按钮成为任务的参与者。 在执行任务期间,用户可以返回到任务UI,以查看完成了多少任务。
5.使用事件API
事件API可让您轻松管理游戏中的事件。 若要更改事件的值,可以使用Games.Events
类的increment()
方法。 作为其参数,它需要一个GoogleApiClient
对象,事件的名称以及一个数字,该数字指定应将事件的值增加多少。
以下代码将event_collect_ring
事件的值增加1 :
Games.Events.increment(apiClient,
getString(R.string.event_collect_ring), 1);
要获取事件的当前值,必须使用load()
方法。 由于该值是从Google的服务器异步获取的,因此该方法的返回值是PendingResult
对象。 通过ResultCallback
添加ResultCallback
对象,可以在结果可用时通知您。
在ResultCallback
接口的onResult()
方法内部,必须调用Events.LoadEventsResult
对象的getEvents()
方法,该对象返回一个EventBuffer
。 在缓冲区中找到所需的Event
后,可以调用其getValue()
方法以获取其当前值。
以下代码显示了如何获取event_collect_ring
事件的值:
PendingResult<Events.LoadEventsResult> results =
Games.Events.load(apiClient, true);
results.setResultCallback(
new ResultCallback<Events.LoadEventsResult>() {
@Override
public void onResult(@NonNull Events.LoadEventsResult
loadEventsResult) {
// Fetch all events of the game
EventBuffer events = loadEventsResult.getEvents();
// Loop through all the events
for(int i = 0; i < events.getCount(); i++) {
Event currentEvent = events.get(i);
// Check if current event is the desired event
// and print its value
if(currentEvent.getEventId().equals(getString(
R.string.event_collect_ring)))
Log.d(TAG, "You have now collected " +
currentEvent.getValue() + " rings");
}
}
}
);
6.检测任务完成
当用户按时完成任务时,您的游戏必须能够使用您在Play开发者控制台中上传的奖励文件来奖励用户。 要检测任务完成,必须创建QuestUpdateListener
对象,并使用Games.Quests
类的registerQuestUpdateListener()
方法向Games.Quests
API registerQuestUpdateListener()
该Games.Quests
。
在QuestUpdateListener
接口的onQuestCompleted()
方法内部,您必须调用QuestUpdateListener
claim()
方法以索取任务的奖励。 您必须将GoogleApiClient
对象,任务ID和当前里程碑的ID传递给方法。
索偿之后,您可以通过调用getCompletionRewardData()
方法以byte
数组的形式获取奖励文件。 因为我们的奖励数据只是一个JSON文件,所以您可以将byte
数组传递给String
类的构造函数,以将其转换为字符串。
Games.Quests.registerQuestUpdateListener(apiClient,
new QuestUpdateListener() {
@Override
public void onQuestCompleted(Quest quest) {
Games.Quests.claim(apiClient, quest.getQuestId(),
quest.getCurrentMilestone()
.getMilestoneId());
byte[] rewardData = quest.getCurrentMilestone()
.getCompletionRewardData();
String reward = new String(rewardData);
}
}
);
此时,您可以将字符串转换为JSONObject
实例,并读取其中的键值。 以下代码显示了如何获取两个称为point和max_lives的键的值:
try {
JSONObject rewardObject = new JSONObject(reward);
int points = rewardObject.getInt("points");
int maxLives = rewardObject.getInt("max_lives");
Log.d(TAG, "You have now gained "
+ points + " points and "
+ maxLives + " lives");
} catch(Exception e) {
Log.e(TAG, "Couldn't parse JSON");
}
请注意,任务完成后,任务活动会自动更新。 这是完成的任务的样子:
![完成的任务](https://i-blog.csdnimg.cn/blog_migrate/e450f36a665f75d3b77e57aeacf1b6c4.png)
结论
在本教程中,您学习了如何使用任务和事件API来说服用户一次又一次地玩游戏。 但是请注意,由于这些API具有速率限制,因此您必须尝试避免在应用程序中过于频繁地使用它们。 您可以参考Play游戏服务质量检查清单页面,以了解更多限制和最佳做法。
翻译自: https://code.tutsplus.com/tutorials/google-play-games-services-creating-events-and-quests--cms-27853