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;
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;
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值