ToLua热更新之LuaFramework框架之UI(5)

界面系统在游戏中占据重要地位。游戏界面是否友好,很大程度上决定了玩家的体验;界面开发是否便利,也影响着游戏的开发进度。Unity3D 的UGUI系统,使用户可以“可视化地”开发界面,那么怎样用Lua去调用UGUI呢?

1、显示UI界面

下面演示如何显示一个UI界面。由于UI界面也是一种资源,使用第二篇“资源热更新”的方法即可。这个例子中,制作一个含有按钮的界面,然后组成名为Panel1的UI预设,存放到Tank目录下。

图:Panel1

前面(第二篇)已在Packager类HandleExampleBundle方法中添加了一句“AddBuildMap("tank" + AppConst.ExtName, "*.prefab", "Assets/Tank");”(当然也可以添加到其他地方),它会把Tank目录下的所有预设打包成名为tank的资源包。故而点击“Build xxx Resource”后,Panel1也会被打包到tank资源包中。

修改Lua入口函数Main.lua中的Main方法,在加载资源后把panel1放到Canvas下(需要在场景中添加画布),然后调整它的位置和大小。

--主入口函数。从这里开始lua逻辑
function Main()					
	LuaHelper = LuaFramework.LuaHelper;
	resMgr = LuaHelper.GetResManager();
	resMgr:LoadPrefab('tank', { 'Panel1' }, OnLoadFinish);
end
 
--加载完成后的回调--
function OnLoadFinish(objs)
	--显示面板
	go = UnityEngine.GameObject.Instantiate(objs[0]);
	local parent = UnityEngine.GameObject.Find("Canvas")
    go.transform:SetParent(parent.transform);
    go.transform.localScale = Vector3.one;
    go.transform.localPosition = Vector3.zero;
end

运行游戏,即可看到加载出来的界面。

图:加载出来的界面

2、事件响应

c#中可以使用事件监听的方法给UI组件添加事件。例如,添加按钮点击事件的方法如下:

		Button btn = go.GetComponent<Button> ();
		btn.onClick.AddListener
		(
			delegate() 
			{
				this.OnClick(go)
			}
		);

然而在LuaFramework的API中,没能找到合适的方法,只能根据第三篇中“自定义API”的方法,自己编写一套了。编写UIEvent类,它包含用于添加监听事件的AddButtonClick和清除监听事件的ClearButtonClick方法,代码如下所示(完成后记得要“修改CustomSetting”和“生成wrap文件”)。

using UnityEngine;
using System.Collections;
using LuaInterface;
using UnityEngine.UI;
 
public class UIEvent 
{
	//添加监听
	public static void AddButtonClick(GameObject go, LuaFunction luafunc) 
	{
		if (go == null || luafunc == null) 
			return;
 
		Button btn = go.GetComponent<Button> ();
		if (btn == null)
			return;
 
		btn.onClick.AddListener
		(
			delegate() 
			{
				luafunc.Call(go);
			}
		);
	}
 
	//清除监听
	public static void ClearButtonClick(GameObject go) 
	{
		if (go == null) 
			return;
		
		Button btn = go.GetComponent<Button> ();
		if (btn == null)
			return;
		
		btn.onClick.RemoveAllListeners();
	}
}

接下来测试下这套API,修改Main.lua,代码如下:

--主入口函数。从这里开始lua逻辑
function Main()					
	略
end
 
--加载完成后的回调--
function OnLoadFinish(objs)
	--显示面板
	略
	--事件处理
	local btn = go.transform:FindChild("Button").gameObject
	UIEvent.AddButtonClick(btn, OnClick)
end
 
function OnClick()
	print("触发按钮事件")
end

 

运行游戏,点击按钮,OnClick方法即被调用。

图:按钮的事件响应

读者可以使用相似的方法监听其他UI组件,这里就只演示按钮事件了。

 

3、界面管理器

LuaFramework提供了一套简单的(不完善的)界面管理器,具体代码请参见PanelManager类。PanelManager类的CreatePanel方法完成异步加载资源,在加载完成后,会设置面板的大小和位置,然后调用回调函数。与上面用lua加载界面的方法完全一样。

图:PanelManager的CreatePanel方法

LuaFramework会给每个界面添加名为LuaBehaviour的组件,它拥有用于添加按钮监听的AddClick方法,相关代码如下,与UIEvent的AddButtonClick方法相似。

图:LuaBehaviour的AddClick方法

在LuaFramework的PureMVC架构中,如果要添加一个界面,需要编写对应的Controller、View,以及修改3个框架自带的lua文件,比较繁琐。因此在实际项目中有必要重写PanelManager,由它实现界面的加载及事件处理。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
tolua是一种用于Lua脚本与C++代码互相调用的工具。热更新是指在应用程序运行过程对部分代码或资源进行更新而无需重启应用程序的一种技术。 基于tolua热更新流程一般包括以下几个步骤: 1. 准备Lua脚本和相关资源:首先,需要准备好新的Lua脚本和相关资源文件,这些文件包括更新后的代码逻辑、配置文件、图片、音频等。 2. 下载更新内容:接下来,应用程序需要从服务器或其他渠道下载更新的内容。可以通过HTTP或FTP等网络协议下载文件,也可以使用其他的下载方式。 3. 替换旧的Lua脚本和资源:下载完成后,将新的Lua脚本和资源替换掉原有的文件。这一步可以根据具体的应用程序结构和资源管理方式来确定。 4. 热更新处理:在应用程序运行时,需要动态加载更新后的Lua脚本并重新加载相关资源。这可以通过tolua提供的接口来实现,将新的代码逻辑注入到应用程序。 5. 更新后的逻辑生效:更新后的Lua脚本和资源生效后,应用程序会按照新的逻辑运行,实现热更新的效果。这样就可以在不重启应用程序的情况下完成代码或资源的更新。 总的来说,基于tolua热更新流程可以通过下载更新内容、替换旧的Lua脚本和资源、热更新处理和更新后的逻辑生效等步骤来完成。通过这种方式,可以实现应用程序的部分代码或资源的更新,提升开发效率和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值