Phaser 3相机应用遮罩时setMask is not a function报错
问题根因
抛出Uncaught TypeError: this.cameras.main.setMask is not a function(未捕获类型错误:this.cameras.main.setMask不是一个函数)错误的核心原因是本地项目使用的Phaser版本过低。
相机对象的setMask方法是Phaser 3.50.0版本才正式加入的API,你参考的官方演示环境默认运行最新版Phaser,所以示例代码能正常跑,但如果本地项目用的是3.50之前的版本(比如常见的3.2x、3.1x版本),相机实例上根本没有挂载这个方法,调用必然报错。
你把调用对象换成player游戏对象能正常运行,是因为游戏对象(GameObject)的setMask方法在很早的Phaser版本就已经支持,和相机的setMask不是同一批上线的接口,所以不会抛错,但自然也实现不了相机全局遮罩的效果。
解决方案
根据你的项目情况二选一即可:
- 直接升级Phaser版本到3.50及以上的稳定版,这是最省事的方案,升级后你原来写的代码不需要做任何修改,直接运行就能实现预期的相机全局遮罩效果,和官方演示的表现完全一致。
- 如果你因为项目兼容问题没法升级Phaser版本,可以用旧版本兼容的写法实现同等效果,不需要调用
setMask方法,直接给相机的mask属性赋值即可,调整后的代码如下:
const maskImage = this.make.image({ x: 400, y: 300, key: 'mask', add: false }); const mask = maskImage.createBitmapMask(); // 旧版本直接给mask属性赋值实现相机遮罩 this.cameras.main.mask = mask;
注意:用旧版属性赋值的写法时,切换场景、销毁相机前记得手动把
this.cameras.main.mask设为null清空引用,不然容易出现遮罩残留、内存泄漏的问题。
实现战争迷雾的小提示
如果要做跟随玩家的战争迷雾效果,记得在相机的更新回调里同步maskImage的坐标和玩家的世界坐标,不然相机动的时候,遮罩的亮区会停在初始位置,不会跟着玩家移动。
内容的提问来源于stack exchange,提问作者jack1230
相关产品推荐
相关产品推荐

