> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# タイトル マネージド実績の更新

> XblAchievementsUpdateAchievementAsync を使用して、タイトル マネージド XBOX Live 実績の解除や達成の進捗を報告する方法を示す XSAPI サンプル コード。

<a id="top" />

このトピックでは、次の内容について説明します。

* [実績の解除](#unlocking-an-achievement)
* [実績の達成進捗の更新](#updating-an-achievement)

<a id="unlocking-an-achievement" />

## 実績の解除

実績が Partner Center で構成され、開発サンドボックスに公開された後、タイトルは [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync) API を呼び出すことでそれらを解除できます。
詳細は、次のセクションのサンプル コードを参照してください。

実績を解除するには、`percentComplete` を 100 に設定します。
ユーザーがオンラインの場合、リクエストはただちに XBOX services の Achievements サービスに送信され、次のユーザー体験がトリガーされます。

* ユーザーは実績解除通知を受け取ります。
* 指定された実績は、タイトルのユーザーの実績リストで解除済みとして表示されます。
* 解除された実績はユーザーのアクティビティ フィードに追加されます。

<Note>ユーザー体験は、イベント ベースの実績を使用する実績と、タイトル マネージド実績を使用する実績の両方で、視覚的には同じです。</Note>

ユーザーがオフラインの場合、解除リクエストはユーザーのデバイスにローカルにキューイングされます。
ネットワーク接続が再確立されると、リクエストは自動的に Achievements サービスに送信され (これをトリガーするためにゲームからのアクションは不要です)、上記のユーザー体験が説明どおりに発生します。

<a id="updating-an-achievement" />

## 実績の達成進捗の更新

実績の解除に向けたユーザーの進捗を更新するには、[XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync) を呼び出します。`percentComplete` 引数を 1 \~ 100 の整数に設定します。
詳細は、次のサンプル コードを参照してください。

実績の進捗は増加のみが可能です。
`percentComplete` が実績の最後の `percentComplete` の値より小さい数値に設定された場合、更新は無視されます。
たとえば、実績の `percentComplete` が以前に 75 に設定されていた場合、値 25 の更新を送信しても無視されます。実績は引き続き 75 パーセントの達成として表示されます。

`percentComplete` が 100 に設定されている場合、実績が解除されます。

`percentComplete` が 100 を超える数値に設定されている場合、API はその数値を正確に 100 に設定した場合と同じように動作します。

### 現在のタイトルの実績の更新

次のように [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync) を呼び出すことで、現在のタイトルの実績を更新できます。

**Flat C API**

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
    auto result = XAsyncGetStatus(asyncBlock, false);
    if (SUCCEEDED(result))
    {
        // The achievement was updated.
    }
    else if (result == HTTP_E_STATUS_NOT_MODIFIED)
    {
        // The achievement wasn't updated.
    }
    else
    {
        // The achievement failed to update.
    }
};

HRESULT hr = XblAchievementsUpdateAchievementAsync(
    xboxLiveContext,
    xboxUserId,
    achievementId.c_str(),
    percentComplete,
    asyncBlock.get()
);
if (SUCCEEDED(hr))
{
    // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
    asyncBlock.release();
}
```

詳細については、以下を参照してください。

* [XAsyncBlock](/reference/system/xasync/structs/xasyncblock)
* [XAsyncGetStatus](/reference/system/xasync/functions/xasyncgetstatus)
* [XblAchievementsUpdateAchievementAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementasync)

### 別のタイトルの実績の更新

次のように [XblAchievementsUpdateAchievementForTitleIdAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementfortitleidasync) を使用して、別の `titleId` の実績を更新できます。

**Flat C API**

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.
    auto result = XAsyncGetStatus(asyncBlock, false);
    if (SUCCEEDED(result))
    {
        // The achievement was updated.
    }
    else if (result == HTTP_E_STATUS_NOT_MODIFIED)
    {
        // The achievement wasn't updated.
    }
    else
    {
        // The achievement failed to update.
    }
};

HRESULT hr = XblAchievementsUpdateAchievementForTitleIdAsync(
    xboxLiveContext,
    xboxUserId,
    titleId,
    scid,
    achievementId.c_str(),
    percentComplete,
    asyncBlock.get()
);
if (SUCCEEDED(hr))
{
    // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
    asyncBlock.release();
}
```

詳細については、以下を参照してください。

* [XAsyncBlock](/reference/system/xasync/structs/xasyncblock)
* [XAsyncGetStatus](/reference/system/xasync/functions/xasyncgetstatus)
* [XblAchievementsUpdateAchievementForTitleIdAsync](/reference/live/xsapi-c/achievements_c/functions/xblachievementsupdateachievementfortitleidasync)

[このトピックの先頭に戻る。](#top)


## Related topics

- [タイトル マネージド実績のサンプル コード](/ja-jp/services/xbox-services/player-data/achievements/title-managed/how-to/live-achievements-howto-nav.md)
- [タイトル マネージド実績の取得](/ja-jp/services/xbox-services/player-data/achievements/title-managed/how-to/live-how-to-get-achievements.md)
- [タイトル マネージド実績の概念](/ja-jp/services/xbox-services/player-data/achievements/title-managed/concepts/live-achievements-tm-concepts-nav.md)
- [タイトル マネージド実績の概要](/ja-jp/services/xbox-services/player-data/achievements/title-managed/live-achievements-tm-overview.md)
- [タイトル マネージド実績](/ja-jp/services/xbox-services/player-data/achievements/title-managed/live-achievements-tm-nav.md)
