私が従っている場合、2つのコンポーネントの間でバビロンシーンオブジェクトの状態を保持して再利用したいとしますか?私はちょうどそれに参照が必要な各クラスに注入されるシーンサービスコンポーネントを作成して、私のプロジェクトのためにこれに似た何かをしました。
サービスコンポーネントでシーンを実際に初期化しないようにしました(コンポーネントのライフサイクルとシーンがコードで初期化される点を考慮してください)。代わりに、キャンバスが初期化されたときにシーンサービスシーンを設定します。
これが完了すると、コンポーネントが共有し、彼らが必要としてバビロンシーンサービス・コンポーネントを使用することができます。
import { Injectable } from '@angular/core';
@Injectable()
export class SceneService {
private _scene:BABYLON.Scene;
get scene(): BABYLON.Scene {
return this._scene;
}
set scene(scene:BABYLON.Scene){
this._scene = scene;
}
}
babylon.component.tsを
scene.service.ts
@Component({
selector: 'app-babylon',
templateUrl: './babylon.component.html',
styleUrls: ['./babylon.component.css']
})
export class BabylonComponent implements OnInit, OnDestroy {
constructor(private babylonEngine:BabylonEngine, private sceneSerice:SceneService, private fileSystem:FileSystem) { }
scene:BABYLON.Scene = null;
ngOnInit(): void {
var canvas = document.getElementById('renderCanvas') as HTMLCanvasElement;
var engine = this.babylonEngine.init(canvas);
// create a basic BJS Scene object
this.scene = new BABYLON.Scene(engine);
this.sceneSerice.scene = this.scene;
}
}
初期化されたシーンの一部のユーザ:
@Component({
selector: 'app-scene-editor',
templateUrl: './scene-editor.component.html',
styleUrls: ['./scene-editor.component.css']
})
export class SceneEditorComponent implements OnInit {
@ViewChild('jscolor') input;
constructor(private sceneService:SceneService, public fileSystem:FileSystem) {
}
ngOnInit():void {
this.meshes = this.sceneService.scene.meshes;
this.materials = this.sceneService.scene.materials;
}
}
app.module.ts
providers: [
SceneService,
FileSystem,
BabylonEngine
],