跳转到内容

组件

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

内置组件

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

Transform

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

属性类型说明
positionVec3局部坐标 { x, y, z }
rotationQuat四元数 { w, x, y, z }
scaleVec3缩放因子 { x, y, z }
worldPositionVec3世界坐标(只读)
worldRotationQuat世界旋转(只读)
worldScaleVec3世界缩放(只读)

Sprite

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

Camera

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

属性类型说明
projectionTypeProjectionTypeOrthographic — 使用 ProjectionType.Perspective (0) 或 ProjectionType.Orthographic (1)
fovnumber视角角度(仅透视)
orthoSizenumber半高世界单位(仅正交)。默认:540
nearPlanenumber近裁剪面
farPlanenumber远裁剪面
isActiveboolean是否用于渲染
aspectRationumber相机宽高比
prioritynumber渲染顺序 — 低优先级先渲染,高优先级覆盖在上
viewportXnumber视口左边缘(0–1)。默认:0
viewportYnumber视口底边缘(0–1)。默认:0
viewportWnumber视口宽度(0–1)。默认:1
viewportHnumber视口高度(0–1)。默认:1
clearFlagsClearFlagsClearFlags.ColorAndDepth (3) — None (0)、ColorOnly (1)、DepthOnly (2)、ColorAndDepth (3)
showFrustumboolean在编辑器中显示相机视锥线框

Canvas

渲染表面的显示设置。

属性类型说明
designResolutionVec2设计分辨率 { x, y }
pixelsPerUnitnumber每世界单位像素数
scaleModeScaleModeScaleMode.FixedHeight (1) — FixedWidth (0)、FixedHeight (1)、Expand (2)、Shrink (3)、Match (4)
matchWidthOrHeightnumber宽高匹配平衡
backgroundColorColor清屏颜色 RGBA

Velocity

运动速度。

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

Parent / Children

场景图的实体层级关系。

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

SpineAnimation

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

BitmapText

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

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

Text

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

属性类型说明
contentstring文本内容
fontFamilystring字体名称
fontSizenumber字号(像素)
colorColor文本颜色 RGBA
alignTextAlign水平对齐方式
verticalAlignTextVerticalAlign垂直对齐方式
wordWrapboolean是否启用自动换行
overflowTextOverflow溢出行为:Visible (0)、Clip (1)、Ellipsis (2)
lineHeightnumber行高倍率

UIRect

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

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

UIMask

将子实体裁剪到父级 UIRect 边界内。需要在同一实体上同时挂载 UIRectTransform。详见遮罩与安全区

属性类型默认值说明
enabledbooleantrue是否启用裁剪
modenumber0遮罩模式:0=Scissor,1=Stencil

Interactable

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

属性类型默认值说明
enabledbooleantrue是否启用交互
blockRaycastbooleantrue阻止事件传递到后面的元素
raycastTargetbooleantrue是否参与射线检测

Button

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

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

Name

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

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

物理

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

RigidBody

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

属性类型默认值说明
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仅触发(无物理响应)
enabledbooleantrue启用碰撞体

CircleCollider

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

CapsuleCollider

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

组件启用开关

定义中包含 enabled 属性的组件会在 Inspector 的组件标题栏显示一个复选框。取消勾选会将 enabled 设为 false,对应的系统可以据此跳过处理。

这适用于内置组件(如 InteractableUIMaskRigidBody),也适用于任何包含 enabled 字段的自定义组件:

const MyComponent = defineComponent('MyComponent', {
enabled: true,
speed: 100,
});

禁用时,Inspector 中的组件标题栏会变暗显示。

自定义组件

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(Transform, Player)],
(query) => {
for (const [entity, transform] of query) {
// 只处理带有 Player 标签的实体
}
}
));

运行时创建实体

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

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

运行时移除组件

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

下一步