cc.director.getScheduler()只有schedule方法,而为什么没有scheduleOnce方法?

如题,我现在是非cc.component的自定义类里面使用定时器,这时候没法用this.scheduleOnce了,只能自己调用cc.director.getScheduler(),但发现里面只有schedule方法,而为什么没有scheduleOnce方法?

请各位老师指教,谢谢!

感觉非常不理解啊。。。

component里的也只不过是封装一下而已,也是调用schedule

我是在自己定义的Node类里面想实现定时器,现在有点糊涂。
我在自定义的Node类里的构造函数ctor里先cc.director.getScheduler().enableForTarget(this);这里的this是Node节点自己。然后调用cc.director.getScheduler().schedule实现自己的定时部分。

现在cc.director.getScheduler().schedule报错 cc.Scheduler: Illegal target which doesn’t have uuid or instanceId

你可以用js的setInterval()或者setTimeout()

或者用update 自己封装一个

唉,本来用setTimeOut,但setTimeOut退出场景时不销毁节点,导致程序崩溃。scheduleOnce能避免这些问题。

自定义类继承一下cc.component就能用了吧

这个不行吧,因为是自定义的节点类,已经继承于节点了。

自己手动销毁一下不行吗?

@ccclass
class A extends cc.Component {
   timer = 0;
   onClick(){
      this.timer = setTimeout(()=> {},1000)
   }
   onDestory(){
       clearTimeout(this.timer)
   }
}
1赞

感谢楼上二位的回复,自己clear掉setTimeout这种方式肯定行。但因为用了非常多的setTimeout,如果这样,设置的变量很多,最后clear起来很麻烦(另外,一些动画工具类里面也有setTimeout)。
另外,主要是既然官方提供了schedulOnce这种能退出时自动销毁的方式,还是希望研究透彻点。
不是没有解决方案,比如使用延迟动作代替定时器等等。但就是想搞清schedulOnce的机制。毕竟这应该是官方最推荐的方式

你的Node类实现IScheduler接口了么

我在自定义的Node类里的构造函数ctor里先cc.director.getScheduler().enableForTarget(this);这里的this是Node节点自己。这算是实现接口了吗?

最好上传个demo

继承自cc.Node,然后在constructor里面addComponent(cc.Component),保存下这个comp的引用,这样就可以用scheduleOnce了

大概就是下面这样:

var GameNode = cc.Class({
    extends: cc.Node,

    properties: {

    },

    ctor: function () {

        cc.director.getScheduler().enableForTarget(this);

    },
    
    onLoad(){
        cc.director.getScheduler().schedule(() => {
			console.log("test schedule")
        }, 1,6);    
    }
});

您的意思是为了用scheduleOnce,特意addComponent(cc.Component)一下?感觉理论上好像可以,但多少有点偏方。。。。没别的意思,非常感谢!这种方式我确实没尝试过

这思路确实挺巧妙,实现起来也方便,唯一有点美中不足就是可能程序的可读性稍微有一点点。。。别人维护起来可能先蒙圈一下,呵呵

方法调用错了啊 image

你的target没传入啊

你可以参考component封装一下