Skip to content

Item

第 4 章 物品處理

4-1 認識遊戲物品

物品(Item)其實就是 SGC 專為線上遊戲所規劃的資料庫服務,依照用途分為三種:

  1. 商品 (Goods)
    商品是遊戲中的寶物或道具,可用來在遊戲內販售,也可以透過Android & IOS平台的內購服務來購買此商品。
  2. 性質 (Property)
    用來讓開發者存放性質的地方,可以用來描述玩家在遊戲中的某些特性,例如:身高、體重等。功能與資料相同,但可以透過SGC的API與資料做區別。
  3. 資料 (Data)
    用來讓開發者存放資料的地方,例如:伺服器的版本號、官方網站的Url等。功能與性質相同,但可以透過SGC的API與性質做區別。

請注意,玩家擁有哪些物品、內容是什麼,這些對其他玩家都是不公開的。以下是玩家與個人後台,對於不同類型物品的可見程度:

物品類型 SGC 網站後台
商品(Goods 可見
性質(Property) 可見
資料(Data) 不可見

4-2 物品管理

物品必須先在 SGC 遊戲管理後台定義,取得物品的 IGUID (Item GUID)後才能在程式中存取。建立新物品時必須填寫以下表單:

表單欄位說明如下:

  • 名稱
    物品的名稱。
  • 說明
    物品的詳細說明。
  • 類型
    分為商品(Goods)、性質(Property)、資料(Data)三種。
  • 公開
    分為公開與不公開兩種。
  • 效期 分為永久有效、固定時間內有效、固定日期前有效三種。
  • 物品屬性
    「物品屬性」是由「屬性名稱」與「屬性值」形成的配對,每個物品可以設定好幾筆屬性資料, 當物品被實例化時,此處所設定的屬性值則是實例物品的預設值。有關於物品實例的詳細說明,請參考下一小節。

物品建立之後,開發者可以再回來物品頁面查看它的 IGUID,這是呼叫 SGC 物品 API 所需要的參數資料。

4-3 物品處裡程式

物品處理的 API 函式都在 CloudItem 類別中,此類別是由靜態函式組成,沒有建構子(Constructor), 也沒有物件屬性(Property),程式設計師要進行與物品相關的處理,請直接叫用這些函式。

接下來所介紹的 API 函式,以下一節的 GetItemClass()為例,程式設計師呼叫時要在前面加上「CloudItem.」,就像這個樣子:

CloudItem.GetItemClass();

4-4 取得特定物品類別(Class)的資料

當開發者在管理後台建立物品後,該物品的類別(Class)就已經建立。由於物品類別的內容對所有玩家來說都是一樣的,所以任何玩家透過 API 函式取得的物品類別的資訊也都會一樣。讀取物品類別的定義資料請使用 GetItemClass(),它的函數定義如下:

static void GetItemClass(CloudGame game, string iguid, OnCallCompletionWithData cb, object token)

參數 cb 是 callback 函式,開發者必須自行撰寫,函式的定義如下:

cb(int code, object data, object token)

GetItemClass()成功取得物品的定義資料時,系統會呼叫開發者自定的 callback,同時傳入 code為零的參數,反之若是作業失敗,code 則為非零。

取得的物品資料放在 callback 的參數 data 裡,存取時先轉型為 List <Hashtable>,不過 List 中只會有一個元素。Hashtable 共有以下 key 值,代表的是物品的定義資料:

Key Value Value 的型別
iguid 物品的 IGUID string
name 物品的名稱 string
desc 物品的描述 string
type 物品類型 1.商品、2.性質、3.資料 int
now 目前伺服器的系統時間,格式為yyyy/MM/dd HH:mm:ss,時區為 UTC string
attr 1.屬性如果這個物品沒有設定屬性,則 Value 為 null。 2.屬性資料為 key=value 以 List Hashtable 存放。3.Hashtable 有兩個 Key:name 屬性名稱、value 屬性值 List Hashtable

4-5 列舉已建立之物品類別(Class)資料

GetItemClass() 有另外一個多載函式可也列舉(Enumerate)已建立的物品類別:
static void GetItemClass(CloudGame game,int option, OnCallCompletionWithData cb, object token)

和先前指定 IGUID 查詢特定物品類別不同的是參數 option,依照 option 值的不同,可以查詢不同類型的物品類別:

option 物品類型
0 所有的「性質」物品
1 所有的「商品」物品
2 所有的「性質」和「商品」物品
3 所有的「資料」物品

查詢後所列舉物品資料將以 callback 函式傳回,型態為 List <Hashtable>,List 中元素就是每一個物品類型的資料。詳細的 List 與 Hashtable 格式的說明請參考上一節。

4-6 物品實例(Instance)

物品類別是所有玩家所共用,物品實例由物品類別產生,也就是經過實例化的過程,產生個別玩家所擁有的物品。

玩家可以建立與刪除物品實例,也可以讀取與修改屬性資料,這些操作都只是在處理個人所擁有的物品,並不會影響到別的玩家的物品。我們可以想像物品實例其實就是物品的複本(Copy),玩家所建立的複本是玩家所個別擁有的,玩家們的複本彼此之間不會互相干擾。

(1) 新增物品實例

玩家要擁有物品實例,首先要建立實例,使用的函數定義如下:

static void NewItemInstance(CloudGame game, string iguid, OnCallCompletionWirhData cb, object token)

其中參數 iguid 就是要新增的物品之 IGUID,callback 函式的定義如下:

void cb(int code, object id, object token)

當 code 為 0 時,表示物品實例已經建立成功,同時 id 為該物品實例之 Instance ID,請將 id 改型為 string;反之,若 code 為非 0 時,表示作業失敗。

請注意,同一個物品類別是可以建立多個物品實例的,每次呼叫 NewItemInstance()就會建立一個新的實例,辨識不同物品實例得靠它們的 Instance ID,必要時程式設計師必須設法儲存個別物品實例的 Instance ID。

(2) 刪除物品實例

刪除物品實例使用的函數如下:

static void DeleteItemInstance(CloudGame game, string iguid, string id, OnCallCompletion cb, object token)

參數 id 就是要刪除的物品實例的 instance id。

callback 函式定義:

void cb(int code, object token)

當 code 為 0 時,表示物品實例已經成功的被刪除了,反之若 code 非 0 時,表示刪除作業失敗。

(3) 讀取物品屬性

指定物品的 IGUID 與物品實例的 Instance ID 就可以讀取該實例的屬性資料,讀取物品屬性的函式定義如下:

static void GetItemInstanceAttribute(CloudGame game, string iguid, string id, string attrName,OnCallCompletionWithData cb, object token)

當中的參數 id 就是物品的 Instance ID,attrName 就是要讀取的屬性名稱。

函式執行完成後觸發的 callback cb 的定義如下:

void cb(int code, object obj, object token)

當 code 為零時表示成功,非零表示失敗。如果是執行成功,請將參數 obj 改型(case)為Hashtable, 共有以下 Key 值,代表的屬性的資料:

Key 說明
name 屬性名稱,也就是參數attrName
value 屬性值
stamp 寫入此屬性的時間
now 目前伺服器的系統時間,格式為yyyy/MM/dd HH:mm:ss,時區為 UTC

(4) 修改物品屬性

修改已建立實例的物品則是使用 SetIemInstanceAttribute() 函式,定義如下:

void SetItemInstanceAttribute(CloudGame game, string iguid, string id, string attrName, string attrValue, OnCallCompletion cb, object token)

參數 id 就是要刪除的物品實例的 instance id,attrName 就是要修改的屬性名稱,attrValue 就是屬性修改後的值。

函式執行完成後觸發的 callback cb 的定義如下:

void cb(int code, object token)

當 code 為零時表示成功,非零表示失敗。

4-7 In-App Purchase 與 In-App Billing

In-App Purchase 是 iOS 設備的 App 應用程式內直接購買商品的機制,有兩種做法:

  1. Build-in Product Delivery 這是一種不安全的交易方式,在此略過。
  2. Server Product Delivery 流程中的(1)到(9)步驟,開發者必須透過 XCODE 製作程式,詳細內容請參考 iOS Developer 網站。在取得交易收據「receipt-data」後,透過 SGC 所提供伺服器執行步驟(10)至(14),以驗證 receipt-data 是否為合法交易的收據資料。 驗證方法很簡單,只要呼叫 CloudShop.CommitInAppPurchase()即可,函式定義如下: public static void CommitInAppPurchase(CloudGame game, string iguid, int type, string receipt, OnCallCompletion cb, object token) 參數 type 指定購買方式,0 為 sandbox(測試用),1 則為實際購買。

參數 receipt 就是從 App-Store 中傳回的交易收據資料(receipt-data)。驗證完成後將會呼叫 callback 函式 cb,其函式定義為: void cb(int code)

驗證成功,code 為 0;反之,失敗則 code 為非 0。 除了 iOS 外,Android 系統也有內置購買服務,由於 Android 市集不像 iOS 只有 Apple 獨家提供,目前 SGC 支援 Goole 官方提供的 Google Play 市集的內置購買之收據驗證服務,開發者只要將購買完成後取得的收據資料透過 CloudShop.CommitInAppBilling()函式提交,驗證無誤後系統為此商品新增一個物件實例。函式定義如下: public static void CommitInAppBilling(CloudGame game, string iguid, int type, string receipt, string signature, OnCallCompletion cb, object token)

由於 Google Play 除了會傳回收據資料以外,還會有個電子簽章資料,都要一併提交驗證,因此這個函式多了個 signature 參數,其餘用法都和 iOS 的 CommitInAppPurchase()函式一樣。