Defold引擎中关于CollectionFactory的使用

前面讲Defold的元素构成时,讲到Defold主要包含Collection、Game Object、Component三种,并以层次结构进行组合。今天要讲的Collection Factory其实就是Component中的一种。Collection Factory用于动态创建Collection,最常见的场景是通过Collection Factory创建大量敌人,每个敌都是由身体与武器组成的一个Collection。

示例结构说明

假定有一个Enemy.collection,里面包含Game Object enemy 与 body、weapon、script三个Component,示例如下所示:

erDiagram EnemyCollection ||--|{ enemy : contains enemy ||--|{ body : contains enemy ||--|{ weapon : contains enemy ||--|{ script : contains

假定在另一个Main.collection,里面包含Game Object EnemyCreator 与 collection factory、script两个Component,示例如下所示:

erDiagram MainCollection ||--|{ EnemyCreator : contains EnemyCreator ||--|{ CollectionFactory : contains EnemyCreator ||--|{ Script : contains

代码示例

依据以上两个构成示例,希望在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入参
  1. 通地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返回值
  1. 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中的组件,并不会导致卡顿。

相关推荐
北桥苏3 天前
如何在 Unity3D 中实现圆角效果?
unity3d·游戏开发
UWA4 天前
Gears实测室:第一期·音游跨设备性能表现与工具价值实践
信息可视化·性能优化·游戏开发·uwa
红红大虾4 天前
Defold核心概念之Message Passing
游戏开发
红红大虾5 天前
Defold核心概念之Building Blocks
游戏开发
Mr_14710 天前
【独游开发必备】游戏开发资源宝藏网站(美术篇)
游戏开发
Aoife婳11 天前
【Bug】UE5中纹理和地形一直闪烁
游戏开发
龚子亦12 天前
【Unity开发】丧尸围城项目实现总结
unity·游戏引擎·游戏开发
小哈里15 天前
【Game-Infra】游戏开发的流程,游戏发布的打包与构建(硬件选型,SDK与操作系统,包体管理,弹性构建,构建调优)
游戏·游戏开发·后端开发·基础设施·打包构建·游戏发布·弹性构建
小强Fnsy15 天前
一款将GIF、序列帧的指定选区转换成新的序列帧,并导出为Plist、PNG、GIF的工具
前端·游戏开发