组件是用来给与游戏对象各种功能与表现的程序. 组件位于游戏对象之下, 游戏对象受控于组件:
许多组件含有某些属性是可以在运行时控制的, 根据组件属性的不同类型, 调用交换的函数也不一样:
-- 关闭 "body" 精灵
msg.post("can#body", "disable")
-- 1 秒以后在 "bean" 上播放 "hoohoo" 声音
sound.play("bean#hoohoo", { delay = 1, gain = 0.5 } )
组件要么直接依附于游戏对象, 要么作为一个文件被游戏对象引用:
右键点击 Outline 视图里的游戏对象, 选择 Add Component (直接依附) 或者 Add Component File (引用文件).
一般认为直接依附就够了, 但是以下组件类型必须保存为各种不同的文件以便被游戏对象引用:
Defold 提供以下组件类型:
其他组件可以通过载入扩展插件的方式导入项目:
游戏对象在创建时其组件是开启的. 如果需要关闭组件可以给组件发送 disable
消息:
-- 把此脚本所在的游戏对象上 id 为 'weapon' 的组件关闭
msg.post("#weapon", "disable")
-- 关闭 'enemy' 游戏对象上 id 为 'shield' 的所有组件
msg.post("enemy#shield", "disable")
-- 关闭当前游戏对象上的所有组件
msg.post(".", "disable")
-- 关闭 'enemy' 游戏对象上的所有组件
msg.post("enemy", "disable")
需要开启组件可以给组件发送 enable
消息:
-- 开启 id 为 'weapon' 的组件
msg.post("#weapon", "enable")
Defold 组件属性各不相同.在 Outline 面板 中当前选中的组件属性会显示在编辑器的 Properties 面板 中. 可用组件的详细属性详情请见API教程.
可视组件通常含有位置, 旋转以及缩放属性. 这些属性可以在编辑器里修改但是绝大多数情况下不能在运行时修改 (sprite 和 label 的缩放属性是例外情况).
如果需要在运行时修改组件的而不是组件所在游戏对象的位置, 旋转和缩放. 有个副作用就是游戏对象所有组件都会受影响. 如果你想维护游戏对象上的一个组件而不是多个, 建议将该组件移入另一个游戏对象并作为原来那个游戏对象的子对象.
可视组件的渲染顺序取决于两个方面:
每个组件都有 材质 而且每个材质都有一个或多个标签. 渲染脚本依次定义一系列优先级, 每个优先级匹配一个或多个材质标签. 渲染脚本在 update() 函数里 按优先级依次渲染 , 匹配优先级标签的组件会被显示出来. 默认渲染脚本先绘制 sprites 和 tilemaps, 再渲染粒子特效, 二者都使用世界坐标系. 最后渲染脚本会在屏幕坐标系中渲染 GUI 组件.
所有游戏对象都使用一个 vector3 作为其在 3D 空间中的位置. 如果是 2D 游戏, 则 X 和 Y 表示其在 “横向” 和 “纵向” 轴上的位置, 而 Z 值表示其在 “深度” 轴上的位置. 使用Z值可以操控游戏对象之间的层叠关系: Z 值是 1 的总是显示在 Z 值是 0 的对象上面. 默认情况下, Defold 使用 Z 值范围是 -1 到 1:
匹配某个优先级的组件在一起渲染, 它们之间的渲染顺序取决于组件的 z 值. 组件的最终z值是由组件的z值, 游戏对象和其父级游戏对象的z值之和.
各个 GUI 组件的渲染顺序 不是 由 GUI 组件的z值决定的. GUI 组件的渲染顺序由 gui.set_render_order() 函数控制.
例如: 两个游戏对象 A 和 B. B 是 A 的子集. B 有一个sprite组件.
元素 | z值 |
---|---|
A | 2 |
B | 1 |
B#sprite | 0.5 |
在上述定义中 B 的sprite组件最终z值是 2 + 1 + 0.5 = 3.5.
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB