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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hyf2713/article/details/51777328


先下载个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,整个过程就是这样的。


阅读更多

没有更多推荐了,返回首页