003,LuaFramework集成KBEngine的lua客户端插件

本文介绍如何将LuaFramework与KBEngine相结合,实现游戏开发中Lua脚本与C#代码的交互。具体步骤包括配置代码路径、修改设置文件、初始化KBEngine等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LuaFramework与KBEngine的结合

KBEngine的lua代码使用 liuxqlua插件,作者已经把与LuaFramework的结合弄好了,也可以看作者的demo,这里只是记录本人的使用过程

感谢 liuxq 的工作!

插件分为两个部分,C#代码部分和Lua代码部分

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

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

代码放好以后,需要在框架里面添加一些设置代码
  1. 在CustomSettings.cs文件里面,customTypeList数字里面增加如果内容

     public static BindType[] customTypeList =
     {                
         ...
    
         //kbengine
         _GT(typeof(KBEngine.NetworkInterface)),
         _GT(typeof(KBEngine.MemoryStream)),
         _GT(typeof(KBEngine.KBELuaUtil)),
     };
    

    kbengine需要导出上面三个类的LuaBinder

  2. 在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文件里面可以找到,资源是按照文件夹生成的,如果有其他文件夹,也要一并加入.

  3. 在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");
    
  4. 通过上述设置,Luaframework和kbengine插件的结合就设置完毕了

插件在框架里面的使用
  1. 按照作者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文件里面

  2. 作者的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
    
  3. 增加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,作为一个单例使用这个脚本

转载于:https://my.oschina.net/jacky0525/blog/1793738

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值