跳轉到主要內容
Economy v2 現已正式推出。如需支援和意見反應,請前往 PlayFab 論壇。
Economy v1 (舊版) 具有內建的掉落表功能,可讓您直接在 Game Manager 中定義加權隨機物品分配。Economy v2 不包含原生的掉落表功能,但您可以結合使用 Azure Functions 和 ExecuteInventoryOperations API 來實作相同的行為,而且更具彈性。 本教學課程說明如何建置完整的隨機戰利品系統,該系統可以:
  • 在 Title Data 中定義具有加權物品池的戰利品表。
  • 使用 Azure Function 從戰利品表中隨機抽出物品。
  • 在單一呼叫中,以不可部分完成的方式扣除容器權杖並授與隨機選取的物品。

運作方式

  1. 在 Title Data 中定義戰利品表:將您的掉落表設定 (物品 ID、權重、數量) 以 JSON 格式儲存在 Title Data 中,這樣您就能在不重新部署程式碼的情況下更新它們。
  2. 以虛擬貨幣表示容器:使用與固定內容容器相同的容器權杖模式:以虛擬貨幣作為未開啟的戰利品箱。
  3. 呼叫 Azure Function 以開啟容器:函式會讀取戰利品表、執行加權隨機選取,然後呼叫 ExecuteInventoryOperations,以不可部分完成的方式扣除 1 個容器權杖並新增隨機選取的物品。

必要條件

步驟 1:在 Title Data 中定義戰利品表

將您的戰利品表定義儲存在 Title Data 中,讓設計人員不需要變更程式碼就能更新掉落率。

戰利品表結構範例

建立名為 LootTables 的 Title Data 索引鍵,並使用 JSON 值:
每個戰利品表都包含下列屬性:

設定 Title Data

Game Manager

  1. 前往 Content > Title Data。
  2. 建立名為 LootTables 的索引鍵。
  3. 貼上您的 JSON 戰利品表設定作為值。
  4. 選取 Save。

API

使用 SetTitleData:

步驟 2:建立 Azure Function

建立一個 Azure Function,讓您的遊戲用戶端在玩家想要開啟容器時呼叫。此函式會:
  1. 確認玩家至少擁有一個容器權杖。
  2. 從 Title Data 讀取戰利品表。
  3. 執行加權隨機選取。
  4. 呼叫 ExecuteInventoryOperations,以不可部分完成的方式扣除權杖並授與獎勵。

資料模型

加權隨機選取

完整的 Azure Function

GetContainerCurrencyId 協助程式函式會將戰利品表名稱對應至其對應的容器貨幣 ID。您可以將此對應與戰利品表一起儲存在 Title Data 中,或使用命名慣例。

步驟 3:將容器權杖授與玩家

透過遊戲過程、商店購買或獎勵將容器權杖授與玩家。請使用具有固定內容的容器中所述的相同方法。

步驟 4:從遊戲用戶端呼叫函式

當玩家想要開啟容器時,請使用 ExecuteFunction 呼叫 Azure Function:
回應包含隨機選取的獎勵:

戰利品表設計模式

稀有度層級

權重呈指數遞減的經典稀有度系統:
掉落機率:
  • 普通:約 90.0%
  • 罕見:約 9.0%
  • 稀有:約 0.9%
  • 傳奇:約 0.09%

多次抽選搭配混合獎勵

從混合物品池中提供三個隨機物品的補給箱:

保底 + 隨機 (保底系統)

若要實作「每開啟 10 次保證獲得稀有或更高等級物品」的模式,請在顯示屬性或玩家資料中追蹤玩家的開啟次數,並在達到閾值時於 Azure Function 中覆寫隨機選取。

巢狀掉落表

戰利品表可以依 ID 參照另一個戰利品表。您的 Azure Function 會以遞迴方式解析參照:
函式會檢查 ItemId 是否以 TABLE: 開頭,若是,則會在參照的表上抽選,而不是直接授與該物品。

安全性考量

  • 一律在伺服器端執行戰利品邏輯 (在 Azure Function 中)。永遠不要信任用戶端來決定抽到哪些物品。此方法可防止竄改。
  • 在 ExecuteInventoryOperations 呼叫上使用 IdempotencyId,以防止函式重試時重複授與。如需詳細資訊,請參閱等冪交易和重試。
  • 在扣除之前檢查玩家的庫存,以驗證容器擁有權。如果玩家沒有足夠的權杖,ExecuteInventoryOperations 中的 Subtract 作業會失敗,這會復原整個批次。
  • 記錄所有抽選以供稽核。函式的傳回值和 PlayStream 事件可提供每位玩家所獲得內容的記錄。

另請參閱

最後修改於 2026年10月6日