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

Phaser 3如何在Scene.preload执行前完成JSON文件加载

你原来的写法不生效是因为init生命周期中触发的加载任务不会阻塞后续preload生命周期的执行,所以preload运行时JSON还未加载完成,拿到的就是undefined。
下面两种实现方案都满足所有逻辑封装在场景内部的要求:

方案1:使用场景pack配置(推荐)

Phaser官方提供了pack场景配置项,专门用来定义需要在preload生命周期之前完成加载的资源,正好适配你的需求。
代码示例:

var config = { 
  scene: { 
    preload: preload, 
    create: create,
    // pack内定义的资源会在preload前自动加载完成
    pack: {
      files: [
        { type: 'json', key: 'scenedata', url: 'scene.json' }
      ]
    }
  } 
}
var game = new Phaser.Game(config)

function preload () {
  // 进入preload时JSON已经加载完成,可以直接读取
  const sceneData = this.cache.json.get('scenedata')
  
  // 根据JSON内容批量预加载图片
  sceneData.imageList.forEach(imgItem => {
    this.load.image(imgItem.key, imgItem.path)
  })
}

function create () {
  // 此时JSON和所有图片资源都已加载完成,可直接使用
  console.log(this.cache.json.get('scenedata'))
}

方案2:preload阶段动态追加加载任务

如果不想用pack配置,也可以在preload阶段先加载JSON,监听加载完成事件后动态添加后续需要加载的图片资源,Phaser的preload阶段会自动等待队列内所有任务完成后才进入create生命周期。
代码示例:

var config = { scene: { preload: preload, create: create } }
var game = new Phaser.Game(config)

function preload () {
  // 第一步:加载场景配置JSON
  this.load.json('scenedata', 'scene.json')

  // 监听JSON加载完成事件
  this.load.once('filecomplete-json-scenedata', (key, type, sceneData) => {
    // 第二步:根据JSON内容追加需要预加载的图片
    sceneData.imageList.forEach(imgItem => {
      this.load.image(imgItem.key, imgItem.path)
    })
  })
}

function create () {
  // 所有资源都已加载完成
  console.log(this.cache.json.get('scenedata'))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:06:01