0基礎學KBEngine基礎學習筆記之二
緊接着上一篇,上一篇KBE老大指出我對實體的概念有所欠缺,目前我也沒有什么新的感悟,也只有期待之后的研究的時候靈感曇花一現了。
其實很多東西就是臨門一腳,如果你看明白了我上一篇的一些概念,接下來有能力的人老早在我寫這篇文章之前跑通流程,在寫自己的邏輯了。
順便提個建議,論壇發帖是否可以支持 markdown ?
接下來我們從零開始走通一下通信流程:
1.下載服務器模板 minimum_project, 解壓 to your %KBE_ROOT% folder,然后重命名kbengine_my_assets。點擊目錄下的start_server.bat。
2.打開之前我們跑通的 kbengine_unity3d_demo, 再導入一個NGUI插件,如下建立一個場景。
關於地址和端口的設置默認在 %KBE_ROOT%kbe/res/server/kbengine_defs.xml下
如果你需要改變引擎設置, 請在({assets}/res/server/kbengine.xml)中覆蓋kbe/res/server/[kbengine_defs.xml]的對應參數來修改, 這樣的好處是不會破壞引擎的默認設置,在你更新引擎時也不會產生沖突,以及在多個邏輯項目時不會影響到其他的項目設置。
3.點擊啟動,你會發現一堆log,主要是一些初始化工作,我們先暫時跳過。Ngui 建立一個登陸界面如下:
簡單的控制腳本代碼
using KBEngine;
using UnityEngine;
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class LoginPanelHandler : MonoBehaviour {
public UIInput inPut_Name;
public UIInput inPut_PassWord;
public UIButton btn_Login;
public UIButton btn_Register;
public string stringAccount { get { return inPut_Name.value; } }
public string stringPasswd { get { return inPut_PassWord.value; } }
void Start()
{
EventDelegate.Add(btn_Login.onClick,btn_Login_OnClick);
EventDelegate.Add(btn_Register.onClick, btn_Register_OnClick);
KBEngine.Event.registerOut("onCreateAccountResult", this, "onCreateAccountResult");
KBEngine.Event.registerOut("onLoginSuccessfully", this, "onLoginSuccessfully");
}
}
創建賬號:
public void btn_Register_OnClick()
{
Debug.Log("LoginPanelHandler => "+"Register ::"+"stringAccount:" + stringAccount + "stringPasswd:" + stringPasswd);
KBEngine.Event.fireIn("createAccount", stringAccount, stringPasswd, System.Text.Encoding.UTF8.GetBytes("kbengine_unity3d_demo"));
}
public void onCreateAccountResult(UInt16 retcode, byte[] datas)
{
if (retcode != 0)
{
Debug.LogError("createAccount is error(注冊賬號錯誤)! err=" + KBEngineApp.app.serverErr(retcode));
return;
}
if (KBEngineApp.validEmail(stringAccount))
{
Debug.LogError("createAccount is successfully, Please activate your Email!(注冊賬號成功,請激活Email!)");
}
else
{
Debug.LogError("createAccount is successfully!(注冊賬號成功!)");
}
}
登錄賬號:
public void btn_Login_OnClick()
{
Debug.Log(" LoginPanelHandler =>" + "Login ::" + "stringAccount:" + stringAccount + "stringPasswd:" + stringPasswd);
if (stringAccount.Length > 0 && stringPasswd.Length > 5)
{
KBEngine.Event.fireIn("login", inPut_Name.value, stringPasswd, System.Text.Encoding.UTF8.GetBytes("kbengine_unity3d_demo"));
}
else
{
Debug.LogError("account or password is error, length < 6!(賬號或者密碼錯誤,長度必須大於5!)");
}
}
public void onLoginSuccessfully(UInt64 rndUUID, Int32 eid, Account accountEntity)
{
Debug.Log("login is successfully!(登陸成功!)");
}
關於賬號的創建登錄流程我就簡單說明一下,我們主要還是考慮實現一下登錄之后的簡單通信。 具體可以參考下方的 KBEngine簡單RPG-Demo源碼解析 參考鏈接
總之就是你創建賬號后登錄,
loginApp處理登錄轉發, 客戶端接收 "KBEngine::Client_onLoginSuccessfully:",
然后baseApp處理登錄請求,baseApp 建立第一個 Account 實體,客戶端接收 "KBEngine::Client_onCreatedProxies"。client 建立第一個 Account 實體, 調用 init()。(init 這個函數在Python中表示構造函數,所以 c# 也要調用一下)
(ps: Account.cs 中注釋掉 baseCall("reqAvatarList");)
public override void __init__()
{
Event.fireOut("onLoginSuccessfully", new object[]{KBEngineApp.app.entity_uuid, id, this});
//baseCall("reqAvatarList");
}
4.第一個實體通信
很好,按照上一篇幅的說法,baseApp 和 client 都有了 同一個 Account 實體, 只是在不同進程維護。
然后我們請求一下 Account 的 Avatar 列表, 其實我剛開始挺糾結 Avatar 是定義為實體 還是定義為Account的base數據。參考官方的Demo是定義為實體,然后替換 Acoount 成為新的 client 實體。
流程如下:
* 定義Avatar實體
* 實現Account base 請求角色列表方法
* 實現Account client 建立角色 和 回應角色方法