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

相关推荐
柚要做甚码12 小时前
godot-rust(gdext)2D游戏之旅【flappy-bird】 - 2
游戏·游戏开发
柚要做甚码13 小时前
godot-rust(gdext)2D游戏之旅【flappy-bird】 - 1
游戏·游戏开发
柚要做甚码13 小时前
godot-rust(gdext)2D游戏之旅【flappy-bird】 - 3
游戏·游戏开发
LcGero14 小时前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb
LcGero2 天前
TypeScript 快速上手:前言
typescript·cocos creator·游戏开发
Setsuna_F_Seiei2 天前
CocosCreator 游戏开发 - 多维度状态机架构设计与实现
前端·cocos creator·游戏开发
做cv的小昊3 天前
结合代码读3DGS论文(12)——NeurIPS 2024 Spotlight 3DGS经典Backbone工作3DGS-MCMC论文及代码解读
论文阅读·计算机视觉·3d·图形渲染·游戏开发·计算机图形学·3dgs
SmalBox4 天前
【节点】[Reciprocal节点]原理解析与实际应用
unity3d·游戏开发·图形学
SmalBox4 天前
【节点】[Posterize节点]原理解析与实际应用
unity3d·游戏开发·图形学
SCLchuck6 天前
Godot 4 2D 物理引擎位置初始化踩坑:add_child() 和 position 到底谁先? (错误位置触发物理事件)
游戏引擎·godot·游戏开发·物理引擎