LuaFramework与KBEngine的结合
KBEngine的lua代码使用 liuxq 的 lua插件,作者已经把与LuaFramework的结合弄好了,也可以看作者的demo,这里只是记录本人的使用过程
感谢 liuxq 的工作!
插件分为两个部分,C#代码部分和Lua代码部分
把C#部分的代码放到框架的Scripts目录里面,我是放到了Scripts/KBEngine目录里面
把Lua部分的代码放到框架的Lua目录里面,我是放到了Lua/KBEngine/Base目录里面
代码放好以后,需要在框架里面添加一些设置代码
在CustomSettings.cs文件里面,customTypeList数字里面增加如果内容
public static BindType[] customTypeList = { ... //kbengine _GT(typeof(KBEngine.NetworkInterface)), _GT(typeof(KBEngine.MemoryStream)), _GT(typeof(KBEngine.KBELuaUtil)), };
kbengine需要导出上面三个类的LuaBinder
在LuaManager.cs文件里面,InitLuaBundle函数里面添加如下代码
void InitLuaBundle() { if (loader.beZip) { ... //加入kbengine的资源 loader.AddBundle("lua/lua_kbengine.unity3d"); loader.AddBundle("lua/lua_kbengine_base.unity3d"); loader.AddBundle("lua/lua_kbengine_interface.unity3d"); } }
加入的文件是框架生成的资源,在StreamingAssets/lua文件里面可以找到,资源是按照文件夹生成的,如果有其他文件夹,也要一并加入.
在LuaManager.cs文件里面,Awake函数里面添加如下代码
void Awake() { ... //这里要设置KBEngine的CallFunction //不然KBEngine没有办法调用lua脚本 KBEngine.KBELuaUtil.SetCallLuaFunction(this.CallFunction); }
kbengine的C#部分和Lua部分的交换就是通过KBELuaUtil完成,通过KBELuaUtil的CallMethod函数调用kbengine的lua代码 例如:
KBELuaUtil.CallMethod("KBEngineLua", "InitEngine");
通过上述设置,Luaframework和kbengine插件的结合就设置完毕了
插件在框架里面的使用
按照作者demo里面的使用方法,在框架的GameManager.cs文件里面,OnInitialize函数里面添加KBEngine的初始化
void OnInitialize() { ... _kbeMain = gameObject.GetComponent<KBEMain>(); if (null == _kbeMain) { _kbeMain = gameObject.AddComponent<KBEMain>(); } _kbeMain.initKBEngine(); ... }
initKBEngine里面调用KBEngineLua的InitEngine方法完成初始化
public virtual void initKBEngine() { ... KBELuaUtil.CallMethod("KBEngineLua", "InitEngine"); }
KBEngineLua的InitEngine在KBEngine.lua文件里面
作者的demo里面,服务器IP和端口是在KBEngine.lua里面设置的,为了方便调试,在KBEMain.cs里面增加IP和端口的设置
public class KBEMain : MonoBehaviour { public enum Server { Test, Remote, Local, } //登录服务器 public Server IP = Server.Test; public int port = 20013; ... public virtual void initKBEngine() { ... //把服务器IP和端口记录到Lua脚本里面 KBELuaUtil.CallMethod("KBEngineLua", "InitServer", _ip, string.Format("{0}", port)); KBELuaUtil.CallMethod("KBEngineLua", "InitEngine"); } .... }
KBEngine.lua里面增加InitServer函数,设置服务器IP和端口
--初始化服务器地址 KBEngineLua.InitServer = function(strIP, strPort) this.ip = strIP; this.port = strPort; end
增加KBEScript.lua文件处理各种事件
require("KBEngine/Account") require("KBEngine/Player") local Event = require("KBEngine/Base/events") KBEngineLua.KBEScript = {} function KBEngineLua.KBEScript:New(script) script = script or {} setmetatable(script, self) self.__index = self return script end --[[ --初始化函数,注册事件 --]] function KBEngineLua.KBEScript:Init() Event.AddListener("onLoginFailed", KBEngineLua.KBEScript.OnLoginFailed) Event.AddListener("OnLoginSuccessfully", KBEngineLua.KBEScript.OnLoginSuccessfully) Event.AddListener("onEnterWorld", KBEngineLua.KBEScript.OnEnterWorld) Event.AddListener("onLeaveWorld", KBEngineLua.KBEScript.OnLeaveWorld) Event.AddListener("addSpaceGeometryMapping", KBEngineLua.KBEScript.OnAddSpaceGeometryMapping) end --[[ -- --]] function KBEngineLua.KBEScript:OnAddSpaceGeometryMapping(path) print("KBEScript:OnAddSpaceGeometryMapping", path) end --[[ --角色离开场景 --]] function KBEngineLua.KBEScript:OnLeaveWorld(obj) print("KBEScript:OnLeaveWorld", obj) end --[[ --角色进入场景 --]] function KBEngineLua.KBEScript:OnEnterWorld(obj) print("KBEScript:OnEnterWorld", obj) end --[[ --登录成功,由Account在初始化完成后发送 --]] function KBEngineLua.KBEScript:OnLoginSuccessfully() print("KBEScript:OnLoginSuccessfully") local account = KBEngineLua.player() account:ReqPlayerInfos("1") end --[[ --登录失败 --]] function KBEngineLua.KBEScript:OnLoginFailed() print("KBEScript:OnLoginFailed") end --[[ --创建一个实例,相当于单例模式 --]] KBEScriptInst = KBEngineLua.KBEScript:New() KBEScriptInst.Init() return KBEScriptInst
最后返回KBEScriptInst,作为一个单例使用这个脚本