SKYXY客服
x
想讓arcalet變成Unity的套件工具 | skyxy
快速建站
︿
TOP
首頁 > 研究專題 > 文章內容
想讓arcalet變成Unity的套件工具
9/11/2016 2:38:43 AM
瀏覽數:2311
沈夜
arcalet 提供了許多功能可以供開發者使用,但有些地方還是會用起來比較麻煩,比如一些callback回來的data 需要查詢文件才能知道是什麼樣的類型。所以我寫了一個可以讓arcalet 更好用的工具,方便大家更好更快的使用arcalet。
arcaletTools dll 初始化
這個工具是使用 dll 去完成的,主要是不想讓 Unity 環境看起來跟繁雜。(太多腳本)
附件即可下載,另外這個dll的使用方法與原有arcalet.dll 一樣,直接拖進去到unity裡就可以使用了,unity會自動解析。

另外,由於通常很少會讓玩家在同個時間內登入多個帳號,所以 ArcaletTool 的一些功能只能使用預先設定好的 guid,例如不需要輸入gguid 的method 都是使用預先載入好的guid。

由於這個tools 需要借助初始化的方式產生物件,所以我們需要在要使用這個tools的的腳本上寫上:
C#
void InitBuilder()
    {
        //初始化ArcaletTool
        ArcaletTool.BuilderInit();

        //定義 GUID
        ArcaletTool.mainGguid = "";
        ArcaletTool.mainSguid = "";
        ArcaletTool.mainCertificate = new byte[] { };
    }

void Start()
{
        InitBuilder();
}


這樣做就能讓場景產生一個 arcalettools的物件,就能很方便的管理數據 (會自動產生)
目前可用的Tools:(會逐漸增加功能)
C#
public static ArcaletGameEx Game; 
public static ArcaletItemEx Item;
public static ArcaletSceneEx Scene;
註冊帳號(系統取得):
系統註冊的方式與之前沒有太大差別,主要是不需要開發者自己再轉換格式。

程式碼:
C#
public static void RegistedAccount(object token, OnRegistedComplete OnComplete); //token為開發者自己定義的物件,作為返回值的一個指標

void RegistedAccount()
    {
        Debug.Log("Registed New Account");
        ArcaletSystemEx.RegistedAccount("", (IRegistedResult result) =>
         {
             Debug.Log(result.userid);
             Debug.Log(result.pass);
         });
        
    }
登入遊戲簡化
ArcaletGameEx

ArcaletGameEx 是一個針對ArcaletGame 強化的class,裡面已經有寫好許多好用的功能在其中。並且在使用時會自動產生在場景上,方便玩家管理與修改。

以往要編寫登入遊戲部分的時候我們需要較長的程式碼才能達到此功能,所以我簡化了登入部分可以讓開發者更好的處理回傳事件。
Api:
C#
public static ArcaletGame GameLogin(string username, string password);
public static ArcaletGame GameLogin(string username, string password, OnCompleteHandle CallBackHandler);
public static ArcaletGame GameLogin(string username, string password, string _gguid, string _sguid, byte[] _certificate);
C#
public ArcaletGame ag = null;

    void Start()
    {
         ag = ArcaletTool.Game.Login("帳號", "密碼", (ILoginResult result) =>
        {
            if (result.isLogin)
            {
                Debug.Log("登入成功");
            }
            else
            {
                Debug.Log("登入失敗," + result.ToString());
            }
        });
    }
全域事件:
現在也有新的event 可以讓玩家直接從event 就能獲取arcalet 傳回的資訊。
PS:由於是全域,所以不管是哪個賬號登入都會通過此event觸發,所以需要自己去區別這個是哪一個arcalet game。
C#
/// <summary>
        /// 登入後會觸發的Event
        /// </summary>
        public static event Action<ILoginResult, ArcaletGame> OnLoginGameEvent;

        /// <summary>
        /// 遊戲連線狀態的Event
        /// </summary>
        public static event Action<IStateResult, ArcaletGame> OnStateChangedEvent;

        /// <summary>
        /// 主大廳訊息Event
        /// </summary>
        public static event Action<ArcaletMsg, ArcaletGame> OnMessageInEvent;

        /// <summary>
        /// 私人訊息Event
        /// </summary>
        public static event Action<ArcaletMsg, ArcaletGame> OnPrivateInEvent;
範例程式:
C#
    void OnEnable()
    {
        ArcaletGameControl.OnLoginGameEvent += OnLoginEvent;
        ArcaletGameControl.OnStateChangedEvent += OnStateEvent;
        ArcaletGameControl.OnMessageInEvent += OnMainMessageEvent;
    }

 void OnDisable()
    {
        ArcaletGameControl.OnLoginGameEvent -= OnLoginEvent;
        ArcaletGameControl.OnStateChangedEvent -= OnStateEvent;
        ArcaletGameControl.OnMessageInEvent -= OnMainMessageEvent;
    }

 void OnLoginEvent(ILoginResult result, ArcaletGame game)
    {
        //LoginEvent
    }

    void OnStateEvent(IStateResult result, ArcaletGame game)
    {
        //OnStateEvent
    }

    void OnMainMessageEvent(ArcaletMsg msg,ArcaletGame game)
    {
        //OnMessagein
    }
ArcaletSceneControl
ArcaletSceneControl 跟 ArcaletGameControl 一樣,都是簡化其內容的class。
在使用 ArcaletSceneControl 時是不需要初始化資料即可登入。
Ps: 但登入時需要 sguid 才可登入
Api:
C#
public void Leave(ArcaletRoom sn); //離開場景
public ArcaletRoom LoginScene(ArcaletGame ag, string sguid); //登入遊戲場景 (靜態場景)
public ArcaletRoom LoginScene(ArcaletGame ag, string sguid, int SceneID); // 登入遊戲場景 (動態場景)
public ArcaletRoom LoginScene(ArcaletGame ag, string sguid, OnSceneCompleteHandle cb);  //登入遊戲場景 並設定回傳函式(靜態場景)
public ArcaletRoom LoginScene(ArcaletGame ag, string sguid, int SceneID, OnSceneCompleteHandle cb); // 登入遊戲場景 並設定回傳函式 (動態場景)
何謂ArcaletRoom?
ArcaletRoom 是 ArcaletScene的衍生,使用方法與 ArcaletScene 無異,差別在於提供了更多的功能以簡化複雜度。
登入簡化:
C#
public ArcaletRoom room = null;

    public void LoginScene()
    {
        room =ArcaletTool.Scene.LoginScene(ag, "sguid", (ISceneResult result) => 
        {
            if(result.State == SceneState.success)
            {
                Debug.Log("LoginScene OK");
                Debug.Log("roomID = " + room.sid);
            }
            else
            {
                Debug.Log("LoginScene Fail," + result.ToString());
            }
        });
    }
全域事件:
C#
public static event Action<ISceneResult, ArcaletRoom> OnLoginRoomEvent; //登入場景會觸發的event
public static event Action<ISceneResult, ArcaletRoom> OnLogoutRoomEvent;//登出場景會觸發的event
public static event Action<ArcaletMsg, ArcaletRoom> OnMessageInRoomEvent;//接受場景訊息會觸發的event
範例code:
C#
void OnEnable()
    {
        ArcaletSceneEx.OnLoginRoomEvent += OnSceneLoginEvent;
        ArcaletSceneEx.OnLogoutRoomEvent += OnSceneLogoutEvent;
        ArcaletSceneEx.OnMessageInRoomEvent += OnSceneMessageinEvent;
    }

    void OnDisable()
    {
        ArcaletSceneEx.OnLoginRoomEvent -= OnSceneLoginEvent;
        ArcaletSceneEx.OnLogoutRoomEvent -= OnSceneLogoutEvent;
        ArcaletSceneEx.OnMessageInRoomEvent -= OnSceneMessageinEvent;
    }

   void OnSceneLoginEvent(ISceneResult result, ArcaletRoom game)
    {

    }

    void OnSceneLogoutEvent(ISceneResult result, ArcaletRoom game)
    {

    }

    void OnSceneMessageinEvent(ArcaletMsg msg, ArcaletRoom game)
    {

    }
後台物品優化:
ArcaletItemEx

在使用ArcaletItem的時候,無論是使用itemclass或iteminstance,開發者都需要把傳回來的data做一個轉換。
例如 list - > hastable -> 再看資料查看是什麼key ,這寫都會讓編寫增加了一些麻煩,所以 ArcaletItemEx 裡面內置了自動轉換的機制,讓開發者能很便捷的使用功能。
關於 ArcaletTools.Data 裡的屬性 ,請自行下載 dll 並查看參考,裡面有詳細的使用說明。
Api:
C#
public void GetItemInstanceAttributeby(ArcaletGame ag, string iguid, int itemid, string name, object token, OnItemInstanceReadComplete OnItemInstanceHandle);
public void GetItemInstanceByIguid(ArcaletGame ag, string iguid, object token, OnItemInstanceReadComplete OnItemInstanceHandle);
public void GetItemInstanceByName(ArcaletGame ag, string iguidKey, object token, OnItemInstanceReadComplete OnItemInstanceHandle);
public void SetItemInstance(ArcaletGame ag, string iguid, ItemValue item, object token, OnItemInstanceReadComplete OnItemInstanceHandle);
public void SetItemInstance(ArcaletGame ag, string iguid, ItemValue[] item, object token, OnItemInstanceReadComplete OnItemInstanceHandle);


 public void GetItemClass()
    {
        ArcaletTool.Item.GetItemClassByIguid(ag, "Iguid", "token", (IItemClassResult result) =>
        {
            if (result.ErrorCode == 0)
            {
                Debug.Log("Get Item Complete!");
                Debug.Log(result.Token);

                //讀下來的Item 數量
                Debug.Log("TotalItem class:" + result.ItemData.DicItem.Count);

            }
            else
            {
                Debug.Log("Fail Get Item, ErrorCode:" + result.ErrorCode);
            }
        });

    }



public void GetItemInstance()
    {
        ArcaletTool.Item.GetItemInstanceByIguid(ag, "igui here", "token", (IItemInstanceResult result) =>
        {
            if (result.ErrorCode == 0)
            {
                Debug.Log("Get Item Complete!");
                Debug.Log(result.Token);
 
                //讀下來的Item 數量
                Debug.Log("TotalItem Instance:" + result.ItemData.DicItemInstance.Count);
            }
            else
            {
                Debug.Log("Fail Get Item, ErrorCode:" + result.ErrorCode);
            }
        });
    }

 public void SetItemInstance(ItemValue item)
    {
        ArcaletTool.Item.SetItemInstance(ag, "iguid", item, "token", (IItemInstanceResult result) =>
        {
            if (result.ErrorCode == 0)
            {
                Debug.Log("setItemSuccess");
            }
            else
            {
                Debug.Log("setItemFail Errocode = " + result.ErrorCode);
            }
        });
    }
Ps: superuser功能還未完成,在使用不是superuser的功能時,請把後台一般使用者 可以修改的選項打開。
1
2
3
 ArcaletTools.zip  (15.41 KB)
您也可能喜歡這些文章
留言給作者
不公開此留言     登入即可留言
讀者留言
載入更多留言