Unity Game Cloud
手机游戏市场涨势迅猛。根据业内人士分析,移动和在线游戏领域的年平均增长率可以达到 23%,到 2017 年有望达到 600 亿美元。
这对游戏开发商来说是个巨大的机遇。但是,只有很小一部分的游戏获得了成功。根据以往与众多游戏开发商合作的经验,我们发现,几乎所有成功的游戏都有一些共同的要素:他们开始于一个伟大的想法,有一个好的用户体验,而且,他们有一个可扩展的后端以支持持续增长的性能需求。他们还需要创建一个强大的用户购买机制。最后,成功的游戏会收集玩家的行为和使用信息,并根据这些分析获得更大的利益。
Kii 提供了一个完整的即开即用的 Game Cloud - 它包括后端工具、分析见解和游戏分发,以帮助开发人员积极地发布游戏。
哪些人适合阅读该文档?
这个文档适合有兴趣构建移动游戏的开发者阅读。该文档主要讲述的是后端组件,并包含帮助开发人员利用 Kii Game Cloud 快速构建可扩展游戏的信息。
然而前端/客户端并不是这个文档的重点,Kii 已与 Unity 达成合作关系 - Unity 作为一个游戏引擎为游戏开发者们提供更完整的解决方案。Unity SDK 参考文档
那里还有一些样例和演示游戏,你可以重用他们或通过他们熟悉我们的 SDK。
快速入门
你可以在 developer.kii.com 上免费注册。按照此处 简单的提示创建你的 App 并集成 Kii SDK。
此页面作为一个快速参考,很多代码段是基于我们的 Unity + Kii 开源教程 UnityAngryBotsKii(基于 AngryBots 演示)的,你可以在我们 Github 项目页 中找到它。
请注意: 如果你想做更深入的研究Unity SDK,我们有更完整的教程 和 相应的文档。
玩家管理
能够管理用户(例如,允许他们注册并登录)对跟踪成绩、等级进展和跨设备或平台访问用户信息是必不可少的。幸运的是,使用 Kii SDK 可以简化这个过程,只需几行代码便可完成。
用户注册
如下代码段阐述如何创建一个用户:
KiiUser.Builder builder = KiiUser.BuilderWithName(username);
builder.WithEmail(email);
KiiUser usr = builder.Build();
usr.Register(password, (KiiUser user, Exception e) =>
{
if (e != null)
{
Debug.LogError("Signup failed: " + e.ToString());
// process error
}
else
{
Debug.Log("Signup succeeded");
// do something with user, it's a valid user now
}
});
用户登录
用户登录代码:
KiiUser.LogIn(username,password, (KiiUser user, Exception e) =>
{
if (e != null)
{
Debug.LogError("Login failed: " + e.ToString());
// process error
}
else
{
Debug.Log("Login succeeded");
// do something with user, it's a valid user now
}
});
使用 Facebook 登录
您可以在集成 Kii SDK 的游戏中利用 Facebook 来加载用户。为了做到这一点,你需要将 Facebook Unity SDK 添加到您的游戏中,然后,当用户登录后检索 Facebook 令牌。借助这个令牌,你就可以将用户加载到 Kii Cloud 中并获得一个有效的 Kii 用户:
KiiUser user = null;
try
{
user = KiiUser.LoginWithFacebookToken(facebookToken);
}
catch(Exception e)
{
Debug.Log(e.StackTrace);
}
// Now you have a logged in Kii user via Facebook ( -> KiiUser.CurrentUser)
// And you can update the user attributes from Facebook data
KiiUser.ChangeEmail(facebookEmail);
KiiUser.ChangePhone(facebookPhone);
user.Displayname = facebookName;
user.Update();
Debug.Log("Current user email is: " + KiiUser.CurrentUser.Email);
Debug.Log("Current user name is: " + KiiUser.CurrentUser.Displayname);
Debug.Log("Current user phone is: " + KiiUser.CurrentUser.Phone);
这需要在开发者控制中心设置 Facebook App ID,在使用这种方法前请参考此处 的步骤1、2、3.
存储游戏数据
Kii SDK提供了一个非常灵活的基于 JSON 的数据存储方式,且完全是无预定义结构的。任意 Key/Value 都可以被存储、嵌套和连接到用户或其他 Object,这让你可以存储所有被创建或用于游戏的数据。
这种模式的存储可以很好的用来远程地跟踪用户的进度、创建排行榜、存储和修改游戏配置。
下面的例子中,我们将创建一个得分,这个得分将被上传到排行榜:
public void sendScore(int score)
{
KiiUser user = KiiUser.CurrentUser;
KiiBucket bucket = Kii.Bucket("scores");
KiiObject kiiObj = bucket.NewKiiObject();
kiiObj["score"] = score;
kiiObj["username"] = user.Username;
kiiObj.Save((KiiObject obj, Exception e) =>
{
if (e != null)
{
Debug.LogError("Failed to save score" + e.ToString());
}
else
{
Debug.Log("Score sent");
}
});
}
检索游戏数据
当然,一旦你的数据被存储了 —— 你需要一种合理的能够获取和使用它的方法。查询数据十分简单,你甚至可以创建参数,建立一个类似于SQL语句般的查询。
下面的例子中,我们将查询前10的得分,并将他们显示在排行榜中:
KiiBucket bucket = Kii.Bucket("scores");
KiiQuery query = new KiiQuery();
query.SortByDesc("score");
query.Limit = 10;
bucket.Query(query, (KiiQueryResult<KiiObject> list, Exception e) =>
{
if (e != null)
{
Debug.LogError("Failed to query " + e.ToString());
}
else
{
Debug.Log("Query succeeded");
int i = 0;
foreach (KiiObject obj in list)
{
int score = obj.GetInt("score");
string username = obj.GetString("username");
DisplayScoreLine(i++, username, score);
}
}
});
地理位置
添加新的维度到你的游戏能够为你的游戏带来更多的用户化和个性化的感觉。你可以利用 Kii 将位置坐标附加到云中的任意 Object,以便在游戏中利用这些位置坐标。
此处,我们将坐标附加到得分这个 Object 上。这将使我们能够看到用户的区域(例如,100公里)内得分最高的玩家。
存储地理位置
下面是一个如何附加位置坐标到得分 Object 的例子:
public void sendScore(int score)
{
KiiGeoPoint userLocation = new KiiGeoPoint(GetLatitude(), GetLongitude());
KiiUser user = KiiUser.CurrentUser;
KiiBucket bucket = Kii.Bucket("scores");
KiiObject kiiObj = bucket.NewKiiObject();
kiiObj["score"] = score;
kiiObj["username"] = user.Username;
kiiObj.SetGeoPoint("location", userLocation);
kiiObj.Save((KiiObject obj, Exception e) =>
{
if (e != null)
{
Debug.LogError("Failed to save score" + e.ToString());
}
else
{
Debug.Log("Score sent");
}
});
}
查询附近的对象
在一个给定的地理位置附近 100km 范围内搜索得分,你可以像这样查询:
KiiBucket bucket = Kii.Bucket("scores");
string distanceField = "distance_from_center";
KiiGeoPoint center = new KiiGeoPoint(GetLatitude(), GetLongitude());
KiiClause clause = KiiClause.GeoDistance("location", center, 100000, distanceField);
// Create a query instance and set the sorting order (closer first)
KiiQuery query = new KiiQuery(clause);
string sortKey = "_calculated." + distanceField;
query.SortByAsc(sortKey);
// Execute GeoDistance query
bucket.Query(query, (KiiQueryResult<KiiObject> list, Exception e) =>
{
if (e != null)
{
Debug.LogError("Failed to query " + e.ToString());
}
else
{
Debug.Log("Query succeeded");
int i = 0;
foreach (KiiObject obj in list)
{
int score = obj.GetInt("score");
string username = obj.GetString("username");
DisplayScoreLine(i++, username, score);
}
}
});
访问控制
能够控制谁可以对游戏中特定的数据进行读取/写入操作是每一个 App 的关键。为了更简便的做到这一点,Kii 提供了一些工具。对于单个对象,从默认作用域到为 Bucket 授予权限再到完整的 ACL(访问控制列表)皆可控制。你自始至终都可以确保游戏所创建的数据仅由适当的用户访问。
虽然已有许多即开即用的默认权限设置,但是这里还是给出一个修改 Object ACL 的简单例子:
Uri objUri = new Uri("a_public_game_object");
KiiObject obj = KiiObject.CreateByUri(objUri);
// Allow anonymous users to read the object
try
{
obj.Acl(ObjectAction.READ_EXISTING_OBJECT).Subject(KiiAnonymousUser.Get())
.Save(ACLOperation.GRANT);
}
catch (Exception e)
{
// handle error.
}
自定义分析
对于想在应用商店中参与竞争的游戏开发者来说,了解游戏的来龙去脉是至关重要的。某一个关卡有多少人在玩?某些关卡是否太难?哪些商品最畅销?回答这些问题不仅能帮助你改进游戏,还能够了解如何更好的获取利润。
这类问题对于不同的游戏也会有所不同,所以你需要能够依照自己所需跟踪这些问题。Kii 提供了2种不同类型的分析,这2种都是完全根据你的游戏自定义的,而不是强制使用预先提供的模版来分析。
事件分析
事件分析是非常符合传统分析理念的。关卡被玩了多少次?玩家参加过多少次联机?你可以对所有用户跟踪单个事件来回答这些类型的问题。
你可以使用如下一段代码来跟踪此类事件:
// Send Analytics event for end of level time
public static void EndOfLevel(float gameTime, int level)
{
KiiEvent ev = KiiAnalytics.NewEvent("end_of_level");
// Set key-value pairs
ev ["user"] = user.Username;
ev ["time"] = gameTime;
ev ["level"] = level;
// Upload Event Data to Kii Cloud
try
{
KiiAnalytics.Upload(ev);
}
catch (Exception e)
{
Debug.LogError("Unable to upload analytics event to Kii Cloud: " + e.ToString());
}
}
请注意: 你需要在代码中构建和部署这些事件。如果你的应用已经上线了,但是你需要开始跟踪一些新的指标应该怎么办?请查看下面的游戏数据分析!
游戏数据分析
每当玩家完成一个关卡,游戏都会产生数据,提交一个分数或是完成交易。想象一下,每天都对你App的生命周期中任一时间产生的数据进行复杂的分析?这便是 Kii 数据分析提供的服务。
不必为因为一个新的指标而修改代码和重新部署游戏而担心。你只需要在开发者平台上对数据简单的切分便可以完成这些而不必重新部署 App。你 App 所保存的任何数据都可以随时随地的参与分析!
其他好处
团队协作
Kii Cloud 提供了一个深层面的开发者平台来管理你的游戏,可以查阅统计和分析结果,浏览数据以及其他功能。我们知道,游戏往往不是一个人的产品,所以把 Kii Cloud 所提供的工具和资源开放给团队成员也很有必要,只需在 Kii 开发者平台上添加你的团队成员即可。
可靠性&可扩展性
你永远不知道当游戏推出时以及随着时间的推移能够吸引多少用户。使用Kii Cloud,你将不必为此担心。我们高度可靠的、可扩展的移动后端是专为满足移动游戏开发者的需求而设计的。价格也随着你的成长而增加,让您可以免费的构建和测试,只有当你的 App 开始增长时才需要支付费用。
Kii 中规模最大、时间最长的客户是 NTT DOCOMO,日本最大的电信运营商。NTT DoCoMo 以可靠性著称,他们信任 Kii,并轻而易举地扩展到数百万用户。随着用户的增长,你需要确信你将会有较高的可用性和较快的性能。这部分事情我们会处理,你只需要专注于你的游戏。
Kii to China
一旦你的 App 构建完成,将由你决定是否进入用户手中。在中国境内发布你的 Android App 会是一个特别困难的挑战,这些困难在谷歌商店中极少或几乎不会遇到的。
使用 Kii to China,您可以在中国的数十个应用商店分发您的 App。Kii 不仅能提供翻译和分发服务,也有助于让你的 App 通过商店连接到支付机制。在 此 了解更多关于 Kii to China 的信息。
下一步
如果你还没有这样做的话,请访问 developer.kii.com 免费注册 Kii Game Cloud。分分钟,你便可拥有一个带有后端的游戏!
为了帮助你尽快开始,我们有一些 Unity 的演示,让你可以熟悉我们的 Unity SDK:
- KiiUnitySDKSamples - 一个通用的 Unity 演示,系统地展示了使用 Unity SDK 对所有 Kii Cloud API 的调用。它不是一个游戏,但它是一个使用 Unity 的 GUI 进行交互的 Unity 项目。
- UnityAngryBotsKii - 基于官方的 Unity 3D 4.3 AngryBots 试玩版游戏,这个项目通过 Unity SDK 使用 Kii Cloud。虽然试玩版还在开发中,但是它已经可以展示一些Kii的功能了。
- HelloKii-Unity - 一个简单打砖块的项目,展示了基本的用户管理和数据管理(包括查询)。
- Product demo 包含了所有功能。
Kii的 Game Cloud 提供了所有将 Cloud 集成到游戏的工具。从 Unity 集成到玩家管理、自定义数据,甚至是分析,你可以比以往更快地给游戏添加强大的新功能。