一个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;
end
function MessageCtrl.Awake()
print('执行MessageCtrl 的Awake 方法');
CS.LuaHelper.ViewUtil:OpenWindow("MessageView", this.OnCreate); --里面是加载ui面板
end
--启动事件--
function MessageCtrl.OnCreate()
txtTitle = MessageView.txtTitle:GetComponent('UnityEngine.UI.Text');
end
function 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 do
local j=i; --循环委托注意事项 此处一定要重新声明 local j=i
local 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
);
end
end
function MessageCtrl.GetTaskStatusName(status)
if (status == 0)
then
return "<color=#06C300FF>未接</color>";
elseif (status == 1)
then
return "<color=#00CAFFFF>已接</color>";
elseif (status == 2)
then
return "<color=#FFAE00FF>已完成</color>";
end
end
function 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
);
end
function MessageView.start()
MessageCtrl.OnStart();
end
function MessageView.update()
end
function 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<LuaViewBehaviour.delLuaAwake>(luaScriptFileName + ".awake");
luaStart = scriptEnv.GetInPath<LuaViewBehaviour.delLuaStart>(luaScriptFileName + ".start");
luaUpdate = scriptEnv.GetInPath<LuaViewBehaviour.delLuaUpdate>(luaScriptFileName + ".update");
luaOnDestroy = scriptEnv.GetInPath<LuaViewBehaviour.delLuaOnDestroy>(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;
}
}