SKYXY客服
x
第三章 arcalet教程 - 後台物品屬性管理 | skyxy
快速建站
︿
TOP
首頁 > 入門學習 > 文章內容
第三章 arcalet教程 - 後台物品屬性管理
7/12/2016
瀏覽數:519
沈夜
3.0 讀取後台物品屬性
arcalet 最大的好處是提供了直接存取與讀取資料。在後台設定好後,能直接通過api的方式獲取資料。
ArcaletItem
此物件類別用來管理遊戲中的物資,開發者可於 arcalet 的開發者後台 ( http://developer.arcalet.com ) 定義遊戲所需的各種物資類別 ( Item Class ) ,再利用此物件類別中的 Method 來處裡遊戲中所需的物資。
後台設定:
佈署一
創建物品可命名為「玩家資訊」,把物品類型定義為「資料」。在物品屬性的欄位裡面設定您想要的屬性(可參考圖中的設定)。
佈署二
物品讀寫的權限需要在「權限管理」的項目內進行設定,請參考圖中的選項設定並且記得點擊「儲存」。
PS:關於 “超級使用者賬號” 的使用方法會在文章後面提到怎麼使用。
讀取ItemClass資料
arcalet 讀取item的方法有幾種,我們先以 arcalet item class 作為學習。
item class 的特性是只要在後台修改資料,再讀取就能直接抓到這筆資料。
由於直接能在後台做修改,所以非常適合用在全面性性質的資料,如:
1. 遊戲廣播 (喇叭)
2. 新聞提示
3. 版本控管
Api:
item class 還擁有其他使用方法,開發者也能到以下連接查詢。
http://developer.arcalet.com/tutorials/index.asp?maintitleclass=8&dirid=243&l=tw
Code:
C#
/*******************************************************************
	 * 取得的資料型態為 List<HashTable>
	 * 需要資料格式的轉換 
	*******************************************************************/
    void GetItemClass()
    {
         ArcaletItem.GetItemClass(ag, iguid, CB_GetItemClass, null);
    }

    void CB_GetItemClass(int code, object data, object token)
    {
        //Code為0表示取得資料成功
        if (code == 0)
        {
            Debug.Log("GetItemClass Successed");

            //將取得的資料轉成int
            List<Hashtable> list = data as List<Hashtable>;

            //因為ItemClass只會有一個item 所以只取第一個
            //把 Item列表 從 attr 裡提取出來
            List<Hashtable> attr_ht = list[0]["attr"] as List<Hashtable>;

            foreach (Hashtable item in attr_ht)
            {
                string Key = item["name"].ToString();
                string Value = item["value"].ToString();

                Debug.Log(string.Format("Get Item Key:{0} ,Value:{1}", Key, Value));
            }
        }
        //Code非0表示取得資料失敗
        else
        {
            Debug.LogWarning("GetItemClass Failed - Error:" + code);
        }
    }
Ps: 若要在unity中使用 List 必須在開頭加上 using System.Collections.Generic
輸出:
此篇範例位置: 
Assets\Scene\3\3.0_GetItem
3.1 實例化物品
在上一篇我們提到了如何使用 item class 抓取後台資料,現在我們使用 item instance(實列化)的方式去實做。

實例化後的物品就等同於把該物件綁定在該用戶的帳號上,常見的用法就是玩家的個人遊戲資料。如:
1. 卡片遊戲中同一張卡片但不同屬性的卡片
2. RPG遊戲中不同屬性的武器
3. 養成遊戲中不同種類的寵物
在使用實例化物品時,需要先新增一筆屬於玩家的物品,我們可以使用api 或 自動實例化的方式產生物品。
Api:
Code:
C#
void NewItemInstance(string _iguid)
    {
       ArcaletItem.NewItemInstance(ag, _iguid, CB_NewItemInstance, null);
    }

void CB_NewItemInstance(int code, object data, object token)
    {
        //Code為0表示建立資料成功
        if (code == 0)
        {
            int itemID = (int)data;
            Debug.Log("NewItemInstance Successed itemID:" + itemID);
        }
        //Code非0表示建立資料失敗
        else {
            Debug.LogWarning("NewItemInstance Failed - Error:" + code);
        }
    }
執行畫面:
此篇範例位置: 
Assets\Scene\3\3.1_GetItemInstance
3.2 讀取實例化物品
上一篇我們學到了如何創建物品,這一篇我們學習如何讀取建立好的物品。
創建好的物品類似一把鑰匙串,裡面串的鑰匙就是所謂的物品列表,並且鑰匙上都會附帶屬於自己的編號(itemID),而這串鑰匙串的名字就是一個 Iguid。
只要我們有Iguid與 itemID ,我們可以隨時修改鑰匙裡的物品列表,或增加新的鑰匙。
Api:
PS: 必須要先實例化過物品,才有辦法讀取,不過我們也能利用另外一個 overloading 去 autonew 自動創建一個 (只限沒有的時候會自動創建)
AutoNew Api:
Code:
C#
void GetItemInstance(string _iguid,OnCallCompletionWithData _CB_GetItemInstance)
    {
         ArcaletItem.GetItemInstance(ag, iguid, CB_GetItemInstance, null);
    }

    void CB_GetItemInstance(int code, object data, object token)
    {

        if (code == 0)
        {
         Debug.Log("GetItemInstance Successed");

            //將取得的資料轉成int
            List<Hashtable> list = data as List<Hashtable>;

            Debug.Log("list count:" + list.Count);

            //沒有則直接返回
            if (list.Count == 0)
                return;

            //因為Iteminstance會有不止一個實例化列表 所以要跑迴圈提取
            foreach (Hashtable attr_ht in list)
            {
                int ItemId = int.Parse(attr_ht["id"].ToString());   //取得此列表的itemID
               
                Hashtable attrlist = attr_ht["attr"] as Hashtable;  //取得item列表並轉成hastable格式
              
                foreach (DictionaryEntry item in attrlist)    //迴圈取得hastable裡面的item
                {
                  
                    string Name = item.Key.ToString();    //item的名字
                  
                    Hashtable ValueH = item.Value as Hashtable;    //因為item裡面會有其他資訊 所以我們必須再把它轉成hastable再提取出來
               
                    string Value = ValueH["value"].ToString();       //屬性值在value裡面

                    Debug.Log(string.Format("Get Item Name:{0} ,Value:{1}", Name, Value));
                }
            }

        }
        //Code非0表示取得資料失敗
        else {
            Debug.LogWarning("GetItemInstance Failed - Error:" + code);
        }
    }
執行畫面:
此篇範例位置: 
Assets\Scene\3\3.1_GetItemInstance
PS: 由於這個範例裡並沒有對實例化出來的物件做修改,所以全部實例化的物品都是一樣屬性的。(根據後台設定)

下一篇,我們繼續學習如何使用api 達到修改與寫入物品的功能。
3.3 寫入實例化物品
學到了如何讀取物品後,我們再針對讀取到的物品做修改。
當讀取物品後,我們會取得其中的itemID 與 屬性名稱,有了這2個數值我們就能對其做寫入功能。

PS:如果後台沒有打開一般玩家可以修改的選項,會導致修改失敗。
Api:
Code:
C#
/*******************************************************************
	 *要將資料寫入Item必須有iguid跟itemID
	*******************************************************************/
	void SetItemAttribute(int itemID,string name,string ivalue) 
	{
		ArcaletItem.SetItemInstanceAttribute(ag, iguid, itemID, name, ivalue, 
		 CB_SetItemAttribute, name);
	}
	
	void CB_SetItemAttribute(int code, object token) 
	{
		//Code為0表示寫入資料成功
		if(code == 0) {
			string attr = token.ToString();
			Debug.Log("SetItemAttribute : " + attr + " Successed");
		}
		//Code非0表示寫入資料失敗
		else {
			Debug.LogWarning("SetItemAttribute Failed - Error:" + code);
		}
	}	
執行畫面:
此執行畫面有包含了 newitem 與 getitem,並且 setitem 後並沒有自動獲取,主要是要讓開發者知道修改數值後必須再次getitem才會更新成最新資料。雖然抓取item的速度非常快,但如果遇到網速緩慢的客戶端,可能無法立即更新。
所以為了防止很頻繁的重複抓取,開發者可以在修改數值時順便儲存在本機端中,等需要重新登入的時候再次抓取就好了。
此篇範例位置: 
Assets\Scene\3\3.2_SetItemInstance
1
2
3
 18_2016072915944.zip  (3.78 MB)
您也可能喜歡這些文章
留言給作者
不公開此留言     登入即可留言
讀者留言
載入更多留言