Cocos Creator基础教程(8)—加载预制件

Stella981
• 阅读 785

我们上篇讲了[场景切换] 并编写了LoadScene场景加组件,这次我们在场景里面创建独立的子界面或子窗口。在Cocos Creator中实现子界面的最好方案就是: 预制件

1. 生成预制件

Cocos Creator并没有一个新建预制件的功能菜单项,我们可以在场景中先做一个大概的布局,然后在层级管理器中将节点拖动到资源管理器中,看下图:

Cocos Creator基础教程(8)—加载预制件

层级管理器资源管理器的本质是内存数据与磁盘文件的关系,从层级管理器将节点拖到资源管理器,就是从内存中将数据保存到磁盘上。

需要注意的是场景中的Dialog节点与资源管理器的Dialog预制文件并没有太多的联系,他们是同一个数据不同的表现形式而已,如果感兴趣可以用文本编辑器打开预制文件了解。

2. 编辑预制件

双击预制件文件,切换到预制件的独立编辑界面:

Cocos Creator基础教程(8)—加载预制件

预制件的界面编辑与场景一样,但它们都应该保持逻辑清晰的层级结构,注意下面几点:

  1. 有意义的节点命名,同层节点名尽量不要重复

  2. 建立节点之间在逻辑上的祖、父、子关系(例如:按钮上显示文字,就应该将Label节点放在Button节点的内部)

  3. 将预制件根节点坐标位置设置为{x:0, y:0}

  4. 建议预制文件名预制件根节点名字保持一至

3. 预制加载组件

接下来我们来实现LoadPrefab组件,先上代码:

cc.Class({
    extends: cc.Component,    //组件属性定义
    properties: {
        PREFAB: cc.Prefab, //预制件
        parent: cc.Node,   //预制件实例化后所在的父节点
        autoLoad: false,   //自动加载
    },    
    //组件加载时检查,是否自动加载预制件
    onLoad() {
        if (this.autoLoad) {
            this.loadPrefab();
        }
    },    
    //实例化预制件,设置父节点
    loadPrefab() {
        let node = cc.instantiate(this.PREFAB);
        //当父节点不存在时,使用当前组件为父节点
        node.parent = this.parent || this.node;
    }
});

我们用一个按钮点击显示Dialog对话框,一起看看在编辑器上的配置,见下图:

Cocos Creator基础教程(8)—加载预制件

  1. 在场景中添加一个Button控件

  2. 将LoadPrefab组件脚本挂载到Button节点上

  3. 从资源管理器中将Dialog预制件拖动到DialogLoadPrefab组件PREFAB属性上,这是我们要加载的预制件

  4. 从层级管理器将Canvas节点拖动到DialogLoadPrefab组件Parent属性上,这是预制件实例化后的父节点

  5. 配置按钮事件,与上篇场景加载相同,就是调用Button节点上的LoadPrefab组件上的loadPrefab函数。

编辑器配置复杂了点,这里分享一个小小的经验,配置好一个复杂的组件后,你可以通过复制节点或复制组件,将其粘贴到界面中再做修改,这样比重头配置组件参数可以提高50%以上的效率。不过还好代码还是比较简单,你也可以在组件代码中监听触摸事件来调用loadPrefab函数,同样可以减化编辑器配置(同样参考场景切换一篇)。

我们的组件上还提供了一个autoLoad属性,可以在宿主节点创建时自动创建预制件,这可以解决直接将预制件拖入场景,然后又去编辑预制件,导致场景中的预制节点与预制文件不同步的问题(预制件的嵌套问题)。

4. 小结

这篇我们讲解了预制件的生成,就是编辑的界面从内存保存到磁盘,之后可以通过cc.instantiate函数将预制件文件实例化为节点。同时介绍了我对编辑预制件的一点小经验供大家参考。

最后编写了一个通用的LoadPrefab组件,可以方便非程序员同学使用。有了这些组件代码的积累相信以后不论是做游戏还是原型或是Demo,都能为我们提高生产效率。


欢迎关注「奎特尔星球」微信公众号,来我们一起成长!

Cocos Creator基础教程(8)—加载预制件

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Cocos Creator 加载和切换场景(官方文档摘录)
CocosCreator加载和切换场景(官方文档摘录)在CocosCreator中,我们使用场景文件名(可以不包含扩展名)来索引指代场景。并通过以下接口进行加载和切换操作:cc.director.loadScene('MyScene');通过常驻节点进行场景资源管理和参数传递
Wesley13 Wesley13
3年前
MySQL总结(十一)子查询
!(https://oscimg.oschina.net/oscnet/upa344f41e81d3568e3310b5da00c57ced8ea.png)子查询1\.什么是子查询需求:查询开发部中有哪些员工selectfromemp;通
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java多线程导致的的一个事物性问题
业务场景我们现在有一个类似于文件上传的功能,各个子站点接受业务,业务上传文件,各个子站点的文件需要提交到总站点保存,文件是按批次提交到总站点的,也就是说,一个批次下面约有几百个文件。      考虑到白天提交这么多文件会影响到子站点其他系统带宽,我们将分站点的文件提交到总站点这个操作过程独立出来,放到晚上来做,具体时间是晚上7:00到早上7:00。
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这