Building blocks - kuimoani/defold GitHub Wiki

Building blocks

이 λ¬Έμ„œμ—μ„œλŠ” κ²Œμž„μ˜€λΈŒμ νŠΈ, μ»΄ν¬λ„ŒνŠΈ, μ»¬λ ‰μ…˜μ΄ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.

Defoldμ—μ„œ λ§Œλ“  것 쀑 μΌλΆ€λŠ” λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄μ™€λŠ” λ‹€λ₯΄κ²Œ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 블둝듀을 μ™œ ν•©μΉ˜λ©° μ–΄λ–»κ²Œ ν•©μΉ˜λŠ”μ§€μ— λŒ€ν•œ 이해가 쑰금 μ–΄λ €μšΈ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. Defoldκ°€ μ–΄λ–»κ²Œ κ²Œμž„ λ¦¬μ†ŒμŠ€λ₯Ό κ΄€λ¦¬ν•˜κ³  μ ‘κ·Όν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ”, 이 λ¬Έμ„œμ™€ Message passing λ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€. 여기에 μžˆλŠ” 것듀 쀑 일뢀 ν˜Ήμ€ λŒ€λΆ€λΆ„μ€ μƒμ†Œν•˜κ³  μ²˜μŒμ—λŠ” μ΄ν•΄ν•˜κΈ° νž˜λ“€κ² μ§€λ§Œ, κ±±μ • λ§ˆμ„Έμš”. μ‹œκ°„μ„ λ‚΄μ„œ 에디터와 κ²Œμž„μ—”μ§„μ„ 닀뀄보고 싀행에 λ¬Έμ œκ°€ 생기면 λ¬Έμ„œλ“€μ„ λ‘˜λŸ¬ λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

Building blocks

Game objects

κ²Œμž„ μ˜€λΈŒμ νŠΈλŠ” κ²Œμž„μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆμ— 각각의 수λͺ…을 κ°€μ§€λŠ” κ°„λ‹¨ν•œ κ°μ²΄μž…λ‹ˆλ‹€. 일반적으둜 κ²Œμž„ μ˜€λΈŒμ νŠΈλŠ” λΉ„μ£Όμ–Όμ΄λ‚˜ μ˜€λ””μ˜€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μš”μ†Œλ“€(예λ₯Ό λ“€μ–΄ μŠ€ν”„λΌμ΄νŠΈ μ»΄ν¬λ„ŒνŠΈλ‚˜ μ‚¬μš΄λ“œ μ»΄ν¬λ„ŒνŠΈ)을 μž₯μ°©ν•˜μ—¬ μ‚¬μš©λ©λ‹ˆλ‹€. λ˜ν•œ 슀크립트 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž₯μ°©ν•΄μ„œ νŠΉμ •ν•œ λ™μž‘μ„ κ΅¬ν˜„ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ κ²Œμž„ μ˜€λΈŒμ νŠΈλŠ” 이런 λ‹€μ–‘ν•œ μ»΄ν¬λ„ŒνŠΈλ“€μ„ μœ„ν•œ μ»¨ν…Œμ΄λ„ˆλΌλŠ” μ μ—μ„œ μŠ€ν”„λΌμ΄νŠΈ, λͺ¨λΈ, μ‚¬μš΄λ“œμ™€λŠ” κ΅¬λΆ„λ©λ‹ˆλ‹€. 당신은 κ²Œμž„ 였브젝트λ₯Ό μƒμ„±ν•˜μ—¬ μ—λ””ν„°μƒμ˜ μ»¬λ ‰μ…˜μ— λ°°μΉ˜μ‹œν‚¬ 수 있으며 ν˜Ήμ€ νŒ©ν† λ¦¬λ₯Ό μ‚¬μš©ν•˜μ—¬ λŸ°νƒ€μž„μ‹œ λ™μ μœΌλ‘œ 슀폰되게 ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ° μ—λ””ν„°μ—μ„œ κ²Œμž„ 였브젝트λ₯Ό μƒμ„±ν•˜λŠ” 두 κ°€μ§€ 방법이 μžˆμŠ΅λ‹ˆλ‹€:

  1. κ²Œμž„μ˜€λΈŒμ νŠΈ νŒŒμΌμ„ λ§Œλ“  ν›„ μ»¬λ ‰μ…˜μ— 이 파일의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κΈ°
  2. κ²Œμž„μ˜€λΈŒμ νŠΈμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ»¬λ ‰μ…˜μ— λ°°μΉ˜ν•˜μ—¬ λ§Œλ“€κΈ°

이듀 λ°©μ‹μ˜ 차이점을 μ‚΄νŽ΄ 보도둝 ν•©μ‹œλ‹€.

Prototypes and instances

κ²Œμž„ 였브젝트 νŒŒμΌμ„ μƒμ„±ν•΄μ„œ κ²Œμž„ 였브젝트λ₯Ό μœ„ν•œ 섀계도(blueprint)λ‚˜ ν”„λ‘œν† νƒ€μž…(prototype)을 λ§Œλ“­λ‹ˆλ‹€. λ‚˜μ€‘μ— 이 ν”„λ‘œν† νƒ€μž…μœΌλ‘œ ν•˜λ‚˜ ν˜Ήμ€ λ‹€μˆ˜μ˜ κ²Œμž„μ˜€λΈŒμ νŠΈ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

Game object file

κ²Œμž„ 였브젝트 νŒŒμΌμ„ λ§Œλ“€μ–΄λ„ κ²Œμž„ μ‹€ν–‰μ‹œμ—λŠ” 아무것도 μΆ”κ°€λ˜λŠ” 것이 μ—†μŠ΅λ‹ˆλ‹€. 이 κ²Œμž„ μ˜€λΈŒμ νŠΈλŠ” 아직 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©°, μ‹€μ œ 였브젝트λ₯Ό λ§Œλ“€ 수 μžˆλŠ” κ³΅μ‹λ§Œ μ‘΄μž¬ν•  λΏμž…λ‹ˆλ‹€. 미리 λ§Œλ“€μ–΄ 놓은 섀계도λ₯Ό 기반으둜 μ‹€μ œ κ²Œμž„ 였브젝트λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ”, μ»¬λ ‰μ…˜μ„ 였λ₯Έμͺ½ ν΄λ¦­ν•˜κ³  Add Game Object File을 μ„ νƒν•΄μ„œ ν”„λ‘œμ νŠΈμ˜ μ»¬λ ‰μ…˜μ— κ²Œμž„μ˜€λΈŒμ νŠΈμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μΆ”κ°€ν•˜λ©΄ λ©λ‹ˆλ‹€.

Game object instance

이제 κ²Œμž„ μ˜€λΈŒμ νŠΈλŠ” μž‘λ™μ„ μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 당신은 λ§Žμ€ 수의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ μˆ˜λ„ μžˆλŠ”λ°, 각각의 μΈμŠ€ν„΄μŠ€λŠ” μ•„κΉŒ κ²Œμž„ 였브젝트 νŒŒμΌμ— μ €μž₯된 것과 λ˜‘κ°™μ€ λ³΅μ œλ³Έμž…λ‹ˆλ‹€.

Game object clones

μ΄λŸ¬ν•œ λ°©μ‹μ˜ 쒋은 점은 κ²Œμž„ 였브젝트 νŒŒμΌμ„ λ³€κ²½ν•˜μ—¬ ν”„λ‘œν† νƒ€μž…μ„ λ°”κΎΈλŠ” 경우, 이 νŒŒμΌμ„ 기반으둜 μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ“€λ„ μ¦‰μ‹œ λ³€κ²½λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

Game object alter file

Childing game objects

μ΄μ œλŠ” 처음으둜 νŠΉμ΄ν•˜κ²Œ λ³΄μ΄λŠ” 사둀λ₯Ό μ‚΄νŽ΄ 보도둝 ν•©μ‹œλ‹€. μœ„μ˜ ν”„λ‘œν† νƒ€μž… 파일의 "my_gameobject" μΈμŠ€ν„΄μŠ€λ₯Ό μ»¬λ ‰μ…˜μ— μΆ”κ°€ν•˜κ³ , "heart"λΌλŠ” μ΄λ¦„μ˜ κ²Œμž„ 였브젝트λ₯Ό λͺ‡λͺ‡ μ»΄ν¬λ„ŒνŠΈλ“€κ³Ό ν•¨κ»˜ 생성해 λ΄…μ‹œλ‹€. (μ»¬λ ‰μ…˜μ— 였λ₯Έμͺ½ν΄λ¦­ ν›„ Add Game Object 선택) λ§ˆμ§€λ§‰μœΌλ‘œ, "heart" 였브젝트λ₯Ό "my_gameobject"둜 λ“œλž˜κ·Έν•΄μ„œ μžμ‹ 였브젝트둜 λ§Œλ“­λ‹ˆλ‹€. 이제 μ»¬λ ‰μ…˜μ΄ λ‹€μŒκ³Ό 같이 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€:

Game object instance with child

"heart" 였브젝트λ₯Ό "my_gameobject"둜 λ“œλž˜κ·Έν•˜λŠ” κ²ƒμœΌλ‘œ 인해 "my_gameobject.go"파일이 λ°”λ€ŒλŠ” 것이 μ•„λ‹Œμ§€ 생각할 μˆ˜λ„ μžˆμ§€λ§Œ, 그런 일은 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ˜ 영ν–₯은 였직 "my_gameobject"λΌλŠ” κ²Œμž„ 였브젝트 μΈμŠ€ν„΄μŠ€κ°€ μžμ‹ 였브젝트λ₯Ό κ°€μ§€λŠ” 것 λΏμž…λ‹ˆλ‹€. 이 κ²Œμž„ 였브젝트 μΈμŠ€ν„΄μŠ€λŠ” ν”„λ‘œν† νƒ€μž…κ³Ό μžμ‹μ˜€λΈŒμ νŠΈμ— κ΄€ν•œ 두 κ°€μ§€ λ‹€λ₯Έ 속성을 κ°€μ§‘λ‹ˆλ‹€. κ²Œμž„ 였브젝트 μΈμŠ€ν„΄μŠ€μ— μžμ‹ μ˜€λΈŒμ νŠΈλ“€μ„ μΆ”κ°€ν•˜λ©΄ ν”„λ‘œν† νƒ€μž…μ€ κ±΄λ“œλ¦¬μ§€ μ•Šμ€ μ±„λ‘œ ν•΄λ‹Ή 였브젝트의 μžμ‹ 속성(children property) 이 μΆ”κ°€λ©λ‹ˆλ‹€.

μ»¬λ ‰μ…˜ νŒŒμΌμ— 마우슀 였λ₯Έμͺ½ λ²„νŠΌμ„ λˆ„λ₯΄κ³  Open With > Text Editorλ₯Ό μ„ νƒν•΄μ„œ ν…μŠ€νŠΈ μ—λ””ν„°λ‘œ μ»¬λ ‰μ…˜μ„ μ—΄μ–΄ 보면 κ²Œμž„ 였브젝트 데이터 ꡬ쑰λ₯Ό νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

name: "default"
instances {
  id: "my_gameobject"
  prototype: "/a_simple_test/my_gameobject.go"
  children: "heart"
  ...
}
scale_along_z: 0
embedded_instances {
  id: "heart"
  data: "embedded_components {\n  id: \"sprite\"\n  type: \"sprite\"\n  data: \"tile_set: \\\"/cards_example/cards_sprites.atlas\\\"\\ndefault_animation: \\\"heart\\\"\\nmaterial: \\\"/builtins/materials/sprite.material\\\"\\nblend_mode: BLEND_MODE_ALPHA\\n\"\n  position {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n  }\n  rotation {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n    w: 1.0\n  }\n}\n"
  ...
}

이처럼 κ²Œμž„ 였브젝트 μΈμŠ€ν„΄μŠ€κ°€ prototype 속성을 κ°€μ§€κ³  μžˆλŠ” 것을 μœ„ νŒŒμΌμ—μ„œ λͺ…ν™•νžˆ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 또 λ‹€λ₯Έ 속성인 children은 "heart"λΌλŠ” μ΄λ¦„μ˜ μžμ‹ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ§€κ³  μžˆλŠ”λ°, "heart"λŠ” λ‹€λ₯Έ κ²Œμž„μ˜€λΈŒμ νŠΈμ™€ 달리 ν”„λ‘œν† νƒ€μž… 기반이 μ•„λ‹ˆκ³  내뢀에 μœ„μΉ˜λœ κ²Œμž„ 였브젝트(in-place game object)μ΄λ―€λ‘œ embedded_instances μ•„λž˜μ— λ‚˜μ—΄λ˜λ©° 이 λ°μ΄ν„°λŠ” ν˜„μž¬μ˜ μ»¬λ ‰μ…˜ νŒŒμΌμ—λ§Œ μ €μž₯λ©λ‹ˆλ‹€.

이 μ—λ””ν„°μ—μ„œ μž‘μ—…ν•  λ•Œ κ²Œμž„ 였브젝트 ν”„λ‘œν† νƒ€μž…κ³Ό μΈμŠ€ν„΄μŠ€λ₯Ό λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„ν•˜λŠ” 것 외에도, λŸ°νƒ€μž„μ‹œ κ³ μ •λœ μ•„μ΄λ””λ‘œ μ–΄λ–»κ²Œ κ²Œμž„ 였브젝트λ₯Ό μ‹λ³„ν•˜λŠ”μ§€μ™€ μžμ‹μ˜€λΈŒμ νŠΈλ₯Ό μ„€μ •ν•˜λŠ” 것이 아이디에 μ–΄λ–»κ²Œ 영ν–₯을 λΌμΉ˜λŠ”μ§€ μ‹œκ°„μ„ λ“€μ—¬ μ‹ μ€‘νžˆ κ³΅λΆ€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. Message passing λ¬Έμ„œμ— μžμ„Έν•œ μ„€λͺ…이 μžˆμŠ΅λ‹ˆλ‹€.

μ§€κΈˆμ―€ 당신은 μ•„λ§ˆ "κ²Œμž„ 였브젝트 νŒŒμΌμ„ λ§Œλ“€μ–΄ κ²Œμž„ μ˜€λΈŒμ νŠΈμ™€ μžμ‹ 였브젝트λ₯Ό μƒμ„±ν•œ λ‹€μŒ μ»¬λ ‰μ…˜μ— 이 였브젝트λ₯Ό μΈμŠ€ν„΄μŠ€ν™” μ‹œν‚¨ ν›„ μžμ‹ 였브젝트λ₯Ό μ‚­μ œν•˜λ©΄ μ–΄λ–»κ²Œ 될까?"λΌλŠ” μ˜λ¬Έμ„ ν’ˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ°„λ‹¨νžˆ λ‹΅λ³€ν•˜μžλ©΄ 이것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. κ²Œμž„ 였브젝트 νŒŒμΌμ€ 단일 κ²Œμž„ 였브젝트의 μ„€κ³„λ„λ©΄μž…λ‹ˆλ‹€. 였직 λΉŒλ“œμ‹œμ— μ—λ””ν„°μ—μ„œ μ»¬λ ‰μ…˜μ„ μˆ˜μ •ν•˜κ±°λ‚˜ λŸ°νƒ€μž„μ‹œμ— msg.post("my_object", "set_parent", { parent_id = go.get_id("my_parent") }) λ₯Ό μ‚¬μš©ν•˜μ—¬ κ²Œμž„ 였브젝트의 μΈμŠ€ν„΄μŠ€μ— μžμ‹ μ˜€λΈŒμ νŠΈλ“€μ„ μΆ”κ°€ν•˜λŠ” κ²ƒλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.

Components

μ»΄ν¬λ„ŒνŠΈλŠ” νŠΉμ •ν•œ ν‘œν˜„μ΄λ‚˜ κΈ°λŠ₯을 κ²Œμž„ μ˜€λΈŒμ νŠΈμ— λΆ€μ—¬ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. 이것듀은 κ²Œμž„ 였브젝트 μ•ˆμ— ν¬ν•¨λ˜μ–΄μ•Όλ§Œ ν•˜λ©° 슀슀둜 μ‚΄μ•„κ°€μ§€ λͺ»ν•©λ‹ˆλ‹€. 여기에 μ—λ””ν„°μ—μ„œ μƒˆ μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜λŠ” 두가지 방법이 μžˆμŠ΅λ‹ˆλ‹€:

  1. μ»΄ν¬λ„ŒνŠΈ νŒŒμΌμ„ μƒμ„±ν•œ ν›„ μ»΄ν¬λ„ŒνŠΈμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κ²Œμž„ 였브젝트 μ•ˆμ— λ§Œλ“œλŠ” 방법
  2. κ²Œμž„ 였브젝트 μ•ˆμ— λ‚΄μž₯(in-place) μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 방법

μœ„ 두 κ°€μ§€ μΌ€μ΄μŠ€λ‘œ νŠΉμ • μœ ν˜•μ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•΄μ„œ μ—λ””ν„°μ—μ„œ 이 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ—΄λ©΄ μ»΄ν¬λ„ŒνŠΈμ˜ μ’…λ₯˜μ— λ§žλŠ” μ ν•©ν•œ 에디터λ₯Ό λ„μ›Œμ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€λ£° 수 있게 ν•΄ μ€λ‹ˆλ‹€.

μš°λ¦¬λŠ” 이전 μ„Ήμ…˜μ—μ„œ embedded_components 속성을 ν†΅ν•΄μ„œ 에디터가 λ‚΄μž₯ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ²Œμž„ μ˜€λΈŒμ νŠΈμ— μ–΄λ–»κ²Œ μ €μž₯ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ΄μ™€λŠ” 쑰금 λ‹€λ₯΄μ§€λ§Œ 파일의 μ°Έμ‘°(reference)λ‘œλΆ€ν„° μ»΄ν¬λ„ŒνŠΈλ₯Ό μΈμŠ€ν„΄μŠ€ν™” ν•˜λ©΄ μ•„λž˜ 처럼 λ‚˜νƒ€λ‚©λ‹ˆλ‹€:

embedded_instances {
  id: "heart2"
  data: "components {\n  id: \"sprite\"\n  component: \"/a_simple_test/my_heart.sprite\"\n  position {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n  }\n  rotation {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n    w: 1.0\n  }\n}\n"
  ...
}

μ»΄ν¬λ„ŒνŠΈμ˜ νŠΉμ •ν•œ λ°μ΄ν„°λŠ” component 속성값을 톡해 μ»΄ν¬λ„ŒνŠΈ νŒŒμΌμ„ μ°Έμ‘°ν•˜μ—¬ μ €μž₯λ©λ‹ˆλ‹€.

μ•„λ§ˆλ„ κ°€μž₯ 자주 μ“°μ΄λŠ” μ»΄ν¬λ„ŒνŠΈ νƒ€μž…μ€ λ™μž‘(behaviors)을 κ΅¬ν˜„ν•˜λŠ”λ° μ“°μ΄λŠ” 슀크립트 μ»΄ν¬λ„ŒνŠΈ 일 κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 잊기 μ‰¬μš΄κ²ƒμ€ 슀크립트 μ»΄ν¬λ„ŒνŠΈμ™€ 이λ₯Ό ν¬ν•¨ν•˜λŠ” κ²Œμž„μ˜€λΈŒμ νŠΈκ°„μ— λͺ…ν™•ν•œ 경계가 μžˆλ‹€λŠ” μ‚¬μ‹€μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ•„λž˜λŠ” 일반적인 μŠ€νƒ€μΌμ˜ λ©”μ„Έμ§€ 전달 λ°©λ²•μž…λ‹ˆλ‹€:

msg.post("my_object", "my_message", { my_data = 1 }})

μ—¬κΈ°μ„œ 이 μ»€μŠ€ν…€ λ©”μ„Έμ§€λŠ” "my_object"λΌλŠ” κ²Œμž„ 였브젝트둜 μ „μ†‘λ©λ‹ˆλ‹€. 이것은 일반적으둜 잘 λ™μž‘ν•˜μ§€λ§Œ ꢌμž₯ν•˜λŠ” 방식은 μ•„λ‹™λ‹ˆλ‹€. 첫째, κ²Œμž„ 였브젝트둜 μ „μ†‘λœ λ©”μ„Έμ§€λŠ” κ²Œμž„ μ˜€λΈŒμ νŠΈμ— ν¬ν•¨λœ λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈλ“€μ—κ²Œ λΈŒλ‘œλ“œμΊμŠ€νŒ… λ˜μ–΄ λΆˆν•„μš”ν•œ μ˜€λ²„ν—€λ“œκ°€ 생길 수 μžˆμŠ΅λ‹ˆλ‹€. λ‘˜μ§Έ, κ²Œμž„ 였브젝트의 일뢀 λ™μž‘μ„ κΉ¨νŠΈλ¦΄μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ²Œμž„ μ˜€λΈŒμ νŠΈκ°€ μ—¬λŸ¬ 개의 슀크립트 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°€μ§€κ³  있고 λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ§€ μ•Šμ€ μ±„λ‘œ 이 μŠ€ν¬λ¦½νŠΈκ°€ μ „λΆ€ "my_message"λΌλŠ” λ©”μ„Έμ§€λ₯Ό 기닀리고 μžˆλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. λ©”μ„Έμ§€μ˜ μ£Όμ†Œλ₯Ό μ§€μ •ν•˜λŠ”λ° ꢌμž₯ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” κ°€λŠ₯ν•œ ꡬ체적이고 κ²Œμž„ μ˜€λΈŒμ νŠΈμ™€ μ»΄ν¬λ„ŒνŠΈκ°„ 차이λ₯Ό μ•ŒκΈ° μ‰½κ²Œ μ§€μ •ν•˜λŠ” 것이 쒋은 λ°©λ²•μž…λ‹ˆλ‹€.

msg.post("my_object#script", "my_message", { my_data = 1 })

Custom component properties

μ»΄ν¬λ„ŒνŠΈλŠ” ν•œκ°€μ§€ λ˜λŠ” λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ³€κ²½ν•˜λ„λ‘ μ…‹νŒ…λœ μœ ν˜•λ³„ νŠΉμ • 속성듀이 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λΌμ΄νŠΈ μ»΄ν¬λ„ŒνŠΈμ—λŠ” 넓이(width)와 길이(height)κ°€ 있으며, μ‚¬μš΄λ“œ μ»΄ν¬λ„ŒνŠΈμ—λŠ” μ‚¬μš΄λ“œλ₯Ό λ°˜λ³΅ν• μ§€ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λŠ” 속성이 μžˆμŠ΅λ‹ˆλ‹€. 또 슀크립트 μ»΄ν¬λ„ŒνŠΈμ—μ„œλŠ” νŠΉμ •ν•œ 속성을 직접 λ§Œλ“€ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 슀크립트 νŒŒμΌμ— 속성을 λ§Œλ“œλŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ 슀크립트 μ»΄ν¬λ„ŒνŠΈμ˜ 속성을 μ‰½κ²Œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

-- self.healthλŠ” μžλ™μœΌλ‘œ 100을 κΈ°λ³Έκ°’μœΌλ‘œ μ…‹νŒ…ν•¨.
-- 이 슀크립트 μ»΄ν¬λ„ŒνŠΈλ₯Ό ν¬ν•¨ν•˜λŠ” μΈμŠ€ν„΄μŠ€μ˜ μ΄ˆκΈ°κ°’μ„ λ³€κ²½ν•  수 있음.
go.property("health", 100)

function on_message(self, message_id, message, sender)
	-- 이제 "self.health"λΌλŠ” 속성값에 μ•‘μ„ΈμŠ€ ν•  수 있음
    ...
end

슀크립트 속성이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μžμ„Έν•œ μ„€λͺ…이 μ•Œκ³  μ‹Άλ‹€λ©΄ Script properties λ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€. 슀크립트 속성을 μ •μ˜ν•˜λ©΄ κ·Έ 속성과 μ—°κ΄€λœ μžλ£Œν˜•μœΌλ‘œ λ‹€λ₯Έ λ³΄ν†΅μ˜ μ†μ„±λ“€μ²˜λŸΌ νŒŒμΌμ— μ €μž₯λ©λ‹ˆλ‹€. κ²Œμž„ μ˜€λΈŒμ νŠΈκ°€ ν”„λ‘œν† νƒ€μž…μ— μ˜ν•΄ μΈμŠ€ν„΄μŠ€ν™” 된 κ²½μš°μ—” λ³„λ„μ˜ component_properties 속성이 슀크립트 속성(ν–₯μš°μ—” λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ—λ„ κ°€λŠ₯할지도)을 ν¬ν•¨ν•˜λŠ” 였브젝트 μΈμŠ€ν„΄μŠ€μ— μΆ”κ°€λ©λ‹ˆλ‹€:

Script properties

  component_properties {
    id: "script"
    properties {
      id: "my_property"
      value: "4712.0"
      type: PROPERTY_TYPE_NUMBER
    }
  }

λ°˜λŒ€λ‘œ μž„λ² λ””λ“œ 된 κ²Œμž„ μ˜€λΈŒμ νŠΈμ—μ„œ λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ 속성은 λͺ…μ‹œμ μœΌλ‘œ properties μ†μ„±μœΌλ‘œ μ»¬λ ‰μ…˜ νŒŒμΌμ— ν‘œμ‹œλ©λ‹ˆλ‹€:

Embedded script properties

data: "components {\n  id: \"some_script\"\n  component: \"/a_simple_test/my_thing.script\"\n  position {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n  }\n  rotation {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n    w: 1.0\n  }\n  properties {\n    id: \"my_property\"\n    value: \"4713.0\"\n    type: PROPERTY_TYPE_NUMBER\n  }\n}\ncomponents {\n  id: \"sprite\"\n  component: \"/a_simple_test/my_heart.sprite\"\n  position {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n  }\n  rotation {\n    x: 0.0\n    y: 0.0\n    z: 0.0\n    w: 1.0\n  }\n}\n"

Collections

μ»¬λ ‰μ…˜μ€ ν…œν”Œλ¦Ώ 생성을 μœ„ν•œ Defold의 λ©”μ»€λ‹ˆμ¦˜μ΄λ©° λ‹€λ₯Έ κ²Œμž„μ—”μ§„μ—μ„  ν”„λ¦¬νŽ©(prefab)이라고도 뢈렀 지기도 ν•©λ‹ˆλ‹€. μ»¬λ ‰μ…˜μ€ κ²Œμž„ μ˜€λΈŒμ νŠΈλ“€μ΄λ‚˜ 또 λ‹€λ₯Έ μ»¬λ ‰μ…˜λ“€μ„ κ°€μ§€λŠ” 트리ꡬ쑰둜 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ»¬λ ‰μ…˜μ€ 항상 νŒŒμΌμ— μ €μž₯되며 ν•œλ‘κ°€μ§€ λ°©λ²•μœΌλ‘œ κ²Œμž„μœΌλ‘œ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€:

  1. λΉŒλ“œμ‹œ μ»¬λ ‰μ…˜μ„ μ—λ””ν„°μƒμ˜ λ‹€λ₯Έ μ»¬λ ‰μ…˜μ— λ°°μΉ˜ν•˜λŠ” 방법
  2. λŸ°νƒ€μž„μ‹œ μ»¬λ ‰μ…˜ ν”„λ‘μ‹œ(Collection proxy)λ₯Ό μ‚¬μš©ν•΄μ„œ μ»¬λ ‰μ…˜μ— λͺ¨μΈ λͺ¨λ“  λ¦¬μ†ŒμŠ€λ₯Ό λ™μ μœΌλ‘œ λ‘œλ”©ν•˜λŠ” 방법(μžμ„Έν•œ 것은 Collection proxyλ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€.)

Collection instances

에디터에 μœ„μΉ˜ν•œ μ»¬λ ‰μ…˜λ“€μ€ μˆ˜μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 배치된 μ»¬λ ‰μ…˜μ˜ 일뢀인 κ²Œμž„ μ˜€λΈŒμ νŠΈμ— ν•˜μœ„ ν•­λͺ©μ„ μΆ”κ°€ν•  수 μ—†μŠ΅λ‹ˆλ‹€. μ»¬λ ‰μ…˜ μΈμŠ€ν„΄μŠ€μ— μ €μž₯된 데이터λ₯Ό 보면 잘 될거 같은데 μ™œ μ•ˆλ κΉŒμš”? κ²Œμž„ 였브젝트λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” 이 λ°μ΄ν„°λŠ” "my_collection.collection"μ΄λΌλŠ” 참쑰된 μ»¬λ ‰μ…˜ 파일 μ•ˆμ— 있고 이것은 μˆ˜μ •λ˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€.

μ»¬λ ‰μ…˜ 파일 원본을 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λŠ” μ»¬λ ‰μ…˜μ˜ λ‚΄μš©μ„ μˆ˜μ •ν•  수 μ—†μ§€λ§Œ, μ—λ””ν„°λŠ” μ»¬λ ‰μ…˜μ—μ„œ μ»΄ν¬λ„ŒνŠΈλ“€κ³Ό μ—°κ΄€λœ 슀크립트 속성과 λ™μΌν•˜κ²Œ μ†μ„±κ°’λ“€μ˜ μˆ˜μ •μ„ ν—ˆμš©ν•©λ‹ˆλ‹€.

Properties in a collection

collection_instances {
  id: "my_collection"
  collection: "/a_simple_test/my_collection.collection"
  position {
    x: -172.74739
    y: 149.61157
    z: 0.0
  }
  rotation {
    x: 0.0
    y: 0.0
    z: 0.0
    w: 1.0
  }
  scale: 1.0
  instance_properties {
    id: "my_gameobject"
    properties {
      id: "script"
      properties {
        id: "my_property"
        value: "4717.0"
        type: PROPERTY_TYPE_NUMBER
      }
    }
  }
}

λ§Žμ΄λ“€ ν—·κ°ˆλ¦¬λŠ” 점은 μ»¬λ ‰μ…˜ κ³„μΈ΅κ΅¬μ‘°μ˜ κ²Œμž„ 였브젝트의 μœ„μΉ˜κ°€ λŸ°νƒ€μž„μ‹œμ— λΆ€λͺ¨-μžμ‹ 계측(set_parent λ©”μ„Έμ§€λ‘œ λ§Ίμ–΄μ§„)으둜 λœλ‹€λŠ” 것이 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ 두 κ°€μ§€ 차이점을 κΉ¨λ‹«λŠ” 것이 μ€‘μš”ν•œλ°, μ»¬λ ‰μ…˜μ€ 관리 및 κ·Έλ£Ήν™”λ₯Ό μ˜λ―Έν•˜λŠ” 반면, λΆ€λͺ¨-μžμ‹ 계측은 μ˜€λΈŒμ νŠΈκ°€ λ˜λ‹€λ₯Έ μ˜€λΈŒμ νŠΈμ™€ μ‹œκ°μ μœΌλ‘œ μ—°κ²°λ˜μ–΄ 씬 κ·Έλž˜ν”„(scene graph)λ₯Ό λ™μ μœΌλ‘œ μˆ˜μ •ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ»¬λ ‰μ…˜ κ³„μΈ΅μ—μ„œλŠ” κ²Œμž„ 였브젝트의 μœ„μΉ˜λ‘œ idλ₯Ό μ§€μ •ν•˜μ§€λ§Œ 이 idλŠ” 였브젝트의 수λͺ…κΈ°κ°„ λ™μ•ˆμ—” 정적(static)μƒνƒœμž…λ‹ˆλ‹€. κ²Œμž„ 였브젝트의 μ£Όμ†Œ μ§€μ •(addressing)에 λŒ€ν•œ μžμ„Έν•œ μ„€λͺ…은 Message passing λ¬Έμ„œλ₯Ό μ°Έκ³  λ°”λžλ‹ˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️