LuaFramework与KBEngine的结合
KBEngine的lua代码使用 liuxq 的 lua插件,作者已经把与LuaFramework的结合弄好了,也可以看作者的demo,这里只是记录本人的使用过程
感谢 liuxq 的工作!
插件分为两个部分,C#代码部分和Lua代码部分
把C#部分的代码放到框架的Scripts目录里面,我是放到了Scripts/KBEngine目录里面

把Lua部分的代码放到框架的Lua目录里面,我是放到了Lua/KBEngine/Base目录里面

代码放好以后,需要在框架里面添加一些设置代码
-
在CustomSettings.cs文件里面,customTypeList数字里面增加如果内容
1 public static BindType[] customTypeList = 2 { 3 ... 4 5 //kbengine 6 _GT(typeof(KBEngine.NetworkInterface)), 7 _GT(typeof(KBEngine.MemoryStream)), 8 _GT(typeof(KBEngine.KBELuaUtil)), 9 };kbengine需要导出上面三个类的LuaBinder
-
在LuaManager.cs文件里面,InitLuaBundle函数里面添加如下代码
1 void InitLuaBundle() { 2 if (loader.beZip) { 3 ... 4 5 //加入kbengine的资源 6 loader.AddBundle("lua/lua_kbengine.unity3d"); 7 loader.AddBundle("lua/lua_kbengine_base.unity3d"); 8 loader.AddBundle("lua/lua_kbengine_interface.unity3d"); 9 } 10 }加入的文件是框架生成的资源,在StreamingAssets/lua文件里面可以找到,资源是按照文件夹生成的,如果有其他文件夹,也要一并加入.
-
在LuaManager.cs文件里面,Awake函数里面添加如下代码
1 void Awake() { 2 ... 3 4 //这里要设置KBEngine的CallFunction 5 //不然KBEngine没有办法调用lua脚本 6 KBEngine.KBELuaUtil.SetCallLuaFunction(this.CallFunction); 7 }kbengine的C#部分和Lua部分的交换就是通过KBELuaUtil完成,通过KBELuaUtil的CallMethod函数调用kbengine的lua代码 例如:
KBELuaUtil.CallMethod("KBEngineLua", "InitEngine"); -
通过上述设置,Luaframework和kbengine插件的结合就设置完毕了
插件在框架里面的使用
-
按照作者demo里面的使用方法,在框架的GameManager.cs文件里面,OnInitialize函数里面添加KBEngine的初始化
1 void OnInitialize() 2 { 3 ... 4 5 _kbeMain = gameObject.GetComponent<KBEMain>(); 6 if (null == _kbeMain) 7 { 8 _kbeMain = gameObject.AddComponent<KBEMain>(); 9 } 10 _kbeMain.initKBEngine(); 11 12 ... 13 }initKBEngine里面调用KBEngineLua的InitEngine方法完成初始化
1 public virtual void initKBEngine() 2 { 3 ... 4 5 KBELuaUtil.CallMethod("KBEngineLua", "InitEngine"); 6 }KBEngineLua的InitEngine在KBEngine.lua文件里面
-
作者的demo里面,服务器IP和端口是在KBEngine.lua里面设置的,为了方便调试,在KBEMain.cs里面增加IP和端口的设置
1 public class KBEMain : MonoBehaviour 2 { 3 public enum Server 4 { 5 Test, 6 Remote, 7 Local, 8 } 9 10 //登录服务器 11 public Server IP = Server.Test; 12 public int port = 20013; 13 14 ... 15 16 public virtual void initKBEngine() 17 { 18 ... 19 20 //把服务器IP和端口记录到Lua脚本里面 21 KBELuaUtil.CallMethod("KBEngineLua", "InitServer", _ip, string.Format("{0}", port)); 22 23 KBELuaUtil.CallMethod("KBEngineLua", "InitEngine"); 24 } 25 26 .... 27 }KBEngine.lua里面增加InitServer函数,设置服务器IP和端口
1 --初始化服务器地址 2 KBEngineLua.InitServer = function(strIP, strPort) 3 this.ip = strIP; 4 this.port = strPort; 5 end -
增加KBEScript.lua文件处理各种事件
1 require("KBEngine/Account") 2 require("KBEngine/Player") 3 4 local Event = require("KBEngine/Base/events") 5 6 KBEngineLua.KBEScript = {} 7 8 function KBEngineLua.KBEScript:New(script) 9 script = script or {} 10 setmetatable(script, self) 11 self.__index = self 12 return script 13 end 14 15 --[[ 16 --初始化函数,注册事件 17 --]] 18 function KBEngineLua.KBEScript:Init() 19 Event.AddListener("onLoginFailed", KBEngineLua.KBEScript.OnLoginFailed) 20 Event.AddListener("OnLoginSuccessfully", KBEngineLua.KBEScript.OnLoginSuccessfully) 21 Event.AddListener("onEnterWorld", KBEngineLua.KBEScript.OnEnterWorld) 22 Event.AddListener("onLeaveWorld", KBEngineLua.KBEScript.OnLeaveWorld) 23 Event.AddListener("addSpaceGeometryMapping", KBEngineLua.KBEScript.OnAddSpaceGeometryMapping) 24 end 25 26 --[[ 27 -- 28 --]] 29 function KBEngineLua.KBEScript:OnAddSpaceGeometryMapping(path) 30 print("KBEScript:OnAddSpaceGeometryMapping", path) 31 end 32 33 --[[ 34 --角色离开场景 35 --]] 36 function KBEngineLua.KBEScript:OnLeaveWorld(obj) 37 print("KBEScript:OnLeaveWorld", obj) 38 end 39 40 --[[ 41 --角色进入场景 42 --]] 43 function KBEngineLua.KBEScript:OnEnterWorld(obj) 44 print("KBEScript:OnEnterWorld", obj) 45 end 46 47 --[[ 48 --登录成功,由Account在初始化完成后发送 49 --]] 50 function KBEngineLua.KBEScript:OnLoginSuccessfully() 51 print("KBEScript:OnLoginSuccessfully") 52 local account = KBEngineLua.player() 53 account:ReqPlayerInfos("1") 54 end 55 56 --[[ 57 --登录失败 58 --]] 59 function KBEngineLua.KBEScript:OnLoginFailed() 60 print("KBEScript:OnLoginFailed") 61 end 62 63 --[[ 64 --创建一个实例,相当于单例模式 65 --]] 66 KBEScriptInst = KBEngineLua.KBEScript:New() 67 KBEScriptInst.Init() 68 return KBEScriptInst最后返回KBEScriptInst,作为一个单例使用这个脚本