Uniyt热更新——LuaFrameWork学习(一)


先下载个LuaFameWork框架 官网有两个一个是针对NGUI的,一个是针对UGUI的,我用的是UGUI的;下载后解压打开工程找到main场景打开,看看里面有啥

其实里没什么东西,最主要的就是GameManager上面挂的Main脚本这个是关键,这个是启动框架的主要脚本。OK我们运行下看看有什么效果,不过在运行前我们要先build下资源,点击菜单栏的LuaFramework下面有不同平台的打包方式我的事pc的,然后点击Lua选择Gen Lua Wrap Fiels,好了然后运行我们可以看到这样一个结果Ok,运行正常,接下来我们就来看看这个界面是怎么生成的吧。

先打开Main.cs来看看里面的代码,代码如下:

public class Main : MonoBehaviour {

        void Start() {
            AppFacade.Instance.StartUp();   //启动游戏
        }
    }
我去,就一段代码这也太简单了吧,如果你这样想那你就错了,我当时看了唯一的想法是他那个生成这个界面和克隆每个怪物头像的代码写在哪?说实话这代码不好找啊,我是个初学者而且对lua代码更是一窍不通啊,这让我找代码更难了,不过最后我还是把整个流程搞定了。其实这段代码是启动这个Lua框架的,看他调用的函数名就知道,我们一步步的往里面看最后我们可以看到如下一段代码:
public class StartUpCommand : ControllerCommand {

    public override void Execute(IMessage message) {
        if (!Util.CheckEnvironment()) return;

        GameObject gameMgr = GameObject.Find("GlobalGenerator");
        if (gameMgr != null) {
            AppView appView = gameMgr.AddComponent<AppView>();
        }
        //-----------------关联命令-----------------------
        AppFacade.Instance.RegisterCommand(NotiConst.DISPATCH_MESSAGE, typeof(SocketCommand));

        //-----------------初始化管理器-----------------------
        AppFacade.Instance.AddManager<LuaManager>(ManagerName.Lua);
        AppFacade.Instance.AddManager<PanelManager>(ManagerName.Panel);
        AppFacade.Instance.AddManager<SoundManager>(ManagerName.Sound);
        AppFacade.Instance.AddManager<TimerManager>(ManagerName.Timer);
        AppFacade.Instance.AddManager<NetworkManager>(ManagerName.Network);
        AppFacade.Instance.AddManager<ResourceManager>(ManagerName.Resource);
        AppFacade.Instance.AddManager<ThreadManager>(ManagerName.Thread);
        AppFacade.Instance.AddManager<GameManager>(ManagerName.Game);
    }
}
这段代码里添加了很多管理器,最终这些管理器的脚本会挂在GameManager上效果如下:


这里挂了很多的管理器的脚本但是我们现在只要看GameManager这个脚本就行了;Ok,打开GameManager.cs找到如下代码:

void OnInitialize() {
            LuaManager.InitStart();
            LuaManager.DoFile("Logic/Game");         //加载游戏
            LuaManager.DoFile("Logic/Network");      //加载网络
            NetManager.OnInit();                     //初始化网络
            Util.CallMethod("Game", "OnInitOK");     //初始化完成

            initialize = true;
        }
这里就是调用lua代码的地方,这里呢我们只要关心Game.lua里的代码就行,我这里用的是Lua Srudio这个软件打开Lua代码的也可以用记事本,下面我把主要的代码复制下:

function Game.InitViewPanels()
	for i = 1, #PanelNames do
		require ("View/"..tostring(PanelNames[i]))
		print("View/"..tostring(PanelNames[i]))
	end
end

--初始化完成,发送链接服务器信息--
function Game.OnInitOK()
    AppConst.SocketPort = 2012;
    AppConst.SocketAddress = "127.0.0.1";
    networkMgr:SendConnect();

    --注册LuaView--
    this.InitViewPanels();

    --[[this.test_class_func();
    this.test_pblua_func();
    this.test_cjson_func();
    this.test_pbc_func();
    this.test_lpeg_func();
    this.test_sproto_func();
    coroutine.start(this.test_coroutine);
--]]
    CtrlManager.Init();
    local ctrl = CtrlManager.GetCtrl(CtrlNames.Prompt);
    if ctrl ~= nil and AppConst.ExampleMode then
        ctrl:Awake();
    end
       
    logWarn('LuaFramework InitOK--->>>');
end

function Game.InitViewPanels() 运行另外两个lua代码:PromptCtrl.lua和PromptPanel.lua。那么它又是在哪调用的呢,他是在Game.OnInitOK()里调用的,还有这里还有一段代码

CtrlManager.Init();
    local ctrl = CtrlManager.GetCtrl(CtrlNames.Prompt);
    if ctrl ~= nil and AppConst.ExampleMode then
        ctrl:Awake();
    end

这个就会调用PromptCtrl.lua里的这段代码

function PromptCtrl.Awake()
	logWarn("PromptCtrl.Awake--->>");
	print("PromptCtrl.Awake");
	panelMgr:CreatePanel('Prompt', this.OnCreate);
end
通过这段代码会调用PanalManager.cs里的

public void CreatePanel(string name, LuaFunction func = null) {
            string assetName = name + "Panel";
            string abName = name.ToLower() + AppConst.ExtName;

            ResManager.LoadPrefab(abName, assetName, delegate(UnityEngine.Object[] objs) {
                if (objs.Length == 0) return;
                // Get the asset.
                GameObject prefab = objs[0] as GameObject;

                if (Parent.FindChild(name) != null || prefab == null) {
                    return;
                }
                GameObject go = Instantiate(prefab) as GameObject;
                go.name = assetName;
                go.layer = LayerMask.NameToLayer("Default");
                go.transform.SetParent(Parent);
                go.transform.localScale = Vector3.one;
                go.transform.localPosition = Vector3.zero;
                go.AddComponent<LuaBehaviour>();

                if (func != null) func.Call(go);
                Debug.LogWarning("CreatePanel::>> " + name + " " + prefab);
            });
        }

我去调用了这么多终于看到了生成面板的代码;这个Game.OnInitOK()這个是在上面GameManager.cs代码里调用的。

最后就是调用PromptCtrl.lua里面如下的代码:

function PromptCtrl.Awake()
	logWarn("PromptCtrl.Awake--->>");
	print("PromptCtrl.Awake");
	panelMgr:CreatePanel('Prompt', this.OnCreate);
end

--启动事件--
function PromptCtrl.OnCreate(obj)
	gameObject = obj;
	transform = obj.transform;

	panel = transform:GetComponent('UIPanel');
	prompt = transform:GetComponent('LuaBehaviour');
	logWarn("Start lua--->>"..gameObject.name);

	prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
	resMgr:LoadPrefab('prompt', { 'PromptItem' }, this.InitPanel);
end

--初始化面板--
function PromptCtrl.InitPanel(objs)
	local count = 100; 
	local parent = PromptPanel.gridParent;
	for i = 1, count do
		local go = newObject(objs[0]);
		go.name = 'Item'..tostring(i);
		go.transform:SetParent(parent);
		go.transform.localScale = Vector3.one;
		go.transform.localPosition = Vector3.zero;
        prompt:AddClick(go, this.OnItemClick);

	    local label = go.transform:FindChild('Text');
	    label:GetComponent('Text').text = tostring(i);
	end
end
上面的代码是通过LuaBehabiour.cs里的代码来调用PromptCtrl.Awake()来实现掉用其他代码最终克隆预制体生成下面的效果

ok,整个过程就是这样的。


  • 8
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 1
    评论
自动生成绑定代码文件,非反射调用 大量内建基础类型支持,如枚举,委托,事件,Type, 数组,迭代器等 支持多种协同形式 支持所有unity内部类导出,支持委托类型导出 支持导出自定义,跳过某个空的基类,修改导出名称等 支持扩展函数自定义导出, 比如DoTween 支持值类型Nullable导出,包括Nullable等 支持Lua中function转委托,可以区分需要不同委托的参数的重载函数 支持c# LuaFunction对象转委托,简化调用方式。 支持无GC的多参数调用形式 支持重载函数自动折叠, 如:Convert.ToUInt32只导出double参数的函数 支持重载函数自动排序, 如:参数个数相同, object参数执行级最低, 不会出现错误匹配情况 支持导出函数重命名, 可以分离导出某个重载函数(可以导出被折叠掉的函数) 支持使用编辑器类改写导出规则 支持this数组访问,索引为int可以通过[]访问,其他可使用.get_Item或者.this:get()访问数组成员 支持委托(事件)+-lua function。支持通过函数接口的Add和Remove委托操作 支持静态反射操作, 形式同c# 支持peer表,可在lua端扩展导出的userdata 支持自定义struct压入和读取,做到无GC,并且结构成员无类型限制, 参考例子24 支持preloading, 可以通过requie后绑定wrap文件 支持int64, uint64 大量的lua数学类型,如Quaternion, Vector3, Mathf等 包含第三方lua扩展,包括luasocket, struct, lpeg, utf8, pb等库 当lua出现异常,能够同时捕获c#端和lua端堆栈,便于调试 print信息,在编辑器点击日志, 能自动打开对应lua文件 支持unity所有版本 支持Lua hook C#相代码实现,定程度上支持利用Lua代码修改C#端代码的bug更新使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

梅川酷子飞

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值