-
Creator 版本: 3.7.0,3.7.2
-
目标平台: windows模拟器
我新建的测试项目,项目如下:
就是设置了一个bundleA,没有任何地方调用assetManager.loadBundle去加载这个bundleA,但是这个日志会在游戏启动时打印出来,说明这个脚本已经被加载了。不知道是bug还是设计如此,如果引擎就是这么设计的,也不明白为什么这么设计?理论上最好应该在我主动加载bundle时才去加载我的脚本吧???
Creator 版本: 3.7.0,3.7.2
目标平台: windows模拟器
我新建的测试项目,项目如下:
?????????
咋了兄弟??
这个这是编辑器里面啦。
1.如果你在类前面加上@ccclass(‘组件名(一般和类名相同)’),代表这个脚本当作组件挂到节点上,运行时节点发现有这个组件则执行这个组件代码里面的生命周期函数。
2.不属于任何类的代码不管在哪个脚本都会先于组件生命周期执行,你把这个打印放到别的脚本也一样打印,不要疑神疑鬼。
如果你想把当前脚本当做一个工具类,应该将@ccclass标签移除,const属性也一并删除
你没明白我的意思。我的BundleA.ts脚本在bundleA中,(强调一下bundleA是个bundle),而且BundleA.ts没有挂载到任何节点上,也没有任何地方加载过bundleA。启动游戏,为什么会加载我的bundleA中的BundleA.ts呢?明显不合理啊。
我第2点已经说了啊 不属于任何类的代码不管在哪个脚本都会先于组件生命周期执行,你这个打印是写在类外面的,你没发现类里面的生命周期没有执行吗。
你把这个打印代码放到任何脚本 不管是组件脚本还是不是组件的脚本,只要在类外边,都会先于组件生命周期执行。
你的意思是不管在哪个bundle的脚本,在游戏启动的时候都会被加载?那划分bundle还有什么意义?划分了个寂寞?我去看看官方文档怎么说。
这跟bundle没关系啊老铁 这就是编译成Js之后,编译器将不属于类中的代码指令提前执行,别想那么复杂。。
楼主是想该bundle下的js脚本跟主的分开,单独加载。不过3.x后的bundle乱糟糟的,有一些bug。我都怀疑他们测试人员严重不足 
官方文档这么说的还是有其他文档?我看看。
是啊,遇到无数的坑了
export class BundleA extends Component {
onLoad() {
console.log("BundleA script loaded");
}
}
没关系啊,分包归分包,你把打印的代码写类函数里面就不会执行了啊。你要想把这些脚本动态挂载那就把@ccclass标签移除,const属性也一并删除,生命周期照样写,当你挂载到节点上的时候执行生命周期。
一般情况像你说的这样写肯定没问题,但是我有一些逻辑要写在class外面的,想要在加载bundle时执行。官方也没说所有的逻辑一定要写在class中。也不是所有的脚本一定是class吧。
生命周期有个init函数,先于onLoad执行,你可以写在init里面,但是init弊端是获取不到节点上的组件,onLoad可以获取,一般onLoad就够用了,init主要是初始化数据
建议不要把代码写在类外面,因为1.后期不好维护,这个脚本写一点那个脚本写一点后期找死人;2.每个脚本类外边的代码执行顺序难以预计。