You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phaser 3自定义精灵类update()方法未触发问题求助

解决Phaser自定义类update()方法不执行的问题

Phaser引擎只会自动调用**场景(Scene)和Phaser内置游戏对象(如Sprite、GameObject)**的update()方法。你自己写的自定义类如果没有继承Phaser的GameObject体系,也没有手动关联到场景的更新循环,引擎根本不知道要去执行它的update方法。


方式一:让自定义类继承Phaser内置游戏对象

如果你的类是用来表示游戏中的可见实体(比如玩家、敌人),推荐直接继承Phaser.GameObjects.Sprite(或其他子类,比如Image、Container)。这样只要把实例添加到场景,引擎就会自动把它纳入更新循环,调用其update方法。

自定义类示例(createGooBoi.js)

class GooBoi extends Phaser.GameObjects.Sprite {
    constructor(scene, x, y) {
        // 调用父类Sprite的构造函数,传入场景、坐标、纹理名
        super(scene, x, y, 'gooboi-texture');
        
        // 将实例添加到场景,这是关键步骤
        scene.add.existing(this);
        // 如果需要物理系统,添加物理体
        scene.physics.add.existing(this);
        
        // 初始化自定义属性
        this.moveSpeed = 250;
    }

    // 重写update方法,引擎会自动调用
    update(time, delta) {
        // 这里写你的更新逻辑,比如移动
        this.x += this.moveSpeed * (delta / 1000);
        
        // 超出屏幕重置位置
        if (this.x > this.scene.game.config.width) {
            this.x = -this.width;
        }
    }
}

场景中实例化示例(Level_1.js)

class Level_1 extends Phaser.Scene {
    constructor() {
        super('Level_1');
    }

    preload() {
        // 先加载纹理
        this.load.spritesheet('gooboi-texture', 'assets/gooboi.png', { frameWidth: 32, frameHeight: 32 });
    }

    create() {
        // 直接实例化,自动加入更新循环
        this.player = new GooBoi(this, 100, 200);
    }

    // 场景的update可以保留,不影响自定义类的update执行
    update(time, delta) {
        // 其他场景级逻辑
    }
}

方式二:手动在场景update中调用自定义类的update

如果你的类不需要继承Phaser内置对象(比如纯逻辑类),可以手动在场景的update方法里调用自定义类的update。注意必须保存自定义类的实例引用到场景属性中,否则会出现调用失败的情况。

自定义类示例(createGooBoi.js)

class GooBoi {
    constructor(scene, x, y) {
        this.scene = scene;
        this.x = x;
        this.y = y;
        this.moveSpeed = 250;
        
        // 手动创建精灵并添加到场景
        this.sprite = scene.add.sprite(x, y, 'gooboi-texture');
    }

    update(time, delta) {
        // 更新精灵位置
        this.sprite.x += this.moveSpeed * (delta / 1000);
        
        if (this.sprite.x > this.scene.game.config.width) {
            this.sprite.x = -this.sprite.width;
        }
    }
}

场景中调用示例(Level_1.js)

class Level_1 extends Phaser.Scene {
    constructor() {
        super('Level_1');
    }

    preload() {
        this.load.spritesheet('gooboi-texture', 'assets/gooboi.png', { frameWidth: 32, frameHeight: 32 });
    }

    create() {
        // 将实例保存为场景的属性,关键!
        this.myGooBoi = new GooBoi(this, 100, 200);
    }

    update(time, delta) {
        // 手动调用自定义类的update,传入time和delta(可选,但推荐)
        this.myGooBoi.update(time, delta);
    }
}

你之前手动调用失败的可能原因

  • 自定义类实例是局部变量(比如在create里只写new GooBoi(...)没赋值给this.xxx),导致场景update里找不到实例;
  • 自定义类的update方法拼写错误(比如写成Update大写开头);
  • 调用时没传必要的参数,导致逻辑执行异常。

内容的提问来源于stack exchange,提问作者Khendry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:13:34