0

私は babylonjs を試してきましたが、これまでのところすべてが素晴らしいです。すべてが同じファイル内の ImportMesh コールバック関数にある場合、メッシュを読み込んでアニメーション化することができます。でも; 物事を分割して以下のような単純なことをしようとすると、これらの競合状態が発生するようです。次の例を見てください。

var models = ["brick_wall", "tree1", "person1"]

for (var i =0;i<models.length;++i) {


    BABYLON.SceneLoader.ImportMesh(models[i], "models/","tree.babylon", scene, (newMeshes) => {


        this.meshMap[models[i]] = newMeshes[0]
        console.log("mesh set:" + models[i])
    });
}

コンソール ログは「メッシュ セット: 未定義」として出力されます。「i」が設定される前に、インポートメッシュが独自のスレッドでコールバック関数を実行するためだと思いますか? ただし、コールバック内でコンソール印刷を行うだけで「i」やモデルリストが設定されない方法について、頭を悩ませています。コンソール印刷を行うと:

models[1] 

同じコールバック内で、値を正しく見ることができますか? 意味がありません :(

スレッド化に関してインポートメッシュで何が起こっているか知っている人はいますか? スレッドを待っているbabylonjsのベストプラクティスはありますか? scene.executewhenready を使用してみましたが、コールバックの外部の変数に何かを保存および取得できないようです。

4

1 に答える 1

2

「i」が設定される前に、インポートメッシュが独自のスレッドでコールバック関数を実行するためだと思います

いいえ。JavaScript は (ほとんど...そしてこの場合は間違いなく)シングル スレッドであることに注意してください。

同じコールバック内のモデル [1] のコンソール印刷を行う場合

これは、変数が最後に割り当てられた値 ( )iを指すためです。models.length

注: JavaScript クロージャーは、ではなく変数をキャプチャします。したがって、ループの反復ごとに新しい変数を作成する必要があります。

固定コード

var models = ["brick_wall", "tree1", "person1"]

for (var i =0;i<models.length;++i) {

(function(index){
    var i = index;
    BABYLON.SceneLoader.ImportMesh(models[i], "models/","tree.babylon", scene, (newMeshes) => {


        this.meshMap[models[i]] = newMeshes[0]
        console.log("mesh set:" + models[i])
    });
})(i);

}

これは、この原則を示すビデオです: https://www.youtube.com/watch?v=hU4cbxpe49Y

于 2015-09-21T04:10:47.903 に答える