---
title: 获取用户所拥有物品的信息
slug: world-sdk-guide-ch/dJYspof61DMgKhu1s13PH
docTags: 
createdAt: 2024-09-02T08:34:13.134Z
---

您可以使用 ZEPETO.Module.Shop API 按类别检索当前连接用户的物品信息。



## 安装

窗口 → 包管理器 → 请先安装 ZEPETO.World 包 1.21.14 版本或更高版本。

然后安装 ZEPETO.Module 包 1.0.7 版本或更高版本。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-v7KT8nxqW58e5lNwVb3mB-20240904-102409.png)



## ZEPETO.Module.Shop API

如果您对 ZEPETO.Module.Shop API 感兴趣，请参考文档：

:::hint{type="info"}
**📘&#x20;**&#x8BF7;参考以下指南。 \[[ZEPETO.Module.Shop API](https://developer.zepeto.me/docs/module/namespaces/ZEPETO_Module_Shop)]
:::



## 输出物品信息示例

- 项目 > 创建 > ZEPETO > TypeScript 被创建并且名称更改为 MyItemList。
- 编写如下所示的示例脚本。

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import { ShopService, Category, ItemKeyword } from 'ZEPETO.Module.Shop'
import { ZepetoPropertyFlag } from 'Zepeto'
import { Texture2D, WaitUntil } from 'UnityEngine'
import { RawImage } from 'UnityEngine.UI'
import { Item } from 'ZEPETO.Module.Content'

export default class MyItemList extends ZepetoScriptBehaviour {

    public thumbnailImage: RawImage;

    Start() {
        this.StartCoroutine(this.CoGetMyCategory());
    }

    *CoGetMyCategory() {
        var requestCategory = ShopService.GetMyCategoryAsync();
        yield new WaitUntil(() => requestCategory.keepWaiting == false);

        if (requestCategory.responseData.isSuccess) {
            let categoryInfo = requestCategory.responseData.category;
            console.log(`[分类信息] ${categoryInfo.displayName} - 长度 : ${categoryInfo.categories.Length}`);

            let categories: Category[] = categoryInfo.categories;

            for (const category of categories) {
                console.log(`[分类显示名称] ${category.displayName} `);
                //分类关键字作为 ShopService.GetMyContentItemListAsync 函数的参数
                console.log(`[分类关键字] ${category.keyword} `);
            }
        }
        this.StartCoroutine(this.CoGetMyItem());
    }

    *CoGetMyItem() {
        var requestItemList = ShopService.GetMyContentItemListAsync(ItemKeyword.all, null);

        yield new WaitUntil(() => requestItemList.keepWaiting == false);

        if (requestItemList.responseData.isSuccess) {
            let items: Item[] = requestItemList.responseData.items;

            // 作为 GetMyContentItemListAsync() 结果接收到的物品数量。
            console.log(items.length);

            for (let i = 0; i < items.length; ++i) {
                const property: ZepetoPropertyFlag = items[i].property;
                // 物品 ID 和物品属性
                console.log(`[内容物品] (id): ${items[i].id} | (property): ${property}`);

                // 将物品缩略图设置为 rawImage 的纹理
                var textureReq = items[i].GetThumbnailAsync();
                yield new WaitUntil(() => textureReq.keepWaiting == false);
                let thumbnailTexture: Texture2D = textureReq.responseData.texture;
                this.thumbnailImage.texture = thumbnailTexture;

            }
        }
    }
}
```



::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-RfZmcV0XeKExGRvL2a1zw-20240904-102409.png" size="72" width="512" height="878" position="center" showCaption="false"}



- 脚本描述
  - 获取我的物品标签信息
    - 调用 ShopService.GetMyCategoryAsync() 以了解我的物品标签中的物品类别。
    - 当您成功收到响应时，可以通过 responseData 属性访问 CategoryResponse 对象。
    - CategoryResponse.category.categories 被浏览，输出我的物品标签中的物品类别列表。
  - 获取物品列表
    - 调用 ShopService.GetMyContentItemListAsync(ItemKeyword.all, null) 以获取所有类别的物品列表。
      - 您可以选择仅从某些类别中检索物品。例如，您可以使用 ItemKeyword.hair 而不是 ItemKeyword.all 来仅检索头发物品。
      - 第二个参数仅在您知道下一个页面令牌时使用。第一次调用 API 时将其设置为 null。
        - 有关 nextPageToken 的示例，请查看以下信息。
      - 当您收到成功响应时，可以通过 responseData 属性访问 ContentItemListResponse 对象。
      - ItemResponse.items 被浏览，输出每个物品的 ID 和部分 Enum 代码。
      - 此外，物品缩略图被设置为指定的 rawImage。
- 完成脚本编写后，将脚本添加到场景中的对象。
- 按下播放按钮将显示我的物品标签的类别列表和所有类别的物品信息。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-BVyAKmdqIv8k4UHxTlugk-20240904-102409.png)

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-783f_FvjSzOYlnW88La_s-20240904-102409.png)

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-qXLKSgt4DZu0f5pzTTrdF-20240904-102409.png)

:::hint{type="success"}
- 如果您创建了项目缩略图预制件，并且缩略图是根据项目列表动态创建的，您可以在用户界面上显示项目列表缩略图。
:::



## 检查用户特定物品的拥有状态示例

您可以利用 GetMyContentItemListAsync() 来检查某人在世界上是否穿着特定的衣物。

以下是一个简单的示例，用于在拥有特定物品的用户界面上显示消息。

- 项目 > 创建 > ZEPETO > TypeScript 被创建并且名称更改为 CheckItem。
- 编写如下示例脚本。

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import { ShopService, ItemKeyword } from 'ZEPETO.Module.Shop'
import { ZepetoPropertyFlag } from 'Zepeto'
import { WaitUntil } from 'UnityEngine'
import { Text } from 'UnityEngine.UI'
import { Item } from 'ZEPETO.Module.Content'

export default class CheckItem extends ZepetoScriptBehaviour {

    public resultText: Text;
    public checkItemID: string;

    Start() {
        this.resultText.gameObject.SetActive(false);
        this.StartCoroutine(this.CoCheckItem());
    }

    *CoCheckItem() {
        let nextPageToken: string | null = null;
        do {
            // 请求用户内容物品的列表。
            const requestItemList = ShopService.GetMyContentItemListAsync(ItemKeyword.all, nextPageToken);
            yield new WaitUntil(() => requestItemList.keepWaiting == false);

            if (requestItemList.responseData.isSuccess) {
                // 从响应中获取内容物品。
                const contentItems: Item[] = requestItemList.responseData.items;
                nextPageToken = requestItemList.responseData.nextPageToken;

                // 遍历内容物品。
                for (let i = 0; i < contentItems.length; ++i) {
                    const property: ZepetoPropertyFlag = contentItems[i].property;
                    // 检查物品 ID 是否与指定 ID 匹配。
                    if (contentItems[i].id == this.checkItemID) {
                        // 激活匹配的物品消息。
                        this.ActivateMatchedItem();
                        break;
                    }
                }
            }
            else {
                break;
            }
        } while (nextPageToken != null);
    }

    ActivateMatchedItem() {
        // 显示匹配的物品消息。
        this.resultText.gameObject.SetActive(true);
        this.resultText.text = "哇，你有我制作的物品！";
    }
}
```



- 脚本描述
  - 这是一个浏览已登录用户的“我的物品”列表（所有类别）的脚本，并在检查器中找到输入的匹配物品ID。
  - 如果有很多物品，nextPageToken值不为null。因此，使用do-while语句重复该过程，直到值变为null。
    - 请注意，nextPageToken作为ShopService.GetMyContentItemListAsync(ItemKeyword.all, nextPageToken)的第二个参数提供。
  - 当您收到成功响应时，可以通过responseData属性访问ContentItemListResponse对象。
  - ItemResponse.items被浏览以查找输入的物品ID的匹配项。
  - 如果找到匹配的物品，将调用ActivateMatchedItem()在用户的屏幕上显示文本并结束循环。
- 完成脚本编写后，将脚本添加到场景中的对象。
- 输入您希望检查的物品ID，以查看世界中的用户是否在检查器中拥有该物品。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-15Rw96mLw6kFptBX-hOzt-20240904-102409.png)



- 按下播放按钮以运行该过程。如果用户登录到一个世界并且有与输入的物品ID匹配的物品，屏幕上将显示文本。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-Br0-LUpLTjrs6u07hLMte-20240904-102409.png)



您可以应用此示例来创建各种有趣的内容。
