beta 15 到 beta18,引擎不支持循环引用,导致项目无法修复的bug

我怀疑是什么冲突了,但是从log上我不知道具体是什么原因!就是前几分钟脚本是可以挂载的,也是可以运行的,然后呢突然就先报警告,什么属性不能为空,但是我赋值了,然后有一个公布在检视面板的变量连名字都和脚本里对应的不一样了,变成“Public”了,然后然后我就回到解放前,疯狂报红!!!!无法加载脚本,先是MainPanel.ts无法在挂载,过了几分钟其它脚本可以挂机运行的也无法挂载。
如图:


我眼泪都快流下来了,这是第二次重做!!!
我现在怀疑人生。:sob:
我的工程链接:HuangLeQiuQiu_001(崩溃).zip (2.5 MB)(开发版本 beta 18)
官方大佬,快来看看是怎么回事啊。

看了一下是循环引用导致的,UIMgr 里面导入了各种 Panel,而这些 Panel 在 extends 中继承自 UIMgr,导致的问题。

解决方案:

将 UIMgr 和 Panel 基类拆分开,所有 Panel 继承自 Panel 基类,不 import UIMgr,UIMgr 引用这些 Panel 即可。

1赞

好像不仅仅是这个原因。因为我之前有个Demo没这么做,也崩了。

可以用,但是得解决一下循环引用问题。以下代码摘取自项目“HappyBall2(修复bug9.25)”

  1. 各种 Panel -> PanelRoot -> ResSvc -> GameRoot -> MainMgr,最关键的在于 MainMgr 里面依赖了各种 Panel(通过 @property({type: XXPanel}));
    一种解决办法:
    取消 GameRootMainMgr 的依赖。将 GameRoot.ts 中的
let mainMgr: MainMgr = this.node.getComponent(MainMgr);

改为

// 通过字符串而非类本身来获取 MainMgr 组件
// "MainMgr" 是 类 MainMgr  的 cc 名称,因为有:
// ```ts
// @ccclass("MainMgr") export class MainMgr
// ```
let mainMgr: MainMgr = this.node.getComponent('MainMgr') as MainMgr;
  1. LoadPanel -> PanelRoot -> ResSvc -> GameRootGameRoot 本身依赖了 LoadPanel (通过 @property(LoadPanel)
    一种解决办法:
    取消 GameRoot 对 LoadPanel 的依赖。将 GameRoot.ts 中的
@property(LoadPanel)
public loadPanel: LoadPanel = null;

改为

// 通过字符串而非类本身来标记属性类型为 LoadPanel;"loadPanel" 是 类 LoadPanel  的 cc 名称
@property('LoadPanel')
public loadPanel: LoadPanel = null;
1赞