在前面的基础上https://blog.csdn.net/qq_38317140/article/details/90058028,来继续学习。
一:先导入几个模块,一个是ABModel,这是ab包的打包及加载管理,一个是HotUpdatePro,这个是热更新的管理
点击panel1上的按钮,加载panel2,点击panel2上的按钮加载panel1
三:用lua写逻辑代码
先导入两个C#代码,然后将这两个代码注册到lua,给lua使用,在CustomSettings.cs中,添加
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清单文件
然后打包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