| 键 | 类型 | 值 |
|---|---|---|
| enemy_damage | number | 30 |
| player_speed | number | 4.5 |
| double_xp_weekend | boolean | true |
| event_banner | string | Lunar festival: 2× coins! |
| shop | json | {"sale": 0.2} |
为你的 Unity 游戏打造的后端
玩家账号、排行榜、远程配置、云存档和每日奖励——一个 Unity SDK、一个控制台,几分钟即可就绪。
Free 套餐支持 1,000 名玩家,无需信用卡。
即时游客登录,重启后依然保留;之后可通过安全网页关联邮箱或 Google 账号,进度随之迁移。
| 玩家 | 登录方式 | coins |
|---|---|---|
| Nova | 1,240 | |
| Kaito | 邮箱 | 860 |
| Luna | 游客 | 410 |
| Raka | 1,975 | |
| Mira | 游客 | 95 |
{ "ok": true, "auth_method": "guest", "player": { "player_id": "player_3f9c…", "display_name": "Guest 4821" } }
支持最佳或最新分数,每日、每周或每月重置并归档,还提供分数范围和提交冷却时间来防止作弊。
- 1 Nova 12,480
- 2 Kaito 12,290
- 3 Luna 12,010
- 4 Raka 11,840
- 5 Mira 11,620
- 6 Orion 11,395
{ "score": 12100 }
实时调整数值平衡、价格和功能开关。配置值经过 RSA 签名、离线缓存,并由 SDK 验证。
| 键 | 类型 | 值 |
|---|---|---|
| enemy_damage | number | 30 |
| player_speed | number | 4.5 |
| double_xp_weekend | boolean | true |
| event_banner | string | Lunar festival: 2× coins! |
按玩家保存任何可序列化对象,并带有修订号,两台设备永远不会悄无声息地互相覆盖。
{ "revision": 12, "data": { "level": 9 } }
{ "revision": 12, "data": { "level": 8 } }
由服务器判定的每日、每周或一次性奖励,发放到每位玩家的钱包。
| reward_key | 数量 | 今日领取 |
|---|---|---|
| daily_coins daily | 50 coins | 26 |
| weekly_gems weekly | 5 gems | 9 |
| welcome_pack once | 200 coins | 3 |
{ "ok": true, "accepted": true, "reward_key": "daily_coins", "amount": 50, "currency": "coins", "balance": 1290 }
在你的引擎里,只需几行代码
登录玩家、提交分数、读取实时配置。每次调用都会返回结果,而不是抛出异常。
- Unity
- 适用于 Unity 2021.3+ 的 C# SDK,支持 async 和协程,并附带 Starter 场景。
- Godot
- 适用于 Godot 4.2+ 的 GDScript 插件,提供 autoload 和编辑器内设置。
- Web / JavaScript
- 单个 JavaScript 文件,适用于 HTML5 游戏、网站和 Node.js。
- REST API
- 纯 HTTPS + JSON,适用于任何其他引擎或服务器。
using MajacloudSdk;
using UnityEngine;
public class GameStart : MonoBehaviour
{
private async void Start()
{
// Restores the saved session or creates a guest
var signIn = await Majacloud.Auth.SignInAnonymouslyAsync();
if (!signIn.Ok)
{
Debug.LogWarning(signIn.Error.Message);
return;
}
Debug.Log("Hello " + signIn.Value.DisplayName);
await Majacloud.Leaderboards.SubmitScoreAsync("coins", 120);
int damage = Majacloud.RemoteConfig.GetInt("enemy_damage", 25);
}
}
extends Node
func _ready() -> void:
# Restores the saved session or creates a guest
var signed_in := await Majacloud.auth.sign_in_anonymously()
if not signed_in.ok:
push_warning(signed_in.message)
return
print("Hello ", signed_in.value.display_name)
await Majacloud.leaderboards.submit_score("coins", 120)
var damage := Majacloud.remote_config.get_int("enemy_damage", 25)
const mc = Majacloud.createClient({
baseUrl: 'https://majacloud.majanite.com',
projectId: '<project id>',
clientKey: 'pk_live_…',
});
// Restores the saved session or creates a guest
const signIn = await mc.auth.signInAnonymously();
if (!signIn.ok) throw new Error(signIn.error.message);
console.log('Hello ' + signIn.value.display_name);
await mc.leaderboards.submitScore('coins', 120);
await mc.remoteConfig.fetch();
const damage = mc.remoteConfig.getInt('enemy_damage', 25);
export PROJECT_ID="<project id>" CLIENT_KEY="pk_live_…"
# Create a guest; keep access_token and refresh_token from the response
curl -X POST https://majacloud.majanite.com/v1/auth/guest -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{}'
export TOKEN="<access_token>"
curl -X POST https://majacloud.majanite.com/v1/leaderboards/coins/scores -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"score": 120}'
在线游戏所需的一切
每项服务都可以独立使用,并通过相同的 SDK 调用工作,从编辑器到 WebGL 和移动端构建均适用。
| 玩家 | 登录方式 |
|---|---|
| Nova | |
| Kaito | 邮箱 |
| Luna | 游客 |
| Raka | |
| Mira | 游客 |
{ "revision": 12, "data": { "level": 9 } }
{ "revision": 12, "data": { "level": 8 } }
| 请求 | 状态 | 延迟 |
|---|---|---|
| POST/v1/leaderboards/coins/scores | 200 | 34 ms |
| GET/v1/config | 304 | 12 ms |
| PUT/v1/cloud/progress | 409 | 21 ms |
| POST/v1/rewards/claim | 200 | 19 ms |
| POST/v1/auth/refresh | 200 | 18 ms |
从零到第一次请求
创建项目
注册并创建项目,记下项目 ID 和客户端密钥。Starter 内容会自动为你添加。
导入 Unity SDK
导入 .unitypackage,打开 Tools ▸ Majacloud ▸ Setup,粘贴密钥并测试连接。
点击 Play
Starter 场景会登录、提交分数、保存进度、领取奖励并读取配置——然后复制你需要的部分即可。
默认安全
游戏后端中常见的问题,我们都已为你处理好。
- 私密密钥以哈希形式存储且只显示一次;公开的客户端密钥只能代表已登录的玩家执行操作。
- 短时效访问令牌,配合轮换的刷新令牌和重用检测。
- 远程配置使用 RSA-SHA256 签名,并在使用前于设备上验证。
- 分数、奖励和钱包均在服务器端校验,绝不信任客户端。
- 每个项目都有速率限制、每日配额,以及带请求 ID 的逐条请求日志。
{
"ok": true,
"version": 14,
"configs": [
{ "key": "enemy_damage", "type": "number", "value": "30" },
{ "key": "double_xp_weekend", "type": "boolean", "value": "true" }
],
"checksum": "9c41f0…e27b",
"signature": "Kq3vR8yJ…Wm0=",
"signature_algorithm": "rsa-sha256",
"signing_key_id": "config-v1"
}
简单的月度定价
通过 Midtrans 使用 QRIS、电子钱包、银行转账或银行卡以印尼盾付款。不会自动扣费,想续订时再续。
Free
发布小型游戏所需的一切。
¥0 / 月
- 4,000 API 请求 / 天
- 1,000 玩家账号
- 1 项目
- 1 排行榜 / 项目
- 3 远程配置键
- 32 MB 云存档空间
Starter
为拥有真实社区的游戏留出成长空间。
≈ ¥12.61 / 月
以印尼盾结算:Rp29.000
- 10,000 API 请求 / 天
- 10,000 玩家账号
- 3 项目
- 3 排行榜 / 项目
- 10 远程配置键
- 256 MB 云存档空间
Plus热门
为已上线运营的游戏提供高容量。
≈ ¥64.78 / 月
以印尼盾结算:Rp149.000
- 100,000 API 请求 / 天
- 100,000 玩家账号
- 10 项目
- 15 排行榜 / 项目
- 50 远程配置键
- 2 GB 云存档空间
Max
为大型高流量游戏提供最高容量。
≈ ¥130 / 月
以印尼盾结算:Rp299.000
- 无限制 API 请求 / 天
- 无限制 玩家账号
- 25 项目
- 30 排行榜 / 项目
- 1000 远程配置键
- 10 GB 云存档空间
额度按账号计算。达到上限时,API 会返回明确的 plan_limit 错误,不会删除任何数据。 以 CNY 显示的价格为约数,仅供参考。实际通过 Midtrans 以印尼盾(IDR)收费,最终汇率由你的银行或电子钱包决定。
常见问题
支持哪些 Unity 版本?
Unity 2021.3 LTS 及更高版本,包括 Unity 6。SDK 不依赖任何第三方库,支持内置渲染管线、URP 和 HDRP。
支持 WebGL 和移动端吗?
支持。SDK 从不使用线程,因此异步调用可在 WebGL、Android 和 iOS 上运行。每个异步方法还提供协程版本。
可以在 Godot 或网站上使用吗?
可以。Unity 是主要 SDK,此外还有 Godot 4 插件,以及适用于 HTML5 游戏、网站和 Node.js 服务器的无依赖 JavaScript SDK。它们都调用同一个 REST API,因此你也可以从任何其他引擎调用。
玩家离线时会怎样?
远程配置会继续使用已验证的本地缓存,游客会话会在下次启动时恢复,而且每次调用都会返回带错误码的结果,而不是抛出异常。
达到套餐上限会怎样?
新建内容会被拒绝,并返回 plan_limit 错误,你的游戏可以将其显示出来。现有玩家和数据不受影响,升级后限制会立即解除。
如何付款?
选择套餐,通过 Midtrans 支付一个月的费用。再次支付相同套餐会再增加一个月。周期结束前我们会发邮件提醒你。
可以查看或删除玩家数据吗?
可以。控制台会显示每位玩家及其分数、存档和钱包,你可以删除其中任何一项。删除项目会移除其所有数据。