跳转到内容

组件

组件是附加在实体上的数据。在 ESEngine 中,你在代码中定义组件,然后在场景编辑器中挂载到实体上。

内置组件

内置组件在编辑器中始终可用,由 C++ 后端支持。

LocalTransform

实体的位置、旋转和缩放。

属性类型说明
positionVec3世界坐标 { x, y, z }
rotationQuat四元数 { w, x, y, z }
scaleVec3缩放因子 { x, y, z }

Sprite

2D 精灵渲染。需要 LocalTransform 才能显示。详见精灵指南

Camera

视图设置。至少需要一个激活的相机才能看到内容。编辑器的默认场景已包含一个。

属性类型说明
projectionTypenumber0 = 透视,1 = 正交
fovnumber视角角度(仅透视)
orthoSizenumber半高世界单位(仅正交)
nearPlanenumber近裁剪面
farPlanenumber远裁剪面
isActiveboolean是否用于渲染
aspectRationumber相机宽高比
prioritynumber渲染顺序 — 低优先级先渲染,高优先级覆盖在上
viewportXnumber视口左边缘(0–1)。默认:0
viewportYnumber视口底边缘(0–1)。默认:0
viewportWnumber视口宽度(0–1)。默认:1
viewportHnumber视口高度(0–1)。默认:1
clearFlagsnumber缓冲区清除模式:0=无, 1=颜色, 2=深度, 3=两者
showFrustumboolean在编辑器中显示相机视锥线框

Canvas

渲染表面的显示设置。

属性类型说明
designResolutionVec2设计分辨率 { x, y }
pixelsPerUnitnumber每世界单位像素数
scaleModenumber画布缩放模式
matchWidthOrHeightnumber宽高匹配平衡
backgroundColorColor清屏颜色 RGBA

Velocity

运动速度。

属性类型说明
linearVec3线速度
angularVec3角速度

Parent / Children

场景图的实体层级关系。

组件属性类型说明
ParententityEntity父实体 ID
ChildrenentitiesEntity[]子实体 ID 列表

SpineAnimation

Spine 骨骼动画播放。需要 LocalTransform。详见 Spine 动画指南

BitmapText

使用预烘焙位图字体图集(BMFont 格式)进行 GPU 渲染的文本。需要 LocalTransform。详见位图文本指南

属性类型说明
textstring文本内容
colorColor着色 RGBA
fontSizenumber相对于字体原始大小的缩放因子
alignnumber水平对齐:0=左对齐,1=居中,2=右对齐
spacingnumber字符间额外间距
layernumber渲染层级
fontnumberassets.loadBitmapFont() 返回的字体句柄

Text

UI 文本渲染。配合 UIRectSprite 组件显示文本。详见 UI 与文本指南

属性类型说明
contentstring文本内容
fontFamilystring字体名称
fontSizenumber字号(像素)
colorColor文本颜色 RGBA
alignTextAlign水平对齐方式
verticalAlignTextVerticalAlign垂直对齐方式

UIRect

UI 布局矩形。定义 UI 元素的锚点布局。

属性类型说明
anchorMinVec2左下锚点(0–1)
anchorMaxVec2右上锚点(0–1)
offsetMinVec2相对 anchorMin 的像素偏移
offsetMaxVec2相对 anchorMax 的像素偏移
sizeVec2宽高
pivotVec2旋转中心点

UIMask

将子实体裁剪到父级 UIRect 边界内。需要在同一实体上同时挂载 UIRectLocalTransform。详见 UI 与文本指南

属性类型默认值说明
enabledbooleantrue是否启用裁剪

Interactable

将 UI 元素标记为可交互(接收指针事件)。需要 UIRect

属性类型默认值说明
enabledbooleantrue是否启用交互

Button

UI 元素的按钮行为。需要 InteractableUIRect

属性类型默认值说明
statenumber0(Normal)0=正常, 1=悬停, 2=按下, 3=禁用
transitionButtonTransition | nullnull各状态的颜色过渡

ScreenSpace

标签组件,将实体标记为屏幕空间 UI 根节点。ScreenSpace 实体的子级通过 UIRect 在屏幕坐标中布局。需要 UIRectLocalTransform

Name

实体的字符串标识符,用于在运行时按名称查找实体。

属性类型默认值说明
valuestring''实体名称

物理

物理组件需要 PhysicsPlugin。详见物理指南

RigidBody

附加到实体的物理刚体。需要 LocalTransform

属性类型默认值说明
bodyTypenumber2(Dynamic)0=静态,1=运动学,2=动态
gravityScalenumber1.0重力倍率
linearDampingnumber0.0线速度阻尼
angularDampingnumber0.0角速度阻尼
fixedRotationbooleanfalse锁定旋转
bulletbooleanfalse高速物体连续碰撞检测
enabledbooleantrue启用物理刚体

BoxCollider

属性类型默认值说明
halfExtentsVec2{x: 0.5, y: 0.5}半尺寸(米)
offsetVec2{x: 0, y: 0}局部偏移
densitynumber1.0质量密度
frictionnumber0.3表面摩擦力
restitutionnumber0.0弹性(弹力)
isSensorbooleanfalse仅触发(无物理响应)

CircleCollider

属性类型默认值说明
radiusnumber0.5圆形半径(米)
offsetVec2{x: 0, y: 0}局部偏移
densitynumber1.0质量密度
frictionnumber0.3表面摩擦力
restitutionnumber0.0弹性(弹力)
isSensorbooleanfalse仅触发(无物理响应)

CapsuleCollider

属性类型默认值说明
radiusnumber0.25胶囊半径
halfHeightnumber0.5胶囊体半高
offsetVec2{x: 0, y: 0}局部偏移
densitynumber1.0质量密度
frictionnumber0.3表面摩擦力
restitutionnumber0.0弹性(弹力)
isSensorbooleanfalse仅触发(无物理响应)

自定义组件

defineComponent

在代码中定义数据组件。保存后会出现在编辑器的”添加组件”菜单中。

import { defineComponent } from 'esengine';
export const Health = defineComponent('Health', {
current: 100,
max: 100
});

在编辑器中:选择实体 → 添加组件 → Health → 在检查器中设置值。

系统查询拥有该组件的实体:

import { defineSystem, addSystem, Query } from 'esengine';
import { Health } from './components/Health';
addSystem(defineSystem(
[Query(Health)],
(query) => {
for (const [entity, health] of query) {
if (health.current <= 0) {
// 处理死亡
}
}
}
));

defineTag

标签组件没有数据 — 纯粹用于筛选实体。

import { defineTag } from 'esengine';
export const Player = defineTag('Player');
export const Enemy = defineTag('Enemy');

在编辑器中将 Player 挂载到实体上,然后查询它:

addSystem(defineSystem(
[Query(LocalTransform, Player)],
(query) => {
for (const [entity, transform] of query) {
// 只处理带有 Player 标签的实体
}
}
));

运行时创建实体

需要在运行时创建实体时(如子弹、粒子、特效),使用 Commands

import { addStartupSystem, defineSystem, Commands, Sprite, LocalTransform } from 'esengine';
addStartupSystem(defineSystem(
[Commands()],
(cmds) => {
const entity = cmds.spawn()
.insert(Sprite, { size: { x: 10, y: 10 } })
.insert(LocalTransform, { position: { x: 0, y: 0, z: 0 } })
.id();
}
));

运行时移除组件

cmds.entity(entity).remove(Velocity);

下一步

  • 系统 — 操作组件的逻辑
  • 查询 — 按组件查找实体