weixin_39569894
weixin_39569894
2020-12-08 18:19

[需求]给Node增加一个 renderable/drawable 的属性.

有时候会有这样的需求:

1 不需要渲染node, 但是希望执行node上的组件的update. (所以 不能用 active =false 来隐藏node

2 同时 逻辑里面还有动态修改 opacity 的需求, 即使不渲染, 也要修改. 这样当再次允许渲染时,opacity才是最新的. 所以 不能用 opacity = 0 的方式来隐藏node

3 类似 opacity , 逻辑里面也有对 position 等属性的动态处理, 所以也不能用 把node移出可视区域的方法来隐藏node

总之 , 这个需求就是希望实现 render时不处理node 以及node下的子节点. 其他的逻辑都正常. 希望增加一个 renderable/drawable 的布尔属性 来实现这个功能.

该提问来源于开源项目:cocos-creator/engine

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • weixin_39569894 weixin_39569894 4月前

    经过交流 , cocos研发人员建议我用一个 不可见的group来间接实现这个需求. 但是还是有个不足.

    假如我要把我正在开发的这个feature做成一个公用的组件, 那么这个组件在使用时就会对使用者有诸多要求. 1) 使用者要指定一个 "不可见的group" 2) 使用者要保证自己项目中所有的摄像机都不会渲染这个"不可见的group" 这种限制会让组件的使用变得不那么便利和傻瓜化.

    另外还有一种极端情况, 就是使用者自己的项目已经使用了所有的group(按目前cocos的设计,最多允许32个group), 那么 就没办法使用这个组件了. 所以 用group的方式, 也不如提供一个 renderable/drawable 的属性 来得简单直接.

    点赞 评论 复制链接分享
  • weixin_39569894 weixin_39569894 4月前

    cocos研发人员又给出一个方案: 使用disableRender()

    但是 这个方法用户需要自己遍历所有层级的节点. 而且在 不渲染期间 , 如果有某个子节点发生了变化, 比如 又增加了一个渲染子节点, 那么还要对新增加的 子节点也做 类似操作, 实际比较难处理.

    另外 disableRender() 后, 如何还原 也就是 enableRender 也是个问题. 不同节点的 enableRender (系统并没有此方法)方式并不太相同.

    点赞 评论 复制链接分享
  • weixin_39874350 weixin_39874350 4月前

    把逻辑节点和渲染节点分成两个节点?隐藏的时候只隐藏渲染节点,逻辑节点的脚本还是能正常运行

    点赞 评论 复制链接分享
  • weixin_39569894 weixin_39569894 4月前

    我现在就是这么做的了. Hero 节点下 有个 avatar节点用来渲染. Hero节点本身是hero的逻辑节点. 不过... 还是觉得不太爽

    点赞 评论 复制链接分享