怎么判断是在编辑器预览的。。

也算是很不错了,终于可以用官方的节点树调试了 :smile:

EDITOR为true意味着仍然可以使用编辑器本身的能力。
如果原来写的if EDITOR then在game view中仍然生效

:sweat_smile: 有没有方案能判断当前处于在编辑器内预览的状态。。。。而不是编辑器状态

:sweat_smile:因为扩展了部分方法 不希望在编辑的过程中执行,但是期望在预览的时候执行。。。这样没法区分阿

:rofl:比如 我给一个预制添加了一个 动画,期望是 运行的时候 才会播放,在编辑的时候不播放。
但是实际上在编辑器预览的时候 无法判断是不是在预览状态,导致打开预制体的时候就会开始播放这个东西,如果判断了EDITOR 为true的情况下屏蔽的话 在预览状态下又不会播。

1赞

executeineditmode是针对在编辑状态下运行组件脚本,如果不想在编辑状态下执行某些业务逻辑,只要把此类相关业务逻辑放在一个没有被executeineditmode的脚本中即可,那么在game view中,此脚本是会被执行整个生命周期的,无需对EDITOR作判断

1赞

那就不能判断是在 gameview 运行的?

1赞

我建议还是应该给个值 能判断一下当前处于预览状态。。例如在预览状态下preview是true或者咋样。。

:joy:我现在是拿个脚本挂在非编辑状态运行的组件上放个变量判断,但是我觉得这做法有点憨

比较本来一个变量就解决的事情,突然要分成多个脚本其实很奇怪

比如我这里有个组件脚本,添加的时候需要对被添加的节点设置一下部分属性或者添加几个固定的子节点,方便组件运行时候的功能,这个时候分成两个组件未免也太奇怪了,如果让人去记要怎么弄然后每次手动去干也不科学涩。

1赞

EDITOR && !cc.GAME_VIEW

4赞

有用,谢谢。

这个判断暂时可以使用,但最终接口应该以编辑器预览摘掉实验性功能后的接口为准。可以的话,还是建议把不需要在编辑器中运行的代码,从executeInEditMode(true)的脚本中剥离出来。

已经尽量避免了, 但是还是有复杂的组件有这个情况. 因为之前用的是网页预览, 现在既然有编辑器预览就想着用编辑器预览, 结果你告诉我编辑器预览 不能判断是否处于预览状态, 这明显不科学

:rofl: 说实话扩展了一些 比较复杂的组件 需要所见即所得 所以需要把部分逻辑丢到编辑器内执行
不能所见即所得 美术还原度要求高的情况下 改一下运行一下 雀实好难受

话说为啥资源管理器的右键菜单都开放扩展, 层级管理器的右键菜单 要怎么扩展…

最终怎么处理?不考虑弄一个变量?硬要把一个脚本分成两个?

你看引擎的 UIRenderer

如果在 GameView 使用 tween 对组件的 color 进行缓动,会走进来这里

        set color(value) {
          if (this._color.equals(value)) {
            return;
          }

          this._color.set(value);

          this._updateColor();

          if (EDITOR) {
            const clone = value.clone();
            this.node.emit(NodeEventType.COLOR_CHANGED, clone);
          }
        }

而 tween 是构造一个假对象进行缓动,并没有 clone 函数。

那么有两种修改方法:
1.tween 不再构造一个假对象
2.按照你说的,拆分脚本,把 UIRenderer 的 executeInEditMode 去掉,咱再搞一个 UIRendererInEditor

你觉得哪种方法好?

你有没有觉得改成 EDITOR && !PREVIEW 是最方便的了?

或者你还是怪 tween 构造了个假对象?

我,觉得这两个问题都好扯

强烈建议增加一个标志区分编辑器预览模式,强制要求剥离代码体验太差

前述回复看了,没有太 get 到不应该拆分组件的点。依我的开发经验这两个环境下是应该拆分到不同组件比较优雅。可以重新讲讲需求是什么?要完成什么任务?欢迎打脸。

先不用讲任何例子,需要区分当前游戏是否在 “实际运行中” 这个需求肯定是有的吧。

我不知道其他人,我自己之前是靠 EDITOR 进行判断的,问题也出在这里,Creator 没有一个宏是直接表达 “游戏处于实际运行中” 含义的,PREVIEW 的意思是预览中,EDITOR 的意思是在编辑器中,两个都不对,但是因为之前没有 GAMEVIEW,所以最接近游戏处于实际运行中意思的宏就是 EDITOR 了。

随便说个具体的例子,比如一个按钮组件,很简单就是在编辑时也可以响应一些事件或者属性的变化,改变按钮的外观,达到所见即所得的效果。

那么首先可能先判断需不需要将组件设置为 executeInEditMode,这个重点只是看组件需不需要在编辑时运行生命周期函数,根本和上面说的没啥关系。

即使不设置为 executeInEditMode,依然会因为在编辑时需要运行的代码和在实际运行时需要的代码是不一样的,所以自然而然加上一个 if(EDITOR) 来分开。

而不是再写一个 ButtonInEditor 组件,就算写出来了好用吗?

引擎里使用 EDITORGAME_VIEW 结合来达到判断 “实际运行中” 的代码还少吗,这都不需要专门去 get 这个点吧?

引擎的 Button:

引擎的 Constraint:

搜索结果有三四页:

image

关于在编辑时需要运行的代码和在实际运行时需要的代码不一样的例子,之前写一个组件需要加载资源时也遇到了,编辑器中加载资源不能直接用 bundle 接口,而是用 loadAny 或者其他什么。

这时就是直接 if(EDITOR) 用不同的方式加载资源。

这种也到不了需要抽出成另一个组件的程度。

1赞

明白了,问题是出在 EDITOR 上,即便是在 GAME VIEW 中这个宏也是启用的,这个设计不合理。之后我们尝试避免。

嗯嗯,现在的那些宏设计得感觉有点混乱