| キー | 型 | 値 |
|---|---|---|
| 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ゲームのためのバックエンド
プレイヤーアカウント、リーダーボード、リモートコンフィグ、クラウドセーブ、デイリー報酬。1 つの Unity SDK と 1 つのダッシュボードで、数分で使い始められます。
Free プランでプレイヤー 1,000 人まで。クレジットカード不要。
再起動しても消えないゲストログインをすぐに使え、安全な Web ページからメールアドレスや 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! |
シリアライズ可能なオブジェクトをプレイヤーごとにリビジョン付きで保存。2 台のデバイスが知らないうちに互いのデータを上書きすることはありません。
{ "revision": 12, "data": { "level": 9 } }
{ "revision": 12, "data": { "level": 8 } }
サーバーが判定する毎日・毎週・1 回限りの報酬を、プレイヤーごとのウォレットに付与します。
| 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 アドオン。オートロードとエディター上でのセットアップに対応しています。
- Web / JavaScript
- JavaScript ファイル 1 つで、HTML5 ゲーム、Web サイト、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}'
ライブゲームに必要な機能がすべてそろっています
各サービスは単独でも動作し、エディターから WebGL、モバイルビルドまで同じ SDK 呼び出しで利用できます。
| プレイヤー | ログイン方法 |
|---|---|
| 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 で署名され、使用前にデバイス上で検証されます。
- スコア、報酬、ウォレットはサーバーで検証され、クライアントから送られた値をそのまま信頼することはありません。
- レート制限、1 日あたりのクォータ、リクエスト 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
コミュニティが育ってきたゲームの成長を支えます。
≈ ¥264 / 月
ルピア建てで Rp29.000 を請求します
- 10,000 API リクエスト / 日
- 10,000 プレイヤーアカウント
- 3 プロジェクト
- 3 リーダーボード / プロジェクト
- 10 リモートコンフィグのキー
- 256 MB クラウドセーブのストレージ
Plus人気
本番運用中のライブゲーム向けの大容量プラン。
≈ ¥1,355 / 月
ルピア建てで Rp149.000 を請求します
- 100,000 API リクエスト / 日
- 100,000 プレイヤーアカウント
- 10 プロジェクト
- 15 リーダーボード / プロジェクト
- 50 リモートコンフィグのキー
- 2 GB クラウドセーブのストレージ
Max
大規模で高負荷なゲーム向けの最大容量プラン。
≈ ¥2,718 / 月
ルピア建てで Rp299.000 を請求します
- 無制限 API リクエスト / 日
- 無制限 プレイヤーアカウント
- 25 プロジェクト
- 30 リーダーボード / プロジェクト
- 1000 リモートコンフィグのキー
- 10 GB クラウドセーブのストレージ
上限はアカウント単位で適用されます。上限に達すると、API はわかりやすい plan_limit エラーを返します。データが削除されることはありません。 JPY での価格は概算です。お支払いは Midtrans を通じてインドネシアルピア(IDR)で請求され、最終的な為替レートはご利用の銀行またはウォレットによって決まります。
よくある質問
対応している Unity のバージョンは?
Unity 2021.3 LTS 以降(Unity 6 を含む)に対応しています。SDK はサードパーティのライブラリに依存せず、Built-in、URP、HDRP の各パイプラインで動作します。
WebGL やモバイルでも動作しますか?
はい。SDK はスレッドを使用しないため、非同期呼び出しは WebGL、Android、iOS で動作します。すべての非同期メソッドにはコルーチン版も用意されています。
Godot や Web サイトでも使えますか?
はい。メインの SDK は Unity ですが、Godot 4 用のアドオンと、HTML5 ゲーム、Web サイト、Node.js サーバー向けの依存関係のない JavaScript SDK も用意しています。いずれも同じ REST API を使用するため、ほかのエンジンからも直接呼び出せます。
プレイヤーがオフラインのときはどうなりますか?
リモートコンフィグは検証済みのローカルキャッシュから引き続き動作し、ゲストセッションは次回の起動時に復元されます。また、すべての呼び出しは例外をスローせず、エラーコード付きの結果を返します。
プランの上限に達するとどうなりますか?
新しい項目の作成は plan_limit エラーで拒否され、ゲーム内でその内容を表示できます。既存のプレイヤーやデータはそのまま残り、アップグレードするとすぐに上限が引き上げられます。
支払い方法を教えてください。
プランを選び、Midtrans で 1 か月分を支払います。同じプランで再度支払うと、さらに 1 か月延長されます。期間が終了する前に、リマインダーメールをお送りします。
プレイヤーデータを確認・削除できますか?
はい。ダッシュボードにはすべてのプレイヤーのスコア、セーブデータ、ウォレットが表示され、いずれも削除できます。プロジェクトを削除すると、そのデータはすべて削除されます。