Unity热更新_Lua写的UI窗口控制类和视图类
一个UI窗口的 控制器类和视图类用 Lua 来写的话,应该如何对应上呢?
如果某个窗口的控制器类叫:MessageCtrl
它对应的视图类叫:MessageView
--首先外界调用MessageCtrl.New()函数持有这个脚本的引用
--其次外界通过调用MessageCtrl.Awake()函数加载ui窗口
--最后加载出来的ui窗口会对应上MessageView视图类
MessageView视图类里面的各个函数会对应上Monobehavior各个阶段的回调函数,因为在每个ui窗口上有一个C#脚本,里面的系统回调函数会调用 Lua 脚本MessageView类的函数
MessageCtrl类:
require "XLuaLogic/Data/TaskEntity"
require "XLuaLogic/Common/Define"--某个ui窗口控制器
--首先外界调用MessageCtrl.New()函数持有这个脚本的引用
--其次外界通过调用MessageCtrl.Awake()函数加载ui窗口
--最后加载出来的ui窗口会对应上MessageView视图类
MessageCtrl = {};
local this = MessageCtrl;function MessageCtrl.New()return this;
endfunction MessageCtrl.Awake()print('执行MessageCtrl 的Awake 方法');CS.LuaHelper.ViewUtil:OpenWindow("MessageView", this.OnCreate); --里面是加载ui面板
end--启动事件--
function MessageCtrl.OnCreate()txtTitle = MessageView.txtTitle:GetComponent('UnityEngine.UI.Text');
endfunction MessageCtrl.OnStart()print("进入了OnStart回调");--定义列表local taskTable ={};--local taskTable =TaskEntity.GetList();taskTable[#taskTable+1] = TaskEntity.New(1001, "小试身手", 0, "我看少侠骨骼惊奇,天赋异禀,实在是个修仙的好料子,快去帮我去狼群杀死一些狼吧!");taskTable[#taskTable+1] = TaskEntity.New(1002, "武器考验", 1, "好徒儿,现在的你仍然菜的很,这样吧,你去岐山西郊之地帮我对付几只小牛");taskTable[#taskTable+1] = TaskEntity.New(1003, "技能传授", 2, "玄兵斗法,阵列纲常。万法无极,心法合一!");taskTable[#taskTable+1] = TaskEntity.New(1004, "修为精进", 0, "这事来的巧。前几日西郊频现异变蛇妖,这些妖蛇在附近村庄作祟。我派你前往除妖卫道,你可愿意?");taskTable[#taskTable+1] = TaskEntity.New(1005, "强化武器", 1, "徒儿,你可知磨刀不误砍柴工这个道理?你天赋异于常人,但仍需让你的武器和装备时时保持贴己趁手!");taskTable[#taskTable+1] = TaskEntity.New(1006, "困难挑战", 2, "师弟的能力提升之后,那些简单的关卡已经不再适合你了,你可以试试更高难度的关卡,奖励上也会更加丰富!");taskTable[#taskTable+1] = TaskEntity.New(1007, "护身项链", 0, "好徒儿,我为你准备了一样礼物,但是呢…!");taskTable[#taskTable+1] = TaskEntity.New(1008, "师门考验", 1, "既然装备【进阶】一层了,快去试试效果如何!");taskTable[#taskTable+1] = TaskEntity.New(1009, "打扫后山", 2, "方才得到师父的命令需要我前去击杀一些魔怪,但我目前还有其他要事,师弟能否代我前去一探!");taskTable[#taskTable+1] = TaskEntity.New(1010, "刺探", 0, "我国需要一些有志之士,去收集一些情报,我们才能指定合理的发展战略!");--循环列表for i=1, #taskTable, 1 dolocal j=i; --循环委托注意事项 此处一定要重新声明 local j=ilocal task = taskTable[j]; --然后重新定义task 从表中获取数据--克隆预设local obj = CS.LuaHelper.ResourcesMgr:Load("UIPrefab/UIWindows/TaskItemView");obj.transform.parent = MessageView.content;obj.transform.localPosition = Vector3.zero;obj.transform.localScale=Vector3.one;local txtTaskTitle = obj.transform:Find("txtTitle"):GetComponent('UnityEngine.UI.Text');txtTaskTitle.text = task.Title;print("数据Title"..task.Title);local txtTaskStatus = obj.transform:Find("txtStatus"):GetComponent('UnityEngine.UI.Text');txtTaskStatus.text = this.GetTaskStatusName(task.Status);local btnItem = obj.transform:GetComponent('UnityEngine.UI.Button');--写法btnItem.onClick:AddListener(function ()MessageView.detailContainer.gameObject:SetActive(true);MessageView.txtTaskId.text = tostring(task.Id);MessageView.txtTaskName.text = task.Title;MessageView.txtTaskStatus.text = this.GetTaskStatusName(task.Status);MessageView.txtTaskContent.text = "";--调用dotween函数MessageView.txtTaskContent:DOText(task.Content, 0.5); end);endend function MessageCtrl.GetTaskStatusName(status)if (status == 0)thenreturn "未接 ";elseif (status == 1)thenreturn "已接 ";elseif (status == 2)thenreturn "已完成 ";end
endfunction MessageCtrl.btnOKClick()txtTitle.text = "修改了标题";
end
MessageView类:
MessageView = {}
local this = MessageView;local transform;
local gameObject;function MessageView.awake(obj)gameObject = obj;transform = obj.transform;this.InitView();print('MessageView awake');
end--初始化面板--
function MessageView.InitView()--先把需要用到的组件 找到this.txtTitle = transform:Find("imgTitleBG/txtTitle");this.content = transform:Find("Scroll View/Viewport/Content");this.detailContainer = transform:Find("detailContainer");this.detailContainer.gameObject:SetActive(false);this.txtTaskId = transform:Find("detailContainer/txtTaskId"):GetComponent('UnityEngine.UI.Text'); this.txtTaskName = transform:Find("detailContainer/txtTaskName"):GetComponent('UnityEngine.UI.Text');this.txtTaskStatus = transform:Find("detailContainer/txtTaskStatus"):GetComponent('UnityEngine.UI.Text');this.txtTaskContent = transform:Find("detailContainer/txtTaskContent"):GetComponent('UnityEngine.UI.Text');local btnItem = transform:Find("btnClose"):GetComponent('UnityEngine.UI.Button'); --写法btnItem.onClick:AddListener(function ()gameObject:SetActive(false);end);endfunction MessageView.start()MessageCtrl.OnStart();
endfunction MessageView.update()
endfunction MessageView.ondestroy()print("MessageView 窗口被销毁了");
end
每个UI窗口上挂载的映射 Lua类的脚本:
using System;
using UnityEngine;
using System.Collections;
using XLua;
using XLuaFramework;[LuaCallCSharp]
public class LuaViewBehaviour : MonoBehaviour
{[CSharpCallLua]private delegate void delLuaAwake(GameObject obj);LuaViewBehaviour.delLuaAwake luaAwake;[CSharpCallLua]private delegate void delLuaStart();LuaViewBehaviour.delLuaStart luaStart;[CSharpCallLua]private delegate void delLuaUpdate();LuaViewBehaviour.delLuaUpdate luaUpdate;[CSharpCallLua]private delegate void delLuaOnDestroy();LuaViewBehaviour.delLuaOnDestroy luaOnDestroy;private LuaTable scriptEnv;private LuaEnv luaEnv;public string Tag;void Awake(){luaEnv = LuaManager.luaEnv; //此处要从LuaManager上获取 全局只有一个scriptEnv = luaEnv.NewTable();LuaTable meta = luaEnv.NewTable();meta.Set("__index", luaEnv.Global);scriptEnv.SetMetaTable(meta);meta.Dispose();string luaScriptFileName = name; //luaScriptFileName 对应的是lua脚本的名字 if (luaScriptFileName.Contains("(Clone)")){luaScriptFileName = luaScriptFileName.Split(new string[] { "(Clone)" }, StringSplitOptions.RemoveEmptyEntries)[0];}luaScriptFileName = luaScriptFileName.Replace("pan_", "");Debug.Log(luaScriptFileName);luaAwake = scriptEnv.GetInPath(luaScriptFileName + ".awake");luaStart = scriptEnv.GetInPath(luaScriptFileName + ".start");luaUpdate = scriptEnv.GetInPath(luaScriptFileName + ".update");luaOnDestroy = scriptEnv.GetInPath(luaScriptFileName + ".ondestroy");scriptEnv.Set("self", this);if (luaAwake != null){luaAwake(gameObject);}}void Start(){if (luaStart != null){luaStart();}}void Destroy(){if (luaOnDestroy != null){luaOnDestroy();}luaOnDestroy = null;luaUpdate = null;luaStart = null;}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
