求问各位大大,想全局监听所有的button组件

想监听全局的button,能让它点击的时候播放一段声音。有什么快捷的方法么?

想监听触摸屏幕的话就给canvas添加事件,想所有按钮点击都播放声音,那就写个脚本处理,把这脚本给所有btn挂上。

:joy::joy:那就回归给组件一个一个添加的本质了。哈哈哈哈

你可以自己外挂一个按钮点击的组件,里面处理播放声音,这样就不用在每个点击事件写代码了。

现在是这样操作的,就是每个按钮的节点都得拖一次脚本进去

修改Button原型cc.Button.prototype._onTouchEnded的这个方法

:heart_eyes:

想问一下您怎么写的方法合并呢?原有的_onTouchEnded也是有作用域的

_onTouchEnded (event) {
if (!this.interactable || !this.enabledInHierarchy) return;

    if (this._pressed) {
        cc.Component.EventHandler.emitEvents(this.clickEvents, event);
        this.node.emit('click', this);
    }
    this._pressed = false;
    this._updateState();
    event.stopPropagation();
},

onLoad监听click事件或者直接加在this.node.emit(‘click’, this)后面应该都可以吧。

我尝试了各种的方法,发现原型链的方法覆盖有点难度,最后放弃了,用了最蠢的方法。这个方法只需要修改到一个全局的脚本。这段代码只需要写在较早的生命周期里面,加载到全局即可。

cc.Button.prototype._onTouchEnded = (event) => {
            //  我这里是为了让全局的按钮都能播放一个声音,不想一个一个添加,懒人
            //  需要使用的修改这部分即可,this指向的是对应脚本
            cc.audioEngine.play(this.buttonAudio, false)
            //  下面这面这部分是改变原先_onTouchEnded的this指向,应该还有一个更简便的方法,而不需要定义self
            let self = event.target.getComponent(cc.Button)
            if (!self.interactable || !self.enabledInHierarchy) return;

            if (self._pressed) {
                cc.Component.EventHandler.emitEvents(self.clickEvents, event);
                self.node.emit('click', self);
            }
            self._pressed = false;
            self._updateState();
            event.stopPropagation();
        }
2赞

求完整代码啊大佬