前面讲Defold的元素构成时,讲到Defold主要包含Collection、Game Object、Component三种,并以层次结构进行组合。今天要讲的Collection Factory其实就是Component中的一种。Collection Factory用于动态创建Collection,最常见的场景是通过Collection Factory创建大量敌人,每个敌都是由身体与武器组成的一个Collection。
示例结构说明
假定有一个Enemy.collection,里面包含Game Object enemy 与 body、weapon、script三个Component,示例如下所示:
假定在另一个Main.collection,里面包含Game Object EnemyCreator 与 collection factory、script两个Component,示例如下所示:
代码示例
依据以上两个构成示例,希望在Main.collection中需要通过collection factory动态创建 Enemy,那么需要把collection factory的prototype属性设置为Enemy.collection。再在脚本中通过以下方法动态创建Enemy Collection。代码如下所示:
lua
function init(self)
self.go_ids = collectionfactory.create('#collectionfactory') -- 1
go.get_position(self.go_ids[hash("/enemy")], new_position) -- 2
end
从以上代码示例,说明如下:
collectionfactory.create入参
- 通地collectionfactory.create方法动态创建Collection。
lua
collectionfactory.create('#collectionfactory', position, rotation, properties, scale)
以上代码是完整的collectionfactory.create示例,参数说明
position 表示新创建的Collection应该在哪个位置,使用vector3的数据结构表示,如果没有设置,那么就使用collectionfactory在创建时在世界地图中的位置。
rotation 表示新创建的Collection应该被旋转的角度,使用vector4的数据结构表示。
properties 表示在新创建Collection时,可以传递给Collection内部组件的属性,创建时的示例如下:
lua
-- 创建Collection的示例
local props = {}
props[hash("/enymy")] = { status = 2 }
collectionfactory.create("#collectionfactory", nil, nil, props, nil)
被创建的Collection内部组件的属性接收示例,如下所示:
lua
go.property("status", 0)
function init(self)
print(self.status)
end
scale 表示新创建Collection的缩放比例,默认或传入nil时表示不进行缩放。
collectionfactory.create返回值
- collectionfactory.create方法的返回值是被创建Collection中的各个game object的对象的ID的table,结构如下所示:
json
{
hash('/game_object_id'): 'game object 在动行时的ID'
}
lua
local collection_factory_create_go_ids = collectionfactory.create("#collectionfactory")
local enemy = collection_factory_create_go_ids[hash("/enemy")]
local pos = go.get_position(enemy)
同步加载
默认情况下,在Collection Factory组件被加载时,他内部包含的组件都会被加载到内存,以便于最快速度的创建对象。如果设置Collection Factory组件的Load Dynamically属性为true,那么在执行collectionfactory.create方法时,会同步加载内部包含的组件,可能给游戏带来一次卡顿。当然collectionfactory也支持异步加载。
异步加载
使用collectionfactory.load方法可以异步加载Collection Factory中所包含的组件,如下所示:
lua
local function load_complete(self, url, result)
collectionfactory.create(url)
end
function init(self)
collectionfactory.load("#collectionfactory", load_complete)
end
从以上代码所示,这就可以异步加载Collection Factory中的组件,并不会导致卡顿。