为什么这个非常明确定义(在JSONLoader的回调中)的对象读为未定义?

Why does this very clearly defined (in callback to JSONLoader) object read as undefined?

本文关键字:回调 对象 未定义 JSONLoader 非常 定义 为什么      更新时间:2023-09-26

为什么这个THREE.Mesh()对象在THREE.JSONLoader()中明确定义时未定义?这是我的代码…

1: var player;
2: var playerCallback = function(geo, mats){
3:     player = new THREE.Mesh(geo, new THREE.MeshFaceMaterial(mats));
4:     console.log("Loaded Model: " + 'resources/models/Player.js');
5: }
6: JSONLoader.load('resources/models/Player.js', playerCallback);
7: player.position.set(0, 20, 20);
8: player.physics = false;
9: scene.add(player);

我得到的错误是针对行"7",说玩家是未定义的。在此之前,"Loaded Model: resources/models/Player.js"会按原样显示。

因为它是在playerCallback块执行之前执行的。

JSONLoader加载外部文件,但这需要时间。在等待文件加载的过程中,它会继续执行你的脚本。

因此,当它加载外部文件时,它试图访问一个未定义的变量(播放器)。为了使这个工作正常,你需要确保你的程序只尝试访问播放器全局后,它已被定义。

修改你的代码,这样做:

var player;
var playerCallback = function(geo, mats){
    player = new THREE.Mesh(geo, new THREE.MeshFaceMaterial(mats));
    console.log("Loaded Model: " + 'resources/models/Player.js');
    performPlayerActions();
}
JSONLoader.load('resources/models/Player.js', playerCallback);
function performPlayerActions() {
    player.position.set(0, 20, 20);
    player.physics = false;
    scene.add(player);
}

我所做的就是将你的播放器代码移到另一个函数中,然后在我们确定播放器已经被定义(在外部文件加载之后)之后调用它。