This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
コレクションファクトリー(collection factory)コンポーネント(component)は、コレクション(collection)ファイルに保存されたゲームオブジェクト(game object)のグループや階層を、実行中のゲーム内に生成するために使います。
コレクションは、Defold で再利用可能なテンプレート、つまり「プレハブ(prefab)」を作成するための強力な仕組みです。コレクションの概要については、基本要素のドキュメントを参照してください。コレクションはエディターで配置することも、ゲーム内に動的に挿入することもできます。
コレクションファクトリーコンポーネントを使うと、コレクションファイルの内容をゲームワールド(game world)内に生成できます。これは、コレクション内のすべてのゲームオブジェクトをファクトリー(factory)で生成し、その後でオブジェクト間の親子階層を構築することに相当します。典型的な用途は、複数のゲームオブジェクトで構成された敵(たとえば、敵と武器)を生成することです。
キャラクターのゲームオブジェクトと、その子となる別の盾のゲームオブジェクトが必要だとします。コレクションファイルでゲームオブジェクトの階層を構築し、bean.collection として保存します。
コレクションプロキシ(collection proxy) コンポーネントは、コレクションに基づいて、独立した物理ワールドを含む新しいゲームワールドを作成するために使います。新しいワールドには、新しいソケットを通じてアクセスします。プロキシに読み込み開始のメッセージを送信すると、コレクションに含まれるすべてのアセットがプロキシを通じて読み込まれます。このため、たとえばゲームのレベルを切り替える際に非常に便利です。ただし、新しいゲームワールドにはかなりのオーバーヘッドがあるため、小さなものを動的に読み込むためには使わないでください。詳しくは、コレクションプロキシのドキュメントを参照してください。

次に、生成を担当するゲームオブジェクトに Collection factory を追加し、コンポーネントの Prototype に bean.collection を設定します。

これで、collectionfactory.create() 関数を呼び出すだけで bean と盾を生成できます。
local bean_ids = collectionfactory.create("#bean_factory")
この関数は5つのパラメーターを受け取ります。
url[position]vector3 を指定します。位置を指定しない場合、オブジェクトはコレクションファクトリーコンポーネントの位置に生成されます。[rotation]quat を指定します。[properties]id-table のペアを持つ Lua テーブルです。このテーブルの構築方法は後述します。[scale]number(0より大きい値)で表せます。各成分が対応する軸に沿った拡大縮小を指定する vector3 を渡すこともできます。collectionfactory.create() は、生成されたゲームオブジェクトの識別子をテーブルとして返します。このテーブルは、各オブジェクトのコレクション内での識別子のハッシュ値をキーとして、各オブジェクトの実行時の識別子に対応付けます。
bean と shield の親子関係は、返されるテーブルに 反映されません。この関係は、実行時のシーングラフ、つまりオブジェクトがどのように一緒に変換されるかという関係にのみ存在します。オブジェクトの親を変更しても、その識別子が変わることはありません。
local bean_ids = collectionfactory.create("#bean_factory")
go.set_scale_xy(0.5, bean_ids[hash("/bean")])
pprint(bean_ids)
-- DEBUG:SCRIPT:
-- {
-- hash: [/shield] = hash: [/collection0/shield], -- <1>
-- hash: [/bean] = hash: [/collection0/bean],
-- }
/collection[N]/ という接頭辞が追加されます。ここで [N] はカウンターです。コレクションを生成するとき、キーがオブジェクトの識別子、値が設定するスクリプトプロパティを持つテーブルになるようにテーブルを構築すると、各ゲームオブジェクトにプロパティのパラメーターを渡せます。
local props = {}
props[hash("/bean")] = { shield = false }
local ids = collectionfactory.create("#bean_factory", nil, nil, props)
bean.collection 内のゲームオブジェクト bean が shield プロパティを定義しているとします。スクリプトプロパティについては、スクリプトプロパティマニュアルで説明しています。
-- bean/controller.script
go.property("shield", true)
function init(self)
if not self.shield then
go.delete("shield")
end
end
コレクションファクトリーのプロパティで Load Dynamically チェックボックスをオンにすると、エンジンはファクトリーに関連するリソースの読み込みを遅らせます。

チェックボックスがオフの場合、エンジンはコレクションファクトリーコンポーネントが読み込まれるときにプロトタイプ(prototype)のリソースを読み込むため、すぐに生成できる状態になります。
チェックボックスがオンの場合は、次の2つの使い方があります。
collectionfactory.create() を呼び出します。これによりリソースが同期的に読み込まれ、その後で新しいインスタンスが生成されます。同期読み込みによって一時的に処理が止まることがあります。
function init(self)
-- No factory resources are loaded when the collection factory’s
-- parent collection is loaded. Calling create without
-- having called load will create the resources synchronously.
self.go_ids = collectionfactory.create("#collectionfactory")
end
function final(self)
-- Delete game objects. Will decref resources.
-- In this case resources are deleted since the collection
-- factory component holds no reference.
go.delete(self.go_ids)
-- Calling unload will do nothing since factory holds
-- no references
collectionfactory.unload("#factory")
end
collectionfactory.load() を呼び出して、リソースを明示的に非同期で読み込みます。リソースを生成に使える状態になると、コールバックが呼び出されます。
function load_complete(self, url, result)
-- Loading is complete, resources are ready to spawn
self.go_ids = collectionfactory.create(url)
end
function init(self)
-- No factory resources are loaded when the collection factory’s
-- parent collection is loaded. Calling load will load the resources.
collectionfactory.load("#factory", load_complete)
end
function final(self)
-- Delete game object. Will decref resources.
-- In this case resources aren’t deleted since the collection factory
-- component still holds a reference.
go.delete(self.go_ids)
-- Calling unload will decref resources held by the factory component,
-- resulting in resources being destroyed.
collectionfactory.unload("#factory")
end
コレクションファクトリーのプロパティで Dynamic Prototype チェックボックスをオンにすると、コレクションファクトリーが生成する Prototype を変更できます。

Dynamic Prototype オプションがオンの場合、コレクションファクトリーコンポーネントは collectionfactory.set_prototype() 関数を使ってプロトタイプを変更できます。例:
collectionfactory.unload("#factory") -- unload the previous resources
collectionfactory.set_prototype("#factory", "/main/levels/level1.collectionc")
local ids = collectionfactory.create("#factory")
Dynamic Prototype オプションが設定されている場合、コレクションのコンポーネント数を最適化できず、このコンポーネントを所有するコレクションは game.project ファイルの既定のコンポーネント数を使います。