分享一个自动加载预制的组件

【本文参与征文活动】

自动加载预制组件 AutoLoad

目前大家都有过这样的开发场景,游戏主要集中在1~2个场景中,游戏的内容很多,功能各异。

面临问题

  1. 如果全部拼在一个场景中.
  • 场景会变得很大,打开编辑和游戏加载都会变的很慢。
  1. 分成一个一个小的预制,在代码中按照预定规则加载上来.
  • 无法在编辑器中预览整体效果
  • 修改得拖上来-修改-保存-移除. 步骤繁琐
  1. 写一个组件绑定预制 在编辑器预览和移除
  • 实际加载时也要先加载绑定预制 才能显示界面
  • 需要小心运行运行和关闭界面时 没有忘记移除

组件效果

  1. 挂在AutoLoad绑定预制

    • 不会拖慢加载界面的速度
    • 不是将预制直接复制到界面中, 而是将预制的uuid保存到AutoLoad的uuid属性中.
  2. 编辑器中可以预览绑定预制的生成效果

    • 根据uuid找到预制, 加载并创建node
    • 默认锁定 防止误触
    • 不会被保存 界面修改 或 node修改, node都不会被保存到界面上, 下次打开界面上时还是什么都没有 :slight_smile:
  3. 修改node时可以保存覆盖到原预制

  • 实时调整界面效果, 实时生成界面效果
  • 鼠标选中node, 才会生效. 防止临时调整也被保存
  1. AutoLoadEditorAutoLoad 相关又分离
  • AutoLoadEditor继承AutoLoad
  • 编辑器中选中AutoLoad就是使用AutoLoadEditor
  • 界面实际保存时保存的是AutoLoad
  1. JudgeLoad可以自己添加属性实现在不同平台是否使用 AutoLoad组件
  • 老的预制已经完工 但是又不想在界面上显示 可以用此隐藏起来
  1. 最终达到快速显示界面上的内容 功能也能一个一个完整的加载上来

原理

  1. 绑定预制时 预制的属性_uuid 就是预制的uuid 可以据此找到该预制

  2. 修改node的 _objFlags属性

  • cc.Object.Flags.DontSave 不保存
  • cc.Object.Flags.LockedInEditor 编辑器锁定
  1. 保存修改预制到原预制
  • Editor.Ipc.sendToPanel(‘scene’, ‘scene:apply-prefab’, this.child.uuid)
  1. 监听软重载, 避免 保存
  • require(“electron”).ipcRenderer.on(“scene:soft-reload”, this.removeNode)
  1. 编辑器替换组件
  • 修改cc.js中的 _idToClass 和 _nameToClass

快捷键

  1. alt+a 显示/隐藏左右自动加载预制
  2. alt+s 保存选中node (可以的时node子节点也可以)

结束

  1. 代码简单易懂 欢迎各位自己动手改成自己喜欢的样子
  2. 之前使用过插件来实现这个功能, 后来发现不是我想要的. 这使得这套功能变得复杂, 不利于自己和各位依据自身情况, 动手修改.

Demo地址

https://gitee.com/landream/AutoLoad

8赞

解决了一个使用痛点

老铁棒棒的

我还是花了点心思的,还是自顶一下把:slightly_smiling:

不错 给你点赞