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

相关推荐
陈尕六4 天前
从零开始的 Godot 之旅 — EP5:控制角色移动
godot·游戏开发
陈尕六8 天前
从零开始的 Godot 之旅 — EP4:工作区基础操作与检查器初识
godot·游戏开发
倔强的石头_8 天前
一段奇遇的开始:当一名游戏开发者决定“氪金”升级装备
游戏开发
UWA8 天前
游戏在高负载场景下,整机功耗控制在多少
游戏·unity·性能优化·游戏开发
gopyer9 天前
180课时吃透Go语言游戏后端开发5:Go语言中的条件语句
golang·go·游戏开发·条件语句
~央千澈~12 天前
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
游戏开发