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中的组件,并不会导致卡顿。

相关推荐
陈尕六5 天前
从零开始的 Godot 之旅 — EP8:角色移动和动画切换
godot·游戏开发
Setsuna_F_Seiei6 天前
CocosCreator 游戏开发 - 利用 AssetsBundle 技术对小游戏包体积进行优化
前端·cocos creator·游戏开发
gopyer6 天前
Go语言2D游戏开发入门004:零基础打造射击游戏《太空大战》3
golang·go·游戏开发
芝麻粒儿7 天前
天龙八部TLBB系列 - 客户端技术整体性分析
游戏开发·天龙八部·网单·引擎脚本
UWA10 天前
有什么指标可以判断手机是否降频
人工智能·智能手机·性能优化·memory·游戏开发
鼓掌MVP14 天前
【案例实战】多维度视角:鸿蒙2048游戏开发的深度分析与感悟
华为·ai编程·harmonyos·arkts·游戏开发·ability
腾讯云云开发14 天前
云开发Copilot实战:AI生成2048小游戏开发指南
ai编程·游戏开发·小程序·云开发
腾讯云云开发14 天前
云开发CloudBase实战:从0到1打造2D枪战游戏指南
ai编程·游戏开发·小程序·云开发