@babylonjsmarket/ ecs (英语)
授权的实体-组成部分-系统框架 巴比伦JS市场 游戏——取自内部 CodeLibrary 并作为独立的运行时间发布,因此任何项目都可以依赖它.
只要这合适
@babylonjsmarket/ecs ← you are here
▲
│
┌───────────────────────┼───────────────────────┐
│ │ │
@babylonjsmarket/arcade create-arcade games your game
(curated components) (scaffolded projects)
@babylonjsmarket/ecs 是基础。 它拥有:
- 核心ECS系统 —— 说
Component, (中文(简体) ),Entity, (中文(简体) ),System, (中文(简体) ),World, (中文(简体) ),EventBus, (中文(简体) ),SceneLoader, (中文(简体) ),SaveLoad, (中文(简体) ),RaceDetector。 。 。 . - 出厂合同 —— 说
RendererAdapter是将游戏逻辑与任何特定3D引擎脱钩的界面. - 巴比伦和三.js适配器 —— 说
BabylonAdapter(哈沃克物理学,全场支持)和ThreeAdapter(带有可插接的JS物理集成器). 两者都生活在这个包里 所以它们一起进化, 但每个都位于一个子路径后面, 所以只有你实际使用的渲染器才能被拉入. - 测试基础设施 —— 说
MockRendererAdapter单位测试,arunMechanicContract证明机械师的电池遵守框架合同.
在实体/系统层,一切都是不可知的。 选择巴比伦,如果你想一等的哈沃克物理 和完整的巴比伦堆; 如果你想要一个更瘦的跑步时间 并且你自己也是舒适的接线物理.
安装
npm install @babylonjsmarket/ecs
核心条目有 零运行时间依赖关系。渲染器适配器是可选的对等依赖性——只安装您使用的:
# For BabylonJS
npm install @babylonjs/core @babylonjs/loaders @babylonjs/havok
# For Three.js
npm install three
入境点
| 导入 | 目录 | 端点 |
|---|---|---|
@babylonjsmarket/ecs | 核心 : Component, (中文(简体) ), Entity, (中文(简体) ), System, (中文(简体) ), World, (中文(简体) ), EventBus, (中文(简体) ), SceneLoader, (中文(简体) ), SaveLoad, (中文(简体) ), RaceDetector, (中文(简体) ), RendererAdapter 接口, MockRendererAdapter, (中文(简体) ), withRaceTracking | 无 |
@babylonjsmarket/ecs/babylon | BabylonAdapter | @babylonjs/core, (中文(简体) ), @babylonjs/loaders, (中文(简体) ), @babylonjs/havok |
@babylonjsmarket/ecs/three | ThreeAdapter (接受注射器) physicsFactory(中文(简体) ) | three |
@babylonjsmarket/ecs/renderer-types | 全数 RendererAdapter 类型表面-tuple Vec3,处理类型,光谱接口 | 无 |
@babylonjsmarket/ecs/testing | runMechanicContract 和相关vitest 助手 | vitest |
快开始
import { World, Component, System, type ISystemQuery } from '@babylonjsmarket/ecs';
import { BabylonAdapter } from '@babylonjsmarket/ecs/babylon';
class Position extends Component {
x = 0;
y = 0;
z = 0;
}
class MoveSystem extends System {
query: ISystemQuery = { required: [Position] };
onUpdate(dt: number) {
for (const entity of this.entities) {
const p = entity.get(Position)!;
p.x += dt;
}
}
}
const renderer = new BabylonAdapter();
await renderer.init(canvas);
const world = new World({ renderer });
world.addSystem(new MoveSystem(world.eventBus));
const player = world.createEntity('Player');
player.add(new Position());
renderer.startLoop((dt) => world.update(dt));
概念
组件是数据,系统是逻辑
部分扩展 Component 基础课和状态。 系统延伸 System时,宣布 query (所需组件、被排除在外的组件、所需标签),并实施 onUpdate(dt)编辑 World 匹配实体到系统,并运行每个框架.
事件,而非直接参考
系统通过 eventBus.emit(name, data) 并通过电子邮件订阅 this.listen(name, cb)这让系统脱钩 -- PlayerInput 可以开火 MOVE 在不知情或不关心的情况下 Movement, (中文(简体) ), Animation,或 CameraShake 我会听的.
从0.4.0起 System 提供基础类 listen(), (中文(简体) ), listenOnce(),以及 listenForEntity() ——自发订阅,其生平与本系统有联系. 订阅于 onInitialize() 并且当系统从世界中删除时,基础类不订阅一切;没有手动不订阅簿记. 原始内容 eventBus.on(name, cb) 仍然是非系统代码的原始.
渲染器适配器是细端口
这个 RendererAdapter 接口是每个系统用来与3D引擎交谈的内容。 适配器返回不透明手柄( E)MeshHandle, (中文(简体) ), LightHandle, (中文(简体) ), CameraHandle,.),只有创建它们的适配器才能解释. 就是这样 MoveSystem 在巴比伦,三,或 MockRendererAdapter 用于单位测试.
发展中的种族探测
如果你通过了 { detectRaces: true } 页:1 World 构造器,渲染器适配器被包裹在可记录每个手柄突变的代理器上. 当两个系统在同一帧中写到同一个手柄时,你会得到一个指向冲突的堆栈追踪. 停止生产.
另见
- @babylonjsmarket/ arcade (英语) ——由14个可再使用组件(元件、相机、灯光、输入、物理、分数、动画)组成的一组编组。 如果你想要电池就从这里开始.
- @babylonjsmarket/ create-arcade (中文(简体) ) ——CLI脚手架用于新的街机风格游戏. 设置一个上面两个软件包都使用的项目.
- 巴比伦JS市场 ——新增组件的招商场,全程课程,以及样板游戏.
页:1
- 仅限无害环境管理.
"type": "module"。 。 。 . - 由类型脚本所建; 船
.d.ts声明. - Debug viz 面板(Solid.js)不是从这个包中运出——它们生活在消耗性应用中或
@babylonjsmarket/arcade/viz。 。 。 .