tolua学习(三)

在前面的基础上https://blog.csdn.net/qq_38317140/article/details/90058028,来继续学习。

一:先导入几个模块,一个是ABModel,这是ab包的打包及加载管理,一个是HotUpdatePro,这个是热更新的管理

二:制作两个界面,panel1tolua学习(三)_第1张图片

panel2tolua学习(三)_第2张图片

点击panel1上的按钮,加载panel2,点击panel2上的按钮加载panel1

三:用lua写逻辑代码

先导入两个C#代码,然后将这两个代码注册到lua,给lua使用,在CustomSettings.cs中,添加tolua学习(三)_第3张图片

制作的预制要放在tolua学习(三)_第4张图片,否则去修改ab管理代码里的路径

然后先设置ab后缀,然后在进行打包

lua代码,一个界面对应一个代码,先Main.lua

local ctrl = require("Ctrl")
local canvas
local Panel1 = require("Panel1")
local Panel2 = require("Panel2")
--主入口函数。从这里开始lua逻辑
function Main()					
	print("logic start")
	--调用ctrl的初始方法	
	--ctrl.start() 
	--Init()
	Init1()
end
--默认加载panel1界面
function Init1()
	--构造一个ResourcesMgr对象
	local res =  ResourcesMgr.New()
	--通过resources加载Canvas
	canvas =  res:LoadAsset("Canvas",false	)
	--将InitPanel(显示正在加载中的界面)隐藏
	UnityEngine.GameObject.Find("InitPanel"):SetActive(false)
	--加载预制包体
	SUIFW.ABMgr.Instance():LoadAssetBundlePack("uiprefabs", "uiprefabs/uiprefabs.ab",Callback)
end

function Callback(abName)
	--加载Panel1预制
	local tmp = SUIFW.ABMgr.Instance():LoadAsset("uiprefabs", "uiprefabs/uiprefabs.ab", "Panel1.prefab", false);
		if tmp then
			--实例化
			local obj =  UnityEngine.GameObject.Instantiate(tmp)
			--设置父物体
			obj.transform:SetParent(canvas.transform,false)
			--将transform传进去
			Panel1.Start(obj.transform)
		end
end

--这里是之前在Resurces里加载
function Init()


	local res =  ResourcesMgr.New()
	canvas =  res:LoadAsset("Canvas",false	)

	local obj =  res:LoadAsset("UIPrefabs/Panel1",false	)
	obj.transform:SetParent(canvas.transform,false)
	Panel1.Start(obj.transform)
	-- local obj = UnityEngine.Resources.Load("UIPrefabs/Panel1") 
	-- print(obj)
	-- UnityEngine.GameObject.Instantiate(obj)
end


function Update()
	--调用Ctrl.lua中的Update方法
	--ctrl.Update()
end


在panel1

--require("Panel2")
Panel1 = {}
local btnTrans
local transform 
local Text
--加载出panel1后,把他的transform传递过来
--通过transform,就可以操作他下面的任何物体了
function Panel1.Start(trans)
    --记录,用于后面的销毁
    transform = trans
    --查找到Button物体
    btnTrans = trans:Find("Button")
    --这是后面修改界面添加的,查找到text物体
    Text = trans:Find("Text"):GetComponent(typeof(UnityEngine.UI.Text))
    --注册按钮点击事件
    UUIEventListener.Get(btnTrans).onClick = Panel1.OnClick

    ----这是后面修改界面添加的,查找三个按钮
    local btn1 =  trans:Find("Button (1)")
    local btn2 =  trans:Find("Button (2)")
    local btn3 =  trans:Find("Button (3)")

    --注册按钮点击事件
    UUIEventListener.Get(btn1).onClick = Panel1.OnClick1
    UUIEventListener.Get(btn2).onClick = Panel1.OnClick2
    UUIEventListener.Get(btn3).onClick = Panel1.OnClick3
end
function Panel1.OnClick1()
    --修改界面上的显示内容
    Text.text = "按钮1"
end
function Panel1.OnClick2()
    --修改界面上的显示内容
    Text.text = "按钮2"
end
function Panel1.OnClick3()
    --修改界面上的显示内容
    Text.text = "按钮3"
end


function Panel1.OnClick()
    print("点击了按钮")
    --找到Canvas(Clone),UI的父物体
    local canvas = UnityEngine.GameObject.Find("Canvas(Clone)")
    --加载包体里的panel2预制
	local tmp = SUIFW.ABMgr.Instance():LoadAsset("uiprefabs", "uiprefabs/uiprefabs.ab", "Panel2.prefab", false);
    if tmp then
        --实例化
        local obj =  UnityEngine.GameObject.Instantiate(tmp)
        --设置父物体
        obj.transform:SetParent(canvas.transform,false)
        --将obj.transform传到Panel2.lua脚本里去
        Panel2.Start(obj.transform)
        if transform ~= nil then
            --销毁当前panel1
            UnityEngine.GameObject. Destroy(transform.gameObject)
        end
    end
end


return Panel1

panel2

--require("Panel1")
Panel2 = {}
local btnTrans
local transform 
function Panel2.Start(trans)
    transform = trans
    btnTrans = trans:Find("Button") 
    --local btn = btnTrans:GetComponent(typeof(UnityEngine.UI.Button))
    UUIEventListener.Get(btnTrans).onClick = Panel2.OnClick
    --btn.onClick:AddListener(Panel1.OnClick)
end

function Panel2.OnClick()
    print("点击了按钮")
    local canvas = UnityEngine.GameObject.Find("Canvas(Clone)")
	local tmp = SUIFW.ABMgr.Instance():LoadAsset("uiprefabs", "uiprefabs/uiprefabs.ab", "Panel1.prefab", false);
    if tmp then
        local obj =  UnityEngine.GameObject.Instantiate(tmp)
        obj.transform:SetParent(canvas.transform,false)
        Panel1.Start(obj.transform)
        if transform ~= nil then
            UnityEngine.GameObject. Destroy(transform.gameObject)
        end
    end
end


return Panel2

panel2代码和panel1差不多,就没加注释了

四:,拷贝lua文件到streamingAssets下,在生成md5清单文件

tolua学习(三)_第5张图片拷贝到服务器tolua学习(三)_第6张图片

 

然后添加脚本tolua学习(三)_第7张图片

然后打包PC平台。启动服务器后,运行客户端,就OK了,手机端也是一样,就是路径问题,这里不做说明

注意事项:

1.ToLua下的Lua文件夹下的东西很重要,由于打包的时候,并不会打包进包体,会导致搜索不到文件,会报错。

所以我这里就手动拷贝解决,拷贝到

实际项目章,是打包成ab的,具体参考tolua例子18

2.我的示例项目中,是两套,将名字改成UpdateAssets_ToLuaLearn客户端就会加载里面的资源,这样客户端不需要做任何修改,需要下载我们给的内容,显示对应的界面和逻辑,就是热更了

3.我用的unity2018,打包的时候UnityEngine_LightWrap会报几个错误,暂时注释掉处理的

4.服务器是用node搭建的一个简单的服务器,客户端地址在UpdateResByServer.cs里

5.这只是一个小小的学习项目,还达不到商用,作为入门。具体可学习官方提供的案例https://github.com/jarjin/LuaFramework_UGUI

最后例子地址:https://github.com/loserDragon/ToLuaLearn

lua基础学习链接: https://pan.baidu.com/s/1cFHvs713SmPxo-LwaFwLsA 提取码: 2ejb

 

 

你可能感兴趣的:(Unity,ToLua)