lua按钮unity_Unity3D热更新之LuaFramework篇[03]--prefab加载和Button事件

1、创建一个预制体

打开上次使用的工程,打开Main场景,创建一个名为ImgOrc的Image,图片就选例子用的兽人头像。在Assets/LuaFramework/CustomPrj目录下新建一个Prefabs目录,然后拖动ImgOrc到该目录下做成预制体,如图1-1

图1-1

2、将预制体打成AssetBundle包

打开Assets/ LuaFramework/Editor/Packager.cs文件(用VS或Mono Develop编辑器打开),找到HandleExampleBundle方法,添加对ImgOrc预制体的打包代码,如图1-2所示

图1-2

1 ///

2 ///处理框架实例包3 ///

4 static voidHandleExampleBundle() {5 string resPath = AppDataPath + "/" + AppConst.AssetDir + "/";6 if (!Directory.Exists(resPath)) Directory.CreateDirectory(resPath);7

8 AddBuildMap("prompt" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Prompt");9 AddBuildMap("message" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/Examples/Builds/Message");10

11 //打包我们新加的FirstPanel预制体

12 AddBuildMap("first" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/CustomPrj/FirstTest");13 //打包我们新加的ImgOrc预制体

14 AddBuildMap("prefabs" + AppConst.ExtName, "*.prefab", "Assets/LuaFramework/CustomPrj/Prefabs");15

16 AddBuildMap("prompt_asset" + AppConst.ExtName, "*.png", "Assets/LuaFramework/Examples/Textures/Prompt");17 AddBuildMap("shared_asset" + AppConst.ExtName, "*.png", "Assets/LuaFramework/Examples/Textures/Shared");18 }

打包代码

这里要对AddBuildMap方法的参数加以说明

第一个参数是包名,即打包后在StreamingAssets目录中显示的包的名称,AppConst.ExtName是扩展名,框架默认为".unity3d",可以自行修改;

第三个参数是要打包的资源的目录,暂且称为源目录;

第二个参数是打包模式,以字符串形式过滤出要打包的文件名,比如这里*.prefab就表示源目录下的所有prefab文件。

之所以将ImgOrc预制体打包的包名定义为prefabs而不是ImgOrc,是因为这个打包是针对整个目录的而不是单个资源。为了说明这一情况,我会在CustomPrj/Prefabs目录下再加一个预制体ButtonPrefab。见图1-3

见图1-3

这次不修改打包文件。

找到LuaFramework菜单,点击Build Windows Resources菜单项,开始自动打包操作,中间无需干预。

打包结束,查看StreamingAssets目录,能看到与刚刚给定的包名相应的文件:prefabs.unity3d,见图1-4

图1-4

图中红框标识的还有一个名为prefabs的文件,这是没有显示后缀(其实有后缀,在unity中未显示),这个是prefabs.unity3d包的清单文件,在windows下打开看以看到其全名为prefabs.unity.manifest。

用Notepad++打开这个清单文件,可以看到在37、38行列出一这个AB包包含的两个资源:ButtonPrefab.prefab和ImgOrc.Prefab。见图1-5:

图1-5

此框架的资源打包方式就是这样的,所有资源都需要在代码中添加相应包名、过滤模式、目录。游戏开发前期和资源变动较大时,会频繁改动这个脚本的内容,用起来并不是很方便。

3、在代码中加载预制体

资源包有了,现在需要在代码中加载这个包。

打开FirstCtrl.lua文件,在FirstCtrl.OnCreate方法中添加读取资源包的方法,见代码:

--启动事件--

function FirstCtrl.OnCreate(obj)

gameObject = obj;

message = gameObject:GetComponent('LuaBehaviour');

--加载prefabs.unity3d资源包

resMgr:LoadPrefab("prefabs.unity3d", {"ImgOrc"}, function (prefabs)

end);

end

resMgr是框架封装好的资源管理工具,LoadPrefab函数用来读取资源包。第一个参数是包名,第二个参数是包里的资源名(Prefab名称),第三个参数是包读取成功的回调,参数prefabs为读出来的资源。

..

继续完成代码,进行实例操作等操作,代码如下:

1 --启动事件--

2 function FirstCtrl.OnCreate(obj)3 gameObject =obj;4 transform =obj.transform;5

6 message = gameObject:GetComponent('LuaBehaviour');7

8 --加载prefabs.unity3d资源包

9 resMgr:LoadPrefab("prefabs.unity3d", {"ImgOrc"}, function (prefabs)

10 log(prefabs.Length); --输出 1

11 log(prefabs[0].name) --输出 ImgOrc

12

13 --加载兽人头像到FirstPanel下

14 local go = newObject(prefabs[0]); --实例化

15 go.transform:SetParent(transform); --设置FirstPanel为父对象

16 go.transform.localPosition = Vector3.zero; --设置初始位置

17 go.transform.localScale = Vector3.one; --设置缩放

18

19 end);20 end

说明点:

回调函数的参数prefabs是一个userdata类型的数据(userdata一般是C#中的部分引用类型在Lua中的表示),这里猜测是一个数组,因为通过.Length可以取到长度,能过[0]能取到第一个元素。

newObject是框架封装好的实例化函数,猜测本质就是c#中的GameObject.Instantiate方法。

设置父对象、位置、缩放这几步操作和c#中的操作差不多。因为本身调用的就是c#中的方法,即transform的方法。

FirstCtrl.lua文件中的gameObject,transform代表的就是FirstPanel面板及面板上transform组件,是在面板创建时(OnCreate方法前两行)注入进来的。

代码完成后,运行Unity,能看到ImgOrc已经加载到了FirstPanel对象下,见图1-6

图1-6

非Panel的预制体加载流程就是这样,加载方法是参照例子的PromptCtrl.lua写的。

resMgr中还有放多其它加载资源的方法,留待以后再探究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值