開発
開発
プラットフォームを選択

アチーブメント

更新日時: 2026/03/18
Notice of feature support change
スコアボードアプリは、2024年12月20日をもって正式に廃止されました。この変更により、アチーブメントAPIを使用している既存のアプリに影響が生じることはありません。
This is a Platform SDK feature requiring Data Use Checkup
この機能や他のPlatform SDK機能を利用するには、データの使用状況の確認(DUC)を完了する必要があります。DUCは、開発者ポリシーを遵守していることを確認するためのものです。チームの管理者は、ユーザーデータの利用がプラットフォームガイドラインに沿っていることを証明する必要があります。アプリレビューチームがDUCを審査して承認するまで、プラットフォームの機能はテストユーザーのみが利用できます。
Apps for children can't use Platform SDK features
開発中のアプリを13歳未満の子どもを主なユーザーとして自己認証する場合は、Platform SDK機能は使わないようにする必要があります。この制限は、年齢別ガイドラインを遵守するためのものです。確実に遵守するため、アプリのデータの使用状況の確認は無効になっています。
トロフィー、バッジ、賞などを作成して、ユーザーが目標や目的を達成するように促します。ユーザーは友達が達成したアチーブメントを確認できるため、友達同士で競うことができます。アプリで達成したアチーブメントをMeta Questホームに表示して、ゲームでのユーザーの上達や達成状況を表示することもできます。このガイドでは、グローバルアチーブメントを定義する方法、アチーブメントサービスとやり取りするために実行可能なSDKメソッドとサーバー間呼び出し、確認できるUnity実装の例について説明します。
Meta Horizonプラットフォームは、アチーブメントをトラッキングして管理します。また、アチーブメントがロック解除されると、トースト通知を表示しサウンドを再生します。アプリはアチーブメントのトリガーとアップデートを管理し、ユーザーにアチーブメントを表示します。

アチーブメントの作成

ゲームにアチーブメントを追加する最初のステップは、アチーブメントとアチーブメントをロック解除する方法を定義することです。アチーブメントを作成するには、次のようにします。
  1. [Developer Dashboard (開発者ダッシュボード)] > [Engagement (エンゲージメント)] > [Achievements (アチーブメント)]に移動します。
  2. [Create Achievement (アチーブメントの作成)]を選択し、以下の情報を入力します。
    • API Name (API名) - アプリでアチーブメントを参照するために使用する一意の文字列。API名では大文字と小文字が区別されます。ダッシュボードで定義する名前は、コードで参照する名前と正確に一致する必要があります。
    • Localization and Manage Languages (ローカライゼーションと言語の管理) - (任意)アチーブメントを作成する際には、アチーブメントを複数言語にローカライズすることを選択できます。アチーブメント情報の入力時に、[Manage Languages (言語の管理)]を選択し、ローカライズする言語のボックスをチェックして、選択した言語用の情報を入力します。ユーザーに表示される言語は、ユーザーが使用するデバイスのOSに設定されたロケールに従います。
      User Data Warning
      個人を特定するどんな情報も使用しないようにしてください。
    • Title (タイトル) - ユーザーに表示される短い説明的な名前。
    • Description (説明) - アチーブメントの完全な説明。どうすればユーザーがこのアチーブメントをロック解除したり達成したりできるかを説明できます。
    • Unlocked Description (ロック解除後の説明) (任意) - これは、ユーザーがアチーブメントをロック解除した後に[Description (説明)]の代わりに表示されます。
    • Locked and Unlocked Icons (ロックアイコンとロック解除アイコン) (任意) - アチーブメントに関連付けられたアイコン。アチーブメントを達成していないユーザーにはロックされたアイコンが表示され、アチーブメントを達成したユーザーにはロック解除されたアイコンが表示されます。ロック解除アイコンしか設定していない場合は、ロック解除アイコンがグレースケール表示されたものがロックアイコンになります。どちらも設定していない場合は、デフォルトのアイコンが使用されます。
    • 書き込みポリシー - 次の2つの書き込みポリシーオプションのいずれかを選択します。
      • [Client Authoritative (クライアント権限)]はデフォルト設定で、これが選択されているときは、クライアントアプリからアチーブメント達成状況を書き込みまたはロック解除できます。
      • [Server Authoritative (サーバー権限)]が選択されている場合は、以下に示すS2S APIを使用することによってのみ、アチーブメントの書き込みまたは更新をすることができます。これは通常、信頼できるサーバーでゲームセッションが実行されているときに、不正行為を減らすために使用されます。アチーブメント情報と達成状況は、クライアントアプリから引き続き照会できます。
    • Is Achievement Secret (アチーブメントシークレットである) - これは、[はい]または[いいえ]を切り替えるトグルで、アチーブメントが完全に達成またはロック解除されるまで、アチーブメントタイトル、説明、アイコン、達成状況を非表示にするかどうかを選択します。デフォルトの選択は[いいえ]です。
    • Type (タイプ) - Meta Questプラットフォームは、simple、count、bitfieldの3タイプのアチーブメントをサポートしています。それぞれのアチーブメントタイプのロック解除の仕組みは異なります。
      • simpleアチーブメントは達成するかしないかのどちらかです。1つのイベントまたは目的を達成すると、ロックが解除されます。例えば、simpleアチーブメントは、プレイヤーが山の頂上に到達するとロック解除されます。
      • countアチーブメントは、カウンターが定義された目標に達するとロック解除されます。このアチーブメントをトリガーするために到達する必要のあるターゲットを決めます。例えば、ターゲットが10に設定されたcountアチーブメントの場合、プレイヤーが3人(10未満の任意の数)のゾンビを倒すとロック解除途中の状態になり、プレイヤーが10人のゾンビを倒すとロック解除されます。
      • bitfieldアチーブメントは、ビットフィールドのビットのターゲット数値が設定されるとロック解除されます。このアチーブメントをトリガーするターゲットとビットフィールド長を定義します。例えば、ターゲットが5のbitfieldアチーブメントの場合、bitfield_progressが「000110」ならロック解除途中にあり、bitfield_progressが「111110」になるとロック解除されます。
  3. 完了したら[Publish (公開)]を選択して、アチーブメントを保存します。アチーブメントは開発者ダッシュボードでいつでも更新できます。
: アチーブメントはいつでもアーカイブできます。アーカイブしても、アチーブメントやユーザーの達成状況は削除されるのではなく、非表示になるだけです。アチーブメントのアーカイブを解除すると、再び表示されます。

アチーブメントの統合

アチーブメントの作成が完了したら、それらのアチーブメントをゲームに統合できます。このセクションにある関数を呼び出すときは、開発者ダッシュボードで指定したアチーブメント名を使用してください。
クライアントアプリから以下のSDKメソッドを呼び出すことができます。詳しくは、Platform SDKのリファレンスコンテンツをご覧ください。
タスクの説明関数
特定のアチーブメントについて、アチーブメント名、タイプ、ターゲットまたはビットフィールド長などの情報を取得します。
Platform.Achievements.GetDefinitionsByName()
特定のアチーブメントについて、ユーザーの進捗状況(名前、ロック解除されたステータス、アチーブメントがロック解除された時刻、現在のビットフィールド、現在のカウントなど)の情報を取得します。
Platform.Achievements.GetProgressByName()
すべてのアチーブメントについて、アチーブメント名、タイプ、ターゲットまたはビットフィールド長などの情報を取得します。
Platform.Achievements.GetAllDefinitions()
すべてのアチーブメントについて、ユーザーの進捗状況(名前、ロック解除されたステータス、アチーブメントがロック解除された時刻、現在のビットフィールド、現在のカウントなど)の情報を取得します。
Platform.Achievements.GetAllProgress()
クライアント権限書き込みポリシーが設定されたアチーブメントに対しては、次のSDKメソッドを呼び出すことができます。アチーブメントにサーバー権限が設定されている場合は、以下のセクションで説明されているS2S REST呼び出しを使用して、信頼できるサーバーから更新する必要があります。
タスクの説明関数
指定したアチーブメントをロック解除します。目標を達成していなくても、countアチーブメントやビットフィールドアチーブメントを完全にロック解除します。
Platform.Achievements.Unlock()
countアチーブメントのカウントを増やします。
Platform.Achievements.AddCount()
Bitfield型のアチーブメントのビットの1つまたは複数ビットをロック解除します。一度ロック解除したビットの状態を、後で変更することはできません。例えば、ビットフィールドが10011の場合、AddFieldsに00110を渡して呼び出すと、結果の状態は10111になります。
Platform.Achievements.AddFields()

実装の例

Unityの次の例は、定義したイベントでロック解除するアチーブメントの設定方法を示しています。次の例は、VRHoopsサンプルアプリから取得したものです。Unity用のMeta Quest統合パッケージにサンプルがあります。詳しくは、サンプルアプリをご覧ください。
この例ではまず、開発者ダッシュボードで設定されたLIKES_TO_WINというアチーブメントを定義します。次に、更新メッセージをチェックしてアチーブメントがロック解除されているかどうかを確認し、trueの場合アプリでアチーブメントのロック状態を解除します。true以外の場合、ゲームは続行し、ゲームの条件が満たされた場合(この例では勝利が記録された場合)にアチーブメントのカウントがインクリメントされます。
using UnityEngine;
using System.Collections;
using Oculus.Platform;
using Oculus.Platform.Models;

public class AchievementsManager : MonoBehaviour
  {
    // API NAME defined on the dashboard for the achievement
    private const string LIKES_TO_WIN = "LIKES_TO_WIN";
    // true if the local user hit the achievement Count setup on the dashboard
    private bool m_likesToWinUnlocked;

    public bool LikesToWin
    {
        get { return m_likesToWinUnlocked; }
    }

    public void CheckForAchievmentUpdates()
    {
        Achievements.GetProgressByName(new string[]{LIKES_TO_WIN}).OnComplete(
            (Message<AchievementProgressList> msg) =>
            {
                foreach (var achievement in msg.Data)
                {
                    if (achievement.Name == LIKES_TO_WIN)
                    {
                        m_likesToWinUnlocked = achievement.IsUnlocked;
                    }
                }
            }
        );
    }
    public void RecordWinForLocalUser()
    {
        Achievements.AddCount(LIKES_TO_WIN, 1);
        CheckForAchievmentUpdates();
    }
}

サーバーアチーブメントに対するRESTリクエストの実行

アチーブメントを[Server Authoritative (サーバー権限)]に設定している場合、アチーブメントを増分してロックを解除するには、信頼できるサーバーからMeta QuestサービスにAPI呼び出しを実行する必要があります。Meta Quest REST APIの操作方法については、「サーバー間APIの基本」ページを参照してください。

アチーブメントの作成または更新(POST)

新しいアチーブメントを作成したり、既存のアチーブメントを更新したりする場合に使用します。これを実行すると、すべてのユーザーのアチーブメントが更新されます。
リクエストメソッド/URL:
POST https://graph.oculus.com/$APPID/achievement_definitions
パラメーター:
パラメーター必須/任意説明
access_token
必須
OC|$APP_ID |$APP_SECRETを含むベアラトークン
文字列
“OC|1234|456789”
api_name
必須
このAPIおよびクライアントSDKでアチーブメントを参照するために使用する名前。この英数字の文字列は、アプリに対して一意でなければなりません。アチーブメントが存在する場合は、この呼び出しによってアチーブメントが更新されます。存在しない場合は、この名前のアチーブメントが作成されます。
文字列
“VISIT_3_CONTINENTS”
achievement_type
必須
これはアチーブメントタイプです。アチーブメントには次の3つのタイプがあります。それぞれのタイプについては、上記の説明を参照してください。
列挙。有効な値: SIMPLE、COUNT、BITFIELD
“SIMPLE”
achievement_write_policy
必須
アチーブメント達成状況を書き込むことができるユーザーを決定します。2つの異なる書き込みポリシーについては、上記の説明を参照してください。
列挙。有効な値: CLIENT_AUTHORITATIVE、SERVER_AUTHORITATIVE
“CLIENT_AUTHORITATIVE”
target
achievement_typeがcountまたはbitfieldの場合は必須です
ロック解除するアチーブメントのイベント発生回数。ターゲットについて詳しくは、上記の説明を参照してください。
整数
50
bitfield_length
アチーブメントがビットフィールドの場合は必須です
このアチーブメントのビットフィールドのサイズ。
整数
7
is_archived
任意。デフォルトはfalseです。
アチーブメントがアーカイブされているかどうかを示すブーリアン。アチーブメントのアーカイブを解除する場合にも使用できます。アーカイブ時にはアチーブメントやユーザーの進捗は削除されません。
ブーリアン
“false”
title
必須
ユーザーに表示されるアチーブメントの名前。
文字列
“3大陸の訪問を果たした”
description
必須
ユーザーに表示される説明テキスト。
文字列
“このアチーブメントがロック解除されるのは、...”
unlocked_description _override
任意
アチーブメントがロック解除されるときにユーザーに表示されるテキストの説明。
文字列
“おめでとうございます!3大陸の訪問を達成しました。”
is_secret
任意 - デフォルトはfalseです。
達成されない間はアチーブメントを非表示にしておくかどうかを示すブーリアン。
ブーリアン
“false”
unlocked_image_file
任意 - デフォルトイメージが使用されます。
アチーブメント達成後に表示されるアイコンのローカルパス。256x256 PNGファイルでなければなりません。
文字列
”@/path/to/unlocked_icon.png; type=image/png”
locked_image_file
任意 - ロック解除済みの画像が提供されている場合は、その画像のグレースケール表示されたものがロックの画像として使用されます。画像が提供されていない場合は、デフォルトが使用されます。
アチーブメント未達成のときに表示されるアイコンのローカルパス。256x256 PNGファイルでなければなりません。
文字列
”@/path/to/locked_icon.png; type=image/png”
作成/更新リクエストの例
curl -X POST -d "access_token=OC|$APP_ID|$APP_SECRET" -d "api_name=VISIT_3_CONTINENTS" -d "achievement_type=BITFIELD" -d "achievement_write_policy=SERVER_AUTHORITATIVE" -d "target=3" -d "bitfield_length=7" -d "is_archived=false" -d "title=Achievement Title" -d "description=How to earn me" -d "unlocked_description_override=You did it" -d "is_secret=false" -d "locked_image_file=@/path/to/locked_icon.png;type=image/png" -d "unlocked_image_file=@/path/to/unlocked_icon.png;type=image/png" https://graph.oculus.com/$APPID/achievement_definitions
応答の例
{"id":"1074233745960170"}

アチーブメント定義の取得(GET)

アチーブメント定義のクエリを使用すると、ユーザーに表示するアチーブメントに関する情報を取得できます。
リクエストメソッド/URL:
GET https://graph.oculus.com/$APPID/achievement_definitions
パラメーター:
パラメーター必須/任意説明
access_token
必須
OC|$APP_ID |$APP_SECRETを含むベアラトークン
文字列
“OC|1234|456789”
api_names
任意
取得するアチーブメント定義の名前。省略すると、すべてのアチーブメント定義が返されます。
文字列の配列
[“VISIT_3_CONTINENTS”, “WALK_500_MILES”]
include_archived
任意
アーカイブされたアチーブメントを含めるかどうかを示すブーリアン。これは、アプリアクセストークンを使用して認証する場合にのみ使用できます。
ブーリアン
“false”
fields
任意
取得するフィールド名のコンマ区切りリスト。以下を含めることができます: api_nameachievement_typeachievement_write_policytargetbitfield_lengthis_archivedtitledescriptionunlocked_description_overrideis_secretlocked_image_uriunlocked_image_uri。省略すると、IDのみが返されます。
文字列
“api_name,achievement_type”
フィールド定義は、上記の作成API呼び出しまたは更新API呼び出しと同じです。ローカルファイルの場所ではなく、サーバーイメージのURIが提供されます。
リクエストの例
curl -X GET "https://graph.oculus.com/$APP_ID/achievement_definitions?fields=api_name,achievement_type,achievement_write_policy,target,bitfield_length,is_archived,title,description,unlocked_description_override,is_secret,locked_image_uri,unlocked_image_uri&api_names=\[\"VISIT_3_CONTINENTS\"\]&access_token=OC\|$APP_ID\|$APP_SECRET"
応答の例
{
    "data": [{
        "id": "1074233745960170",
        "api_name": "VISIT_3_CONTINENTS",
        "achievement_type": "BITFIELD",
        "achievement_write_policy": "SERVER_AUTHORITATIVE",
        "target": 3,
        "bitfield_length": 7,
        "is_archived": false,
        "title": "Achievement Title",
        "description": "How to earn me",
        "unlocked_description_override": "You did it",
        "is_secret": false,
        "locked_image_uri": "https://scontent.oculuscdn.com/...",
        "unlocked_image_uri": "https://scontent.oculuscdn.com/..."
    }]
}

アチーブメント進捗状況の書き込み(およびロック解除) (POST)

アチーブメント達成状況の書き込みを実行すると、ユーザーのアチーブメント達成状況が更新されます。このメソッドはcountタイプのアチーブメントの達成状況を積み上げていくものであって、値を上書きするものではありません。例えば、add_count=25は、現在のカウントを25に設定するのではなく、カウントに25を足して増やします。この方法により、複数のソースからアチーブメントが同時に更新されたり、複数のデバイスがオフラインモードで進行していたりする場合に発生する競合を適切に処理することが可能となります。
リクエストメソッド/URL:
POST https://graph.oculus.com/$USER_ID/achievements
パラメーター:
パラメーター必須/任意説明
access_token
必須
OC|$APP_ID |$APP_SECRETを含むベアラトークン
文字列
“OC|1234|456789”
api_name
必須
更新するアチーブメント定義の名前。
文字列
“VISIT_3_CONTINENTS”
add_count
アチーブメントがcountタイプの場合は必須です。
このアチーブメントの達成状況カウンターに追加する値。COUNTアチーブメントにのみ有効です。
整数
25
add_bits
アチーブメントがbitfieldタイプの場合は必須。
このアチーブメントの進捗に追加するビット。BITFIELDアチーブメントにのみ有効です。
文字列
“110001”
force_unlock
任意 - デフォルトはfalseです。
進捗状況に関係なく、直ちにアチーブメントをロック解除します。これは、常にSIMPLEアチーブメントをロック解除するために使用します。
ブーリアン
“false”
リクエストの例
curl -X POST -d "access_token=OC|$APP_ID|$APP_SECRET" -d "api_name=MY_ACHIEVEMENT" -d "add_count=25" -d "force_unlock=true" https://graph.oculus.com/$USER_ID/achievements
応答の例
{"id":"1074233745960170","api_name":"MY_ACHIEVEMENT","just_unlocked":true}
応答には、この操作によってアチーブメントがロック解除されたかどうかを示すパラメーターjust_unlockedが含まれます。

アチーブメント進捗状況のクエリ(GET)

ユーザーのアチーブメント達成状況を取得します。
Request method/URI:
GET https://graph.oculus.com/$USER_ID/achievements
パラメーター:
パラメーター必須/任意説明
access_token
必須
OC|$APP_ID |$APP_SECRETを含むベアラトークン
文字列
“OC|1234|456789”
api_names
任意
取得するアチーブメント定義の名前。省略すると、すべてのアチーブメント定義が返されます。
文字列の配列
[“VISIT_3_CONTINENTS”, “WALK_500_MILES”]
fields
任意
取得するフィールド名のコンマ区切りリスト。リストには、idunlock_timeis_unlockedcount_progressを含めることができます。省略すると、IDのみが返されます。
文字列
“api_name,achievement_type”
リクエストの例
curl -X GET "https://graph.oculus.com/$USERID/achievements?access_token=OC\|$APP_ID\|$APP_SECRET&api_names=\[\"VISIT_3_CONTINENTS\"\]&fields=target,bitfield_progress,is_unlocked,unlock_time"
応答の例
    {
    "data": [{
        "id": "1074233745960170",
        "bitfield_progress": "1001100",
        "is_unlocked": true,
        "unlock_time": 1459815726
    }]
 }

ユーザーのアチーブメントと達成状況をすべて削除(POST)

このメソッドは、ユーザーのすべてのアチーブメント進捗状況(ロックとロック解除の両方)を削除します。
リクエストメソッド/URI:
POST https://graph.oculus.com/achievement_remove_all
パラメーター:
パラメーター必須/任意説明
access_token
必須
OC|$APP_ID |$APP_SECRETを含むベアラトークン
文字列
“OC|1234|456789”
user_id
必須
削除するアチーブメントのユーザーID。
文字列
“12345”
リクエストの例
curl -X POST "https://graph.oculus.com/achievement_remove_all?user_id=$USER_ID&access_token=OC\|$APP_ID\|$APP_SECRET"
応答の例
{"success":true}

トラブルシューティング

サーバーアチーブメントのRESTリクエストの実行で言及されているAPIではうまくいかない場合、どうすればよいですか?
アチーブメントのための書き込みポリシーがサーバー権限であることをダブルチェックします。クライアント権限の場合、それらのRESTリクエストは動作しません。アチーブメントを操作するには、SDKメソッドを使う必要があります。
書き込みポリシーがサーバー権限なのに、RESTリクエストが動作しない場合、どうすればいいですか?
$APPID$APP_SECRETなどの$VARを、実際の値で置き換えてあるかどうかチェックする必要があります。実際の値は、[Developer Center (開発者センター)] > [Development (開発)] > [API]にあります。
ナビゲーションロゴ
日本語
© 2026 Meta