Collection factory - kuimoani/defold GitHub Wiki

Collection factories

μ»¬λ ‰μ…˜ νŒ©ν† λ¦¬ μ»΄ν¬λ„ŒνŠΈλŠ” κ²Œμž„ 였브젝트(μ»¬λ ‰μ…˜)의 섀계도면 계측ꡬ쑰(blueprint hierarchies)λ₯Ό λ§Œλ“€μ–΄ 싀행쀑인 κ²Œμž„μœΌλ‘œ μŠ€ν°ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. 이 맀뉴얼은 μ»¬λ ‰μ…˜ νŒ©ν† λ¦¬κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λ©° μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λ©΄ λ˜λŠ”μ§€ μ„€λͺ…ν•©λ‹ˆλ‹€.

μ»¬λ ‰μ…˜μ€ μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν…œν”Œλ¦Ώ(ν”„λ¦¬νŽ©(prefab) 같은)을 μƒμ„±ν•˜κΈ° μœ„ν•œ κ°•λ ₯ν•œ λ©”μ»€λ‹ˆμ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ»¬λ ‰μ…˜μ— λŒ€ν•œ κ°œμš”λ₯Ό 보고 μ‹Άλ‹€λ©΄ Building blocks λ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€. μ»¬λ ‰μ…˜μ€ μ—λ””ν„°μƒμ—μ„œ λ°°μΉ˜ν•΄λ„ 되고 컴파일 νƒ€μž„μ— κ²Œμž„μœΌλ‘œ λ³΅μ œν•  μˆ˜λ„ μžˆλŠ”λ°, λ™μ μœΌλ‘œ κ²Œμž„μ— μΆ”κ°€ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” μ•„λž˜ 두 κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  1. μ»¬λ ‰μ…˜ ν”„λ‘μ‹œ(Collection proxy)λ₯Ό 톡해 λ‘œλ“œν•˜λŠ” 방법. 이 방법은 근본적으둜 고립된 μƒˆ μ›”λ“œ(new isolated world)(물리 λ°˜μ‘ 방식을 포함함)λ₯Ό 싀행쀑인 κ²Œμž„μ— λΆˆλŸ¬μ˜΅λ‹ˆλ‹€. λ‘œλ“œλœ μ»¬λ ‰μ…˜μ€ μƒˆ μ†ŒμΌ“ 으둜 μ—‘μ„ΈμŠ€ν•  수 있으며, μ»¬λ ‰μ…˜μ— ν¬ν•¨λœ λͺ¨λ“  에셋은 ν”„λ‘μ‹œκ°€ λ‘œλ”©μ„ μ‹œμž‘ν•œλ‹€λŠ” λ©”μ„Έμ§€λ₯Ό λ°›μœΌλ©΄ ν”„λ‘μ‹œλ₯Ό 톡해 λ‘œλ“œλ©λ‹ˆλ‹€. 이 방식은 레벨 μŠ€ν…Œμ΄μ§€λ₯Ό λ³€κ²½ν•˜λ €λŠ” κ²½μš°μ— μ•„μ£Ό μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€. 더 λ§Žμ€ 정보λ₯Ό μ•Œκ³  μ‹Άλ‹€λ©΄ Collection proxy λ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€.

  2. μ»¬λ ‰μ…˜ νŒ©ν† λ¦¬(Collection factory) μ»΄ν¬λ„ŒνŠΈλŠ” ν˜„μž¬μ˜ 메인 μ»¬λ ‰μ…˜μ— μ»¬λ ‰μ…˜ ν”„λ‘μ‹œμ˜ 컨텐츠λ₯Ό 슀폰 ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. 이 방식은 마치 μ–΄λ–€ μ»¬λ ‰μ…˜ μ•ˆμ— μžˆλŠ” λͺ¨λ“  μ˜€λΈŒμ νŠΈλ“€μ—κ²Œ 일일히 νŒ©ν† λ¦¬(factory) μ»΄ν¬λ„ŒνŠΈλ₯Ό λ„£μ–΄μ„œ μ˜€λΈŒμ νŠΈκ°„ λΆ€-λͺ¨ 계측을 λ§Œλ“œλŠ” 방식과 μœ μ‚¬ν•©λ‹ˆλ‹€. 일반적인 μ‚¬μš©μ²˜λ‘œλŠ” κ²Œμž„ μ˜€λΈŒμ νŠΈκ°€ μ—¬λŸ¬ 개의 κ²Œμž„ 였브젝트둜 κ΅¬μ„±λœ 적(enemy: λͺΈμ²΄+무기) 같은 개체λ₯Ό μŠ€ν°ν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€.

Spawning a collection

μ»¬λ ‰μ…˜μ„ 슀폰 ν•˜λŠ” 것은 κ²Œμž„ 였브젝트λ₯Ό μŠ€ν°ν•˜λŠ” 방식과 λ˜‘κ°™μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. κ°„λ‹¨ν•œ 예λ₯Ό λ“€μžλ©΄, μš°λ¦¬κ°€ ν–‰μ„± μŠ€ν”„λΌμ΄νŠΈλ₯Ό λ§Œλ“€κ³  이 ν–‰μ„± ν‘œλ©΄μ— 볡합적인 κ²Œμž„ 였브젝트둜 κ΅¬μ„±λœ 우주인 λͺ¨ν˜• μ—¬λŸ¬ 개λ₯Ό μŠ€ν°ν•΄μ•Ό ν•œλ‹€κ³  μΉ©μ‹œλ‹€. μš°λ¦¬λŠ” κ·Έλƒ₯ μ»¬λ ‰μ…˜ ν”„λ‘μ‹œ(Collection factory)λ₯Ό "planet" κ²Œμž„μ˜€λΈŒμ νŠΈμ— μΆ”κ°€ν•˜κ³  Prototype 속성을 "astronaut.collection" (일단 μ‘΄μž¬ν•œλ‹€κ³  치고)으둜 μ„€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

Collection factory

μ΄λ²ˆμ—” νŒ©ν† λ¦¬μ—κ²Œ μš°μ£ΌμΈμ„ μŠ€ν°ν•˜λΌλŠ” λ©”μ„Έμ§€λ₯Ό 보내면 λ©λ‹ˆλ‹€.

local astro = collectionfactory.create("#factory", nil, nil, {}, nil)

슀폰된 μš°μ£ΌμΈμ€ κ²Œμž„ μ˜€λΈŒμ νŠΈλ“€μ˜ 트리ꡬ쑰둜 λ˜μ–΄ 있으며, 슀폰 이후에 이 μ˜€λΈŒμ νŠΈλ“€μ„ 닀루기 μœ„ν•œ μ£Όμ†Œλ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

Collection to spawn

λ³΄ν†΅μ˜ νŒ©ν† λ¦¬ μ»΄ν¬λ„ŒνŠΈλΌλ©΄ 슀폰된 였브젝트의 아이디(id)λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ, μ»¬λ ‰μ…˜ νŒ©ν† λ¦¬λŠ” 각 μ˜€λΈŒμ νŠΈλ“€μ˜ λŸ°νƒ€μž„ 아이디λ₯Ό μ»¬λ ‰μ…˜λͺ…-둜컬λͺ…(collection-local id)의 ν•΄μ‰¬κ°’μœΌλ‘œ λ§Œλ“€κ³  이듀을 ν…Œμ΄λΈ”μ— λ§€ν•‘ν•΄ λ°˜ν™˜ν•©λ‹ˆλ‹€. 접두사 "/collectionNN/" κ°€ 각 아이디에 μΆ”κ°€λ˜μ–΄ 각 μΈμŠ€ν„΄μŠ€λ₯Ό μœ λ‹ˆν¬ν•˜κ²Œ 식별해 μ€λ‹ˆλ‹€.

pprint(astro)
-- DEBUG:SCRIPT:
-- {
--   hash: [/probe2] = hash: [/collection0/probe2],
--   hash: [/probe1] = hash: [/collection0/probe1],
--   hash: [/astronaut] = hash: [/collection0/astronaut],
-- }

"astronaut"κ³Ό "probe" μ‚¬μ΄μ˜ λΆ€-λͺ¨ κ΄€κ³„λŠ” 였브젝트의 id/path 에 영ν–₯을 μ£Όμ§€ μ•Šμ§€λ§Œ λŸ°νƒ€μž„μ‹œμ— 씬-κ·Έλž˜ν”„(scene-graph)μ—μ„œλŠ” 영ν–₯을 μ€λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λΆ€-λͺ¨ κ΄€κ³„μ˜ μ˜€λΈŒμ νŠΈλ“€μ„ ν•¨κ»˜ 트랜슀폼(이동,νšŒμ „,μŠ€μΌ€μΌ)ν•˜κ±°λ‚˜ 였브젝트의 λΆ€-λͺ¨λ₯Ό μž¬μ„€μ •ν•˜λŠ” κ²ƒμœΌλ‘œλŠ” μ ˆλŒ€ idκ°€ λ°”λ€Œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Properties

μ»¬λ ‰μ…˜μ„ 슀폰 ν•  λ•Œ, μ»¬λ ‰μ…˜-둜컬(collection-local) 였브젝트 아이디가 쌍(pair)으둜 κ΅¬μ„±λœ ν…Œμ΄λΈ”μ„ μ‚¬μš©ν•˜μ—¬ 각각의 λΆ€λΆ„ κ²Œμž„ μ˜€λΈŒμ νŠΈμ—κ²Œ μ λ‹Ήν•œ νŒŒλΌλ―Έν„°λ₯Ό 보낼 수 있으며, μ΄λŠ” 각 슀크립트 속성을 μ…‹νŒ…ν•©λ‹ˆλ‹€.

-- planet.script
--
local props = {}
props[hash("/astronaut")] = { size = 10.0 }
props[hash("/probe1")] = { color = hash("red") }
props[hash("/probe2")] = { color = hash("green") }
local astro = collectionfactory.create("#factory", nil, nil, props, nil)
...

"astronaut"κ°€ 슀폰된 각각의 μΈμŠ€ν„΄μŠ€λ“€μ€ λ„˜κ²¨μ§„ κ°’μœΌλ‘œ "size" 속성을 μ…‹νŒ…ν•˜κ²Œ 되고, 각 "probe" 듀은 "color" 속성이 μ…‹νŒ…λ©λ‹ˆλ‹€.

-- probe.script
--
go.property("color", hash("blue"))

function init(self)
  ...

우주인 μ—¬λŸ¬ λͺ…을 μŠ€ν°ν•˜κ³  μ λ‹Ήνžˆ λ°°μΉ˜ν•˜μ—¬ μ•Œλ§žμ€ 속성 값듀을 보내면, μ•„λž˜μ²˜λŸΌ μ‚¬λž‘μ΄ λ„˜μΉ˜λŠ” 행성을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

Populated planet