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

你看引擎的 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 中这个宏也是启用的,这个设计不合理。之后我们尝试避免。

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