跳到主要内容

属性

所有 PlayCanvas Web Component 都通过 HTML 属性配置,遵循同一组约定。掌握后即可预测各标签的行为。

通用约定​

属性遵循三条规则:

标记结果
设置合法值应用该值
属性不存在,或运行时移除应用引擎默认值
设置无效值控制台警告说明问题,并应用默认值

各标签表格的 Default 列表示属性缺省时的值。移除会恢复默认,因此可以在开发者工具或通过 setAttribute()、removeAttribute() 动态切换,场景会响应更新。

无效值不会传到引擎,控制台会指出属性和期望格式。编写时保持控制台打开,可及时发现拼写错误。

以下属性稍有不同:

  • <pc-node> 覆盖模型原始节点状态,缺省时恢复模型制作时的值,而非引擎默认。
  • 资源 ID、材质 ID和实体引用通常在移除时保留最后解析结果。例如移除 pc-render 的 material 不会更换当前材质。空引用有特殊含义时,例如 pc-joint 没有 entity-b,各标签页会明确说明。
  • 某些属性仅在启动时读取一次,例如 pc-app 图形选项和多数 pc-asset 属性。各标签页的读取时机说明会列出。
  • 脚本属性直接设置脚本,无效或移除时保留当前脚本值。

类型列​

各属性表的 Type 列表示书写形式,定义如下:

类型写法
Boolean(布尔)true、false 或仅出现属性,详见布尔值
Number(数字)任意有限数,详见数字
Enum(枚举)描述中列出的固定名称之一,详见枚举
Vector2、Vector3、Vector4两个、三个或四个空格分隔数字,详见向量
BoundingBox(包围盒)六个空格分隔数字,先为中心 X Y Z,再为各轴半尺寸。"0 2 0 5 2 5" 表示中心高度 2、尺寸 10 x 4 x 10 的盒体
Planes(平面)多平面用逗号分隔,每个为四个空格分隔数字:先法线 X Y Z,再为原点位于平面前方的距离。"0 -1 0 3" 表示高度 3、朝下的平面;"0 -1 0 3, 1 0 0 0" 再加入经过原点、朝 X 的平面
Color(颜色)CSS 色名、十六进制或三/四个数字,详见颜色
String(字符串)自由文本,例如名称、路径、JSON 对象
Asset ID、Material ID<pc-asset> 或 <pc-material> 的 id,详见资源与材质 ID
Entity Reference(实体引用)实体 name 或 # 选择器,详见实体引用

布尔值​

属性存在且值不为 "false" 时为 true,包括不写值的空属性;值为 "false" 时为 false:

标记结果
cast-shadows(仅出现)true
cast-shadows="true"(或任意非 false 值)true
cast-shadows="false"false
不存在或被移除引擎默认值
<!-- Bare presence enables a default-false option -->
<pc-light type="directional" cast-shadows></pc-light>

<!-- Setting "false" disables a default-true option -->
<pc-scroll-view horizontal="false"></pc-scroll-view>

数字​

接受整数、小数、负数和科学记数法,例如 1e3,但必须有限。带单位如 fov="60deg"、空值如 intensity=""、Infinity 等会警告并采用默认值。

<pc-camera fov="60" near-clip="0.1"></pc-camera>

枚举​

只接受固定名称,无效名称会警告并列出合法值,再恢复默认:

Invalid value 'bogus' for attribute 'scroll-mode'. Valid values: clamp, bounce, infinite. Using 'bounce'.

不接受引擎数字常量,声明层只使用名称。JavaScript API 同样如此,例如 scrollbar.orientation 接收并返回字符串名称,不使用引擎数值常量。

<pc-camera tonemap="aces"></pc-camera>

向量​

由空白分隔数字,数量必须与维度一致,即 Vector2 为两个、Vector3 为三个、Vector4 为四个。允许任意数量空白,不支持逗号,使用逗号会警告。

<pc-entity position="0 1.5 0" scale="2 2 2"></pc-entity>

颜色​

接受三种形式:

格式示例
CSS 颜色名称clear-color="rebeccapurple"
十六进制 #rgb、#rgba、#rrggbb 或 #rrggbbaacolor="#f00" 或 color="#ff0000"
三或四个 0 到 1 的空格分隔数字color="1 0.5 0.5" 或 color="1 0.5 0.5 0.5"
<pc-camera clear-color="#f0f8ff"></pc-camera>
<pc-light color="1 0.8 0.6"></pc-light>

资源与材质 ID​

资源作为 <pc-app> 的直接子项声明一次,通过 id 引用。Asset ID 指向 <pc-asset>,Material ID 指向 <pc-material>:

<pc-asset id="tiles" src="tiles.png"></pc-asset>
<pc-material id="floor" diffuse-map="tiles"></pc-material>
<!-- ... -->
<pc-render type="plane" material="floor"></pc-render>

值直接填写 id,不加 #,因为这是应用注册表查询而非 CSS 选择器。各属性描述会说明接受的资源类型。

未匹配的 id 通常静默保留原值。pc-model 例外,因为内容来自资源:会清空内容、警告找不到资源,并始终未就绪。pc-app 的 area-light-luts、精灵 pc-asset 的 atlas、pc-node 的 material-overrides,以及脚本 asset: 无匹配时也会警告。

实体引用​

某些属性引用其他实体,例如 <pc-button> 的 image、<pc-scrollbar> 的 handle、<pc-scroll-view> 的 viewport 和 content,以及 <pc-joint> 的 entity-a、entity-b。仅支持两种形式:

形式含义范围
handle<pc-entity>、<pc-model> 或 <pc-node> 的 name最近实体宿主优先,再向外,最后整个文档
#handle, #hud pc-entity以 # 开头的 CSS 选择器,即 id 或基于 id 的选择器整个文档
<pc-scrollbar orientation="vertical" handle="#handle"></pc-scrollbar>

规则明确封闭:裸值始终为名称,不是 id 或选择器;不以 # 开头的选择器不接受。因此形式一目了然,其他位置新增或改名不会改变解析类别。

名称从近到远解析​

先查最近实体宿主,即 pc-entity、pc-model 或 pc-node,包括自身及子树,再依次向外查实体、所属 pc-app,最后整个文档。各范围内按文档顺序取首个匹配。pc-node 使用其绑定的 glTF 节点名称。

因此克隆模板内的名称会先找到自身实例,避免命中更早的克隆,详见模板复用。

# 引用作用于整个文档​

以 # 开头的值直接作为 CSS 选择器查询文档,不再尝试名称。例如名为 #body 的实体不会遮蔽 id 为 body 的元素。需要与引用者位置无关的固定目标时,使用 #。

未解析引用会警告​

非空引用无法解析时,控制台会指出属性和原因:没有匹配、匹配尚未生成实体,或类型根本不支持实体。尚未加载模型的 pc-node 通常在重新设置属性后可解析。如果裸值匹配某实体宿主的 id,警告还会建议 #id 形式,必要时会转义,例如 id a:b 对应 #a:b。

脚本属性同样遵循此规则:entity:body 指向名称 body,entity:#body 指向 id body。

脚本属性​

<pc-script-instance> 根据脚本声明的默认类型解析逐属性值,语法基本相同,但没有引擎默认值,因此:

  • 无效值会警告并保留脚本当前值。
  • 移除也保留当前值,除非 attributes JSON 设置了同名属性,此时恢复 JSON 值。

未声明带类型默认值的名称会作为原始字符串赋值,并发出警告。详见通过脚本添加行为。