【本文参与征文活动】
自动加载预制组件 AutoLoad
目前大家都有过这样的开发场景,游戏主要集中在1~2个场景中,游戏的内容很多,功能各异。
面临问题
- 如果全部拼在一个场景中.
- 场景会变得很大,打开编辑和游戏加载都会变的很慢。
- 分成一个一个小的预制,在代码中按照预定规则加载上来.
- 无法在编辑器中预览整体效果
- 修改得拖上来-修改-保存-移除. 步骤繁琐
- 写一个组件绑定预制 在编辑器预览和移除
- 实际加载时也要先加载绑定预制 才能显示界面
- 需要小心运行运行和关闭界面时 没有忘记移除
组件效果
-
挂在
AutoLoad绑定预制- 不会拖慢加载界面的速度
- 不是将预制直接复制到界面中, 而是将
预制的uuid保存到AutoLoad的uuid属性中.
-
编辑器中可以预览绑定预制的生成效果
- 根据uuid找到预制, 加载并创建
node -
默认锁定防止误触 -
不会被保存界面修改 或node修改,node都不会被保存到界面上, 下次打开界面上时还是什么都没有
- 根据uuid找到预制, 加载并创建
-
修改
node时可以保存覆盖到原预制
- 实时调整界面效果, 实时生成界面效果
- 鼠标选中
node, 才会生效. 防止临时调整也被保存
-
AutoLoadEditor和AutoLoad相关又分离
-
AutoLoadEditor继承AutoLoad - 编辑器中选中
AutoLoad就是使用AutoLoadEditor - 界面实际保存时保存的是
AutoLoad
-
JudgeLoad可以自己添加属性实现在不同平台是否使用AutoLoad组件
- 老的预制已经完工 但是又不想在界面上显示 可以用此隐藏起来
- 最终达到快速显示界面上的内容 功能也能一个一个完整的加载上来
原理
-
绑定预制时 预制的属性_uuid 就是预制的uuid 可以据此找到该预制
-
修改
node的 _objFlags属性
- cc.Object.Flags.DontSave 不保存
- cc.Object.Flags.LockedInEditor 编辑器锁定
- 保存修改预制到原预制
- Editor.Ipc.sendToPanel(‘scene’, ‘scene:apply-prefab’, this.child.uuid)
- 监听软重载, 避免
被保存
- require(“electron”).ipcRenderer.on(“scene:soft-reload”, this.removeNode)
- 编辑器替换组件
- 修改cc.js中的 _idToClass 和 _nameToClass
快捷键
- alt+a 显示/隐藏左右自动加载预制
- alt+s 保存选中
node(可以的时node子节点也可以)
结束
- 代码简单易懂 欢迎各位自己动手改成自己喜欢的样子
- 之前使用过插件来实现这个功能, 后来发现不是我想要的. 这使得这套功能变得复杂, 不利于自己和各位依据自身情况, 动手修改.
