Godot: GDScript์˜ ์ฃผ์„

์— ๋งŒ๋“  2018๋…„ 07์›” 21์ผ  ยท  45์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: godotengine/godot

์•ฝ 1๋…„ ์ „์— GDScript์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” PR์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(#9469). ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๊ตฌ๋ฌธ ๋ถ„์„ ํŠธ๋ฆฌ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ณ  ํƒ€์‚ฌ ๋„๊ตฌ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

์ด ์ œ์•ˆ์€ ๋” ๋งŽ์€ ํ‚ค์›Œ๋“œ๋ฅผ ํ•ดํ‚นํ•˜์ง€ ์•Š๊ณ ๋„ GDScript๋ฅผ ๋” ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฃผ์„์— ๋Œ€ํ•œ ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ค ์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

  • export ํžŒํŠธ. ์ง€๊ธˆ์€ ๊ฐ ์œ ํ˜•์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋ฉด PropertyInfo์— ๋Œ€ํ•œ ์‚ฌ์šฉ๋ฒ•๊ณผ ํžŒํŠธ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ GDScript ํŒŒ์„œ์—์„œ ์ƒˆ ๊ตฌ๋ฌธ์„ ํ•ดํ‚นํ•˜์ง€ ์•Š๊ณ ๋„ Inspector์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํ•ญ๋ชฉ์„ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด export ํ‚ค์›Œ๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ํžŒํŠธ๋งŒ ์ฃผ์„์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์€ ์œ ํ˜• ํžŒํŠธ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์—๋Š” export ์นดํ…Œ๊ณ ๋ฆฌ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค(#4378, #10303).
  • onready ํ‚ค์›Œ๋“œ๋ฅผ ์ฃผ์„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ํŠน์ • ๊ฒฝ๊ณ ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. #19993 ๊ฒฝ๊ณ ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ ๊ตฌ๋ฌธ์œผ๋กœ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ๋Œ€์‹  ์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • setget (๊ฒŒํ„ฐ๋งŒ ์›ํ•  ๋•Œ ์ด์ƒํ•œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค).
  • RPC ํ‚ค์›Œ๋“œ( master , slave , sync , remote ).
  • ํŽธ์ง‘๊ธฐ์—์„œ๋งŒ( tool ) ๋˜๋Š” ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋งŒ( #12837 ๊ด€๋ จ) ํ•จ์ˆ˜๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์ „์ฒ˜๋ฆฌ๊ธฐ ๋ช…๋ น.
  • ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ตœ์ข… ๋…ผ์˜(์˜ˆ: ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ ์‹œ ๋ฐฉ์ถœํ•  ์‹ ํ˜ธ: #6491).
  • ์‚ฌ์šฉ์ž ์ •์˜ "๋ฐ์ฝ”๋ ˆ์ดํ„ฐ"๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 
์ƒˆ ํ‚ค์›Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด GDScript ํ† ํฌ๋‚˜์ด์ € ๋ฐ ํŒŒ์„œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ export ๊ตฌ๋ฌธ ๋ถ„์„์€ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ณ  ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ด€๋ จ ๊ตฌ๋ฌธ ๋ถ„์„๊ณผ ํ˜ผํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์†์„ฑ(์˜ˆ: export, setget, onready)์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์ด ์ค„์–ด๋“ค๊ณ  ๋Œ€์‹  ์–ด๋–ค ์ฃผ์„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ 
์ฃผ์„ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ‚ค์›Œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํŒŒ์„œ์— ๋” ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด "๋‹จ์ง€ ์ฃผ์„"์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ์•ˆํ•˜๋Š” ๋ฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ†ต์‚ฌ๋ก 
๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์„ ํ˜ธ๋„๋Š” ์—†์ง€๋งŒ Python ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="41">@onready</strong>
var my_sprite = $Sprite

์ธ์ˆ˜ ์ „๋‹ฌ์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@export_hint(ENUM)
@export_hint_string("Attack,Defense")
export var my_enum : int = 0

์•„๋งˆ๋„ ๊ด„ํ˜ธ ์—†์ด:

<strong i="48">@export_hint</strong> ENUM
<strong i="49">@export_hint_string</strong> "Attack,Defense"
export var my_enum : int = 0

๋˜๋Š” ๋ช…๋ช…๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(ํ‚ค์›Œ๋“œ๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค):

<strong i="53">@export</strong> type=String hint=MULTILINE
var my_text = ""

๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ.

๋งž์ถค ์ฃผ์„
์•Œ ์ˆ˜ ์—†๋Š” ์ฃผ์„์€ ๋‹จ์ˆœํžˆ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค(๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜). ๋”ฐ๋ผ์„œ ํƒ€์‚ฌ ๋„๊ตฌ๋Š” ์ฃผ์„์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ ๋ฌธ์„œ ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๊ฒ€์‚ฌ API๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. get_method_annotations() , get_property_annotations() ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋“œ ์ฝ”๋”ฉ๋œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ํ˜ธ์ถœํ•  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

archived discussion feature proposal gdscript

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

gdscript์˜ ๊ตฌ๋ฌธ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์ˆ˜์ •๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์›๋ž˜ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ์‚ฌํ•ญ(์ž…๋ ฅ๋œ gds, ์ฃผ์„)์œผ๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

์ „๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ GDScript ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ์€ ์ด์ „ ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ชฉํ‘œ๋Š” GDScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

  • match ๋ฌธ์€ switch-case ๋ฌธ(๋งŽ์€ ์š”์ฒญ์ด ์žˆ์—ˆ์Œ)์„ ํ—ˆ์šฉํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋ฐฐ์—ด๊ณผ ์‚ฌ์ „์„ ์‰ฝ๊ฒŒ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ด๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • onready ๋ณ€์ˆ˜(2.x์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ)๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด, ์ฆ‰ _ready ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŒจํ„ด์„ ๊ตฌ์ฒดํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • Typed GDScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งˆ์นจ๋‚ด ์ž˜๋ชป๋œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉฐ ๋™์‹œ์— ๋” ๋‚˜์€ ์ž๋™ ์™„์„ฑ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” ์ฒซ ๊ฒŒ์ž„์—์„œ ์ด๋ฅผ ๋ฐฐ์šธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—ฌ์ž ์‚ฌ์ด์— ๋‹จ์ ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์™€์„œ ์ž์‹ ์˜ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ฃผ์„์ด ํ˜„์‹คํ™”๋˜๊ธฐ๊นŒ์ง€๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[...] ๋‚˜๋Š” gds๊ฐ€ ๊ทธ ๋‹จ์ˆœํ•จ์—์„œ ์ ์  ๋” ๋ฉ€์–ด์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ถฉ๋ถ„ํ•˜๋‹ค...

์ด๋ฏธ ์ถฉ๋ถ„ํ–ˆ๋‹ค๋ฉด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๋ฐ›์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ export ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด 3์ค„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•œ ์ค„์— ๋ชจ๋“  ๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ์˜ˆ: onready var my_sprite = $Sprite๊ฐ€ ํ›จ์”ฌ ๋” ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. onready ๋ฐ export ํ‚ค์›Œ๋“œ๋ฅผ ์ฆ‰์‹œ ๋Œ€์ฒดํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  45 ๋Œ“๊ธ€

์‚ฌ์šฉ์ž ์ •์˜ ์ฃผ์„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="6">@description</strong> "Adds two numbers and returns the result."
<strong i="7">@parameter</strong> name=num1 type=float description="The first number"
<strong i="8">@parameter</strong> name=num2 type=float description="The second number"
<strong i="9">@returns</strong> type=float description="num1 and num2 added together"
func add(num1, num2):
    return num1 + num2

๊ทธ๋ฆฌ๊ณ  get_annotations("add") ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„์€ ์ด๋Ÿฌํ•œ ์ฃผ์„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ? ์ด๋Ÿฌํ•œ ์ฃผ์„์ด Godot์—์„œ ์ผ๋ถ€ ๋‚ด์žฅ ํ‚ค์›Œ๋“œ/์ฃผ์„์œผ๋กœ ์ธ์‹๋˜์ง€ ์•Š๋”๋ผ๋„?

@LikeLakers2 ๋„ค, ๊ทธ๊ฒŒ ์š”์ง€์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋’ค์— ์žˆ๋Š” ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋ฅด์ง€๋งŒ GDscript ์ฝ”๋“œ์—์„œ๋Š” ์ง€๊ธˆ ๋ณด์ด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊นจ๋—ํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ setget ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ.

์ด๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋งŒ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ํ•œ ์ค„์งœ๋ฆฌ ๋ฌธ์žฅ์„ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,
<strong i="6">@onready</strong> var a = $A ๋Š” ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งŽ์€ ์ค„ ๋ฐ”๊ฟˆ์ด ์ถ”๊ฐ€๋˜๊ณ  ์ด ๊ฒฝ์šฐ onready์˜ ์œ ์šฉ์„ฑ์ด ๋‚ญ๋น„๋ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๊ฒƒ

<strong i="10">@onready</strong>
    var a = $A
    var b = $B
    var c = $C

์—ฌ๋Ÿฌ ๋ช…๋ น๋ฌธ์— ๋™์ผํ•œ ์ฃผ์„์„ ์ ์šฉํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์„์ด ๋๋‚˜๋Š” ์œ„์น˜์™€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ช…๋ น๋ฌธ์ด ์‹œ์ž‘๋˜๋Š” ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜์—ฌ GDScript์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์ด ๋ช…ํ™•ํ•œ ์‹œ์ž‘๊ณผ ๋์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋  ์ˆ˜ ์žˆ์œผ๋ฉด ์„ธ๋ฏธ์ฝœ๋ก ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ™์€ ์ค„์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: '()'๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ธ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ).

vnen์ด ์˜ค๋ž˜๋œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋Š” ์˜๋„๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋˜ํ•œ ํ˜•๊ด‘ํŽœ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒํ‹ฐ์— ๋Šฆ์—ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๋‚ด๋ณด๋‚ด๊ธฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฒ”์ฃผ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋„๊ตฌ/๋””๋ฒ„๊ทธ ์Šคํฌ๋ฆฝํŠธ ๋ถ„ํ• ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์œผ์‹ญ๋‹ˆ๊นŒ?

์ž ์ •์ ์œผ๋กœ 3.2 ๋กœ๋“œ๋งต์„ ์ž‘์„ฑํ•˜๋Š” ์ค‘์ธ๋ฐ, ์—๋””ํ„ฐ์˜ ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ธฐ๋Šฅ์ด ํ•˜๋ฃจ ๋นจ๋ฆฌ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ๋ฐ”๋ž๋‹ˆ๋‹ค.

#### ์ธ๊ธฐ ์—†๋Š” ์˜๊ฒฌ ์ˆ˜์‹ :

gdscript์˜ ๊ตฌ๋ฌธ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์ˆ˜์ •๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์›๋ž˜ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ์‚ฌํ•ญ(์ž…๋ ฅ๋œ gds, ์ฃผ์„)์œผ๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Godot์˜ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ์ด ํŠœํ† ๋ฆฌ์–ผ์„ ๋ณด๊ณ  LikeLakers2์˜ ๊ฒŒ์‹œ๋ฌผ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณธ๋‹ค๋ฉด ๋จธ๋ฆฌ๊ฐ€ ํ„ฐ์งˆ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์ด๋“  ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด / ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋“ฑ์— ๋Œ€ํ•ด ๋งŽ์€ ์งˆ๋ฌธ์„ ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” gds์— ๋Œ€ํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‚ฌ๋ž‘๊ณผ ๊ธฐ์—ฌ์ž๋“ค์ด ์–ด๋–ป๊ฒŒ ๋” ๋‚˜์€ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€ ๋“ฑ์„ ์™„์ „ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์‹ค์ œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—ฌ์ž ์‚ฌ์ด์— ๊ฐ€๋Šฅํ•œ ๋‹จ์ ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ธฐ์—ฌ์ž๊ฐ€ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ gds๊ฐ€ ๊ทธ ๋‹จ์ˆœํ•จ์—์„œ ์ ์  ๋” ๋ฉ€์–ด์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ๋ณด๋‹ค ์ด๋ฏธ ๋” ...

๋˜ํ•œ export ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด 3์ค„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•œ ์ค„์— ๋ชจ๋“  ๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ์˜ˆ: onready var my_sprite = $Sprite ๋Š” ํ›จ์”ฌ ๋” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค(์–ด์จŒ๋“  ๋‚˜์—๊ฒŒ)

ํฌ์ธํŠธ #4์™€ ๊ด€๋ จํ•˜์—ฌ AFAIK ํŽธ์ง‘๊ธฐ์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ 'ํŠน์ • ๊ฒฝ๊ณ ๋ฅผ ๋น„ํ™œ์„ฑํ™”'ํ•˜๋Š” ์ฃผ์„์ด ์ฝ”๋“œ ๊ณณ๊ณณ์— ์žˆ์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์ง€์ €๋ถ„ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gdscript์˜ ๊ตฌ๋ฌธ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ์ˆ˜์ •๋˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์›๋ž˜ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ƒˆ๋กœ์šด ์ถ”๊ฐ€ ์‚ฌํ•ญ(์ž…๋ ฅ๋œ gds, ์ฃผ์„)์œผ๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค.

์ „๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ GDScript ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ์€ ์ด์ „ ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ชฉํ‘œ๋Š” GDScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ:

  • match ๋ฌธ์€ switch-case ๋ฌธ(๋งŽ์€ ์š”์ฒญ์ด ์žˆ์—ˆ์Œ)์„ ํ—ˆ์šฉํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋ฐฐ์—ด๊ณผ ์‚ฌ์ „์„ ์‰ฝ๊ฒŒ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ด๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • onready ๋ณ€์ˆ˜(2.x์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ)๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด, ์ฆ‰ _ready ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŒจํ„ด์„ ๊ตฌ์ฒดํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • Typed GDScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งˆ์นจ๋‚ด ์ž˜๋ชป๋œ ์œ ํ˜•์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉฐ ๋™์‹œ์— ๋” ๋‚˜์€ ์ž๋™ ์™„์„ฑ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” ์ฒซ ๊ฒŒ์ž„์—์„œ ์ด๋ฅผ ๋ฐฐ์šธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์™€ ๊ธฐ์—ฌ์ž ์‚ฌ์ด์— ๋‹จ์ ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๋Š” ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์™€์„œ ์ž์‹ ์˜ ์˜๊ฒฌ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ฃผ์„์ด ํ˜„์‹คํ™”๋˜๊ธฐ๊นŒ์ง€๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[...] ๋‚˜๋Š” gds๊ฐ€ ๊ทธ ๋‹จ์ˆœํ•จ์—์„œ ์ ์  ๋” ๋ฉ€์–ด์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ ์ถฉ๋ถ„ํ•˜๋‹ค...

์ด๋ฏธ ์ถฉ๋ถ„ํ–ˆ๋‹ค๋ฉด ๊ธฐ๋Šฅ ์š”์ฒญ์„ ๋ฐ›์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ export ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด 3์ค„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•œ ์ค„์— ๋ชจ๋“  ๊ฒƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ์˜ˆ: onready var my_sprite = $Sprite๊ฐ€ ํ›จ์”ฌ ๋” ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. onready ๋ฐ export ํ‚ค์›Œ๋“œ๋ฅผ ์ฆ‰์‹œ ๋Œ€์ฒดํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ €๋Š” C#์˜ ์†์„ฑ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๋ฐ ์‹ ํ˜ธ ์ฃผ์„๋„ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ, ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค์— ํŠน์ • ์‚ฌ์šฉ์ž ์ง€์ • ์ฃผ์„์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜๋Š” Inspector ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ๋ฌธ์— ๊ด€ํ•ด์„œ๋Š” ์„ ํƒ์ ์œผ๋กœ ํ•œ ์ค„์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ์ฃผ์„์„ ์ •์˜ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์ฝ”๋“œ์—์„œ ๋งค๋ฒˆ ์ž์œ ๋กญ๊ฒŒ ์ •์˜๋˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค์™€ ๊ฐ™์ด ๋‹จ์ผ ์ •์˜๋กœ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ๋งŽ์€ ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด์— (์„ ํƒ์  ๊ตฌ๋ฌธ ๋“ฑ์œผ๋กœ) ์ถ”๊ฐ€ํ•˜์—ฌ ์™„์ „ํ•œ ์ดˆ๋ณด์ž๊ฐ€ ๋›ฐ์–ด๋“ค๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ตฌ๋ฌธ์„ ๋ณด๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<strong i="7">@export</strong> type=String, hint=MULTILINE

"๋งค๊ฐœ๋ณ€์ˆ˜" ์‚ฌ์ด์— ์‰ผํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜„์žฌ ๊ตฌ๋ฌธ๊ณผ ์ข€ ๋” ์ผ๊ด€์„ฑ์ด ์žˆ๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

export (String, MULTILINE) var my_var

์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์€ ์ข€ ๋” ์žฅํ™ฉํ•˜์ง€๋งŒ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„ˆ๋ฌด ์•„ํ”„์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

์•ž์œผ๋กœ ๋” ๋งŽ์€ ๊ตฌ๋ฌธ ๋…ผ์˜๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

์ฃผ์„์€ ๊ตฌ์„ฑ ์ฃผ์ž…์˜ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์„ฑ๊ณผ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ๊นจ๋—ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋” ํŒŒ์ผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@bojidar-bg์˜ ๋Œ“๊ธ€์—์„œ...

์–ด์จŒ๋“  ์ฃผ์„์ด ํ˜„์‹คํ™”๋˜๊ธฐ๊นŒ์ง€๋Š” ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด ๊ตฌํ˜„์„ ์ง€์—ฐ์‹œํ‚ค๋Š” "์ฐจ๋‹จ" ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? GDScript/manpower์— ๋Œ€ํ•œ ์นœ์ˆ™ํ•จ์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ฃผ์„์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํŠน์ • ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ธ€์Ž„์š”, ์ œ ๋Œ“๊ธ€ ์ดํ›„๋กœ ๊ฝค ์‹œ๊ฐ„์ด ํ˜๋ €๋Š”๋ฐ, ์ด๋ฏธ ์ฆ๋ช…๋œ ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

์ฃผ์„ ์ง€์›์„ ์œ„ํ•œ ์ฃผ์š” ์ฐจ๋‹จ๊ธฐ๋Š” ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ฒด๊ณ„์— ๋™์˜ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ๊ตฌํ˜„์ด ๋น„๊ต์  ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@reduz ๋Š” ์ฃผ์„์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ํŽธ์ง‘๊ธฐ ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์˜ ์›๋ž˜ ์ œ์•ˆ์„ ์•„์ฃผ ๋ฌด์˜๋ฏธํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹จ์ผ ํ‚ค์›Œ๋“œ( onready , master , puppet ๋“ฑ)๋ฅผ ๊ต์ฒดํ•  ๋•Œ ์ฃผ์„์ด ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํ•ฉ์˜์— ๋„๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…๋œ ๋Œ€๋กœ ์ด๊ฒƒ์ด GDScript์— ํ™˜์ƒ์ ์ธ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๊ตญํ•œ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ๋งŽ์€ ํ‚ค์›Œ๋“œ๋ฅผ ํ™•์‹คํžˆ ์ถ”์›”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ export ๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ฝ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์žฅ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ดํ•ด์— ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

3๋…„ ๋œ ๋ฌธ์ œ #6204๋ฅผ ์šฐ์•„ํ•œ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="8">@export</strong>
<strong i="9">@export_tooltip</strong> "The name used when displaying this item in the inventory and in shops."
var display_name := ""

๋˜ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ด์ƒ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งŽ์€ ๋…ผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋‚˜๋Š” @willnationsdev์— ๋™์˜ํ•˜๊ณ  ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋กœ ์‹ ํ˜ธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@connect("timeout")
func _on_Timer_timeout():
   ...

@rluders ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Timer ๋…ธ๋“œ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

@Zylann ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. "๋Œ€์ƒ" ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๊ณ  ์ž์ฒด ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Timer ์™ธ๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ:

@connect("timeout", $Timer)
func _on_Timer_timeout():
  ...

๋‚˜๋Š” ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅด์ง€๋งŒ, ํŠนํžˆ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ gds์˜ ์ฃผ์„์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ก์„ ์œ„ํ•ด ์„ธ๋ฏธ์ฝœ๋ก ์ด๋‚˜ ์ค„ ๋ฐ”๊ฟˆ ๋Œ€์‹  '()'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์„์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ž์ฒด ์ฃผ์„ + ์™„์ „ํ•œ ์ฃผ์„ ํ”„๋กœ์„ธ์„œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Zylann ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค. "๋Œ€์ƒ" ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๊ณ  ์ž์ฒด ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Timer ์™ธ๋ถ€์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ:

@connect("timeout", $Timer)
func _on_Timer_timeout():
  ...

๊ทธ๊ฒƒ์€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด ์ง€์›๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋”์šฑ ๊ฐ•๋ ฅํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ๊ตฌํ˜„๋˜๊ธฐ ์ „์— gdscript๋ฅผ ๋ฐฐ์šด ๊ฒƒ์ด ๊ธฐ์˜๋‹ค๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@export_hint(ENUM)
@export_hint_string("Attack,Defense")
export var my_enum : int = 0

์ดˆ๋ณด์ž์ธ ๋‚˜๋ฅผ ์œ„ํ•ด ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋ฒ…์ฐจ๊ณ  ์–ด๋ ค์› ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@sleepcircle ๋ชจ๋“  ๊ฒฝ์šฐ์— GDScript๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ ๋น„๊ผฌ๋Š” ๋ง์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ธ์šฉํ•œ ์ฝ”๋“œ๋Š” ๋‹จ์ง€ ์ œ์•ˆ์ผ ๋ฟ์ด๋ฉฐ _the_ ๋ฏธ๋ž˜ ๊ตฌ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ฏธ์•ˆํ•ด์š”, ๋น„๊ผฌ๋ ค๊ณ  ํ•œ ๊ฑด ์•„๋‹ˆ์—์š”. ๋‚˜๋Š” ๋‹จ์ง€ ๋Œ€๋‹ค์ˆ˜๊ฐ€ ์ด๋Ÿฌํ•œ ์ถ”๊ฐ€๋ฅผ ์Šน์ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ๋“ค์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž ๊ฐ•์‚ฌ๋กœ ๋‚ด $0.02๋ฅผ ๋˜์ง€๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ : ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ธด ์„ค๋ช…์€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ธ์‹ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด 5๋…„ ๋™์•ˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋ฅด์นœ ๊ฒฝํ—˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ฃผ์„๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ด€์šฉ๊ตฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์–ดํฌ๋˜์Šค๋ฅผ ํ”ผ๊ธฐ๋ฐฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด connect ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ๋ถ€์ž‘์šฉ์ด ์žˆ๋Š” ํ•จ์ˆ˜ ๋ฅผ

@ ๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—๋งŒ ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ ์ƒˆ ๊ฐœ๋ฐœ์ž๋Š” @ ๋ณผ ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ ๋…ผ๋ฆฌ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ x ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•˜๊ณ  y ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ด€์šฉ๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด var ์ ‘๋‘์‚ฌ, ์ ‘๋ฏธ์‚ฌ ๋ฐ ๋Œ€์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ "๋ณ€์ˆ˜ ์ˆ˜์ •์ž"๊ฐ€ ์•„๋‹Œ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋‚˜์—ดํ•  ๊ฒƒ์ด์ง€๋งŒ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋‘์‚ฌ: onready , export(...)

    • ์ด๋“ค์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ–‰๋™์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. onready ๋Š” ๋Ÿฐํƒ€์ž„ ๋ณ€์ˆ˜ ๋กœ๋”ฉ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  export ๋Š” ์ผ์ข…์˜ ํŽธ์ง‘๊ธฐ ํžŒํŠธ/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๊ฐ™์€ ์žฅ์†Œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋“ค์˜ ํ–‰๋™์ด ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ๋•Œ ์–ด๋–ป๊ฒŒ๋“  ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

  • ๋Œ€์•ˆ: class_name , extends , signal , enum , const , func

    • ์ด๋Ÿฌํ•œ ๋Œ€์ฒด ํ˜•์‹์€ ๊ดœ์ฐฎ์ง€๋งŒ "enum" ๋ฐ "const"๋ฅผ int ๋˜๋Š” string๊ณผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์€ ์ด์ƒํ•œ ์„ ํƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ์ ‘๋ฏธ์‚ฌ: setget

    • ์ž์ฒด ๋ฒ”์ฃผ์˜ Setget์€ ๊ดœ์ฐฎ์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์„คํƒ• ํ‚ค์›Œ๋“œ์— ๊ฐ€๊น๊ณ  ๋กœ์ง ์ „ํ™˜์ด ๋งŽ์ง€ ์•Š๋‹ค๋Š” ์ ์—์„œ export ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ์ƒ๊ฐ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ

  • ์ค‘๊ฐ„ ์œ„์น˜: var x : int = 5

    • ํŠนํžˆ "enum"๊ณผ "const"๊ฐ€ ๋™์ผํ•œ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด var์— ๋Œ€ํ•œ ๋Œ€์ฒด ํ‚ค์›Œ๋“œ์ธ ๊ฒฝ์šฐ ์ด ์‚ฌ์ด์— ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ํ™•์‹คํžˆ const ๋Š” ๊ฒŒ์ž„ ๋กœ์ง ์ž์ฒด๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๋ผ๊ธฐ๋ณด๋‹ค ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝํ—˜์„ ์ˆ˜์ •ํ•œ๋‹ค๋Š” ์ ์—์„œ setget๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ฃผ์„ ์ถ”๊ฐ€์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์€ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ€๋ฅด์ณ์•ผ ํ•˜๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ฐœ๋…/๊ด€์šฉ๊ตฌ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ, ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ๋กœ์šด ๊ด€์šฉ๊ตฌ๊ฐ€ ์œ ์šฉํ•ด์ง€๋ฉด ์œ ๊ธฐ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์†๋„๋ฅผ ๋†’์ด๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ๊ด€์šฉ๊ตฌ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…ŒํฌํŠธ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • (Tier 1) func, var ๋ฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์กฐ๊ฑด๋ฌธ ๋ฐ ๋ฃจํ”„์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋งŒ ์•Œ๋ฉด ๊ฒŒ์ž„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • (Tier 2) ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹ ํ˜ธ, const, enum๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ์„คํƒ•/๊ธฐ๋Šฅ์„ ๋ฐฐ์šฐ๊ธฐ ์œ„ํ•ด ๊ณ„์† ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • (Tier 3) setget, onready์™€ ๊ฐ™์€ ๋‹จ์ถ•ํ‚ค๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.
  • (Tier 3.1) ๊ฒŒ์ž„์„ ๋ฐ”๊พธ์ง€๋Š” ์•Š์ง€๋งŒ ๋‚ด๋ณด๋‚ด๊ธฐ, ํŽธ์ง‘๊ธฐ ์„ค๋ช…, ๋„๊ตฌ ๋ฐ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์ „์šฉ ์„คํƒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.
  • (Tier 4) ์ˆœ์ „ํžˆ ๋ฌธ์„œํ™” ๋ฐ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

Tier 3-4๊ฐ€ ์ฃผ์„์˜ ์ฃผ์š” ๋Œ€์ƒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ํ•™์ƒ๋“ค์—๊ฒŒ ๋‘ ๊ฐ€์ง€ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ํ”ผ์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ˆœ์ˆ˜ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ: "๋ฌธ์„œํ™” ๋ฐ ํ˜‘์—…์„ ์ง€์›ํ•˜๋ ค๋ฉด ์Šคํฌ๋ฆฝํŠธ์— ์ผ๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ฃผ์„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค."
  • Dev ์†๊ธฐ/์„คํƒ•: "์ฝ”๋“œ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋ ค๋ฉด ์ฃผ์„์„ ์‚ดํŽด๋ณด์„ธ์š”. ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ถ€ ํŽธ์ง‘๊ธฐ ๋„๊ตฌ์™€ ๋‹จ์ถ•ํ‚ค๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ๋ณ€์ˆ˜์™€ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."

๋‚˜๋Š” DEVS ๊ณ ๋„ (Godot)์˜ ์ˆซ์ž๋ฅผ ๊ฐ€๋ฅด์ณค๋‹ค, ๋‚˜๋Š” ์ฃผ์„ ์ ์–ด๋„ ๋“ฑ๊ธ‰ 3 ์˜ต์…˜์„ ์ƒ๊ฐํ•˜๊ณ , ๋Œ€๋ถ€๋ถ„์— ์ฐจ๋ผ๋ฆฌ์ด์—†๋Š” ๊ฒƒ ํ‹ฐ์–ด 4๋Š” ๊ทธ๋“ค์—๊ฒŒ ๋ณด์—ฌ @ ์ด๋ฏธ ๋•Œ๊นŒ์ง€ ๊ธฐํ˜ธ ์ „์ฒด์ ์œผ๋กœ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ฒŒ์ž„์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค ๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๊ณ 

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ "๋ฌธ์„œ๊ฐ€ ํ•„์š”ํ•œ ๋” ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ฃผ์„์„ ๋ฐฐ์šฐ์‹ญ์‹œ์˜ค"๋ผ๊ณ  ๋งํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒŒ์ž„ ๊ธฐ๋Šฅ์— ์ค‘์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋Œ€์ฒด ๊ตฌํ˜„์ด ์žˆ๊ฑฐ๋‚˜ ์ˆœ์ „ํžˆ ๋ฌธ์„œํ™”๋ฅผ ์œ„ํ•œ ๊ฐœ๋ฐœ์ž ์†๊ธฐ ์ „์šฉ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ ์˜๊ฒฌ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ์˜ ํŠน์ • ํฌ์ธํŠธ:

  • ์ˆ˜์ถœ์€ ์–ด๋–ค ๊ฒŒ์ž„์—๋„ ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ถœ์— ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Onready๋Š” ์ดˆ๊ธฐ์— ํŽธ๋ฆฌํ•œ ์ง€๋ฆ„๊ธธ์ด์ง€๋งŒ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๊ฐ€ _ready ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ณ  ์ฃผ์„์ด ์ค‘์ฒฉ๋  ๊ฐ€๋Šฅ์„ฑ์€ onready ์“ฐ๋Š” ํšŸ์ˆ˜๊ฐ€ ํ›จ์”ฌ ์ ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • setget์€ ์ด๋ฏธ ๋„ˆ๋ฌด ์ด์ƒํ•œ ๊ตฌ๋ฌธ์ด๋ฉฐ ์ด๋ฏธ ์œ ์ผํ•œ ์ ‘๋ฏธ์‚ฌ๋กœ ์ž์ฒด ๊ด€์šฉ๊ตฌ์ž…๋‹ˆ๋‹ค. ์™„์ „ํžˆ ๊ฑฐ๊ธฐ์—์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Connect: ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ด€์šฉ๊ตฌ์—๋Š” ์ด๋ฏธ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ž์Šต์„œ/์ƒ˜ํ”Œ ์ฝ”๋“œ ๊ณต๊ฐ„์ด ํ˜ผ๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ ์ฃผ์„์„ ์ž‘์„ฑํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด๊ฒƒ์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚˜์„ ๊ฒƒ์ด๋ฏ€๋กœ ๋น„๊ณต๊ฐœ ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ณต๊ฐœ ๊ณต๊ฐ„์„ ํ†ตํ•ฉํ•˜์ง€ ์•Š๋Š” ์ฃผ์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•: ์œ ํ˜•์€ ํ˜„์žฌ ์ผ๋ถ€ ์œ ํ˜• ์ˆ˜์ •์ž๊ฐ€ ๋Œ€์•ˆ์ด๊ณ  ์ผ๋ถ€ ์œ ํ˜• ์ˆ˜์ •์ž๊ฐ€ ์ค‘๊ฐ„์— ์žˆ๋Š” ์ด์ƒํ•œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด @type(const int) @type(enum) , ๋ชจ๋‘ ๊ฐœ๋ฐœ์ž ์ง€ํ–ฅ ์„คํƒ•์œผ๋กœ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ํฐ ๊ธฐ์—ฌ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ฃผ์„ ์•„๋ž˜์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์Œ์‹์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋“ค์ด ์–ด๋””์— ๋งž๋Š”์ง€ ์ •ํ™•ํžˆ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ธธ์ด์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ํ•ญ์ƒ ์•ฝ๊ฐ„ ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹ซ์–ดํ•œ๋‹ค.
๋ชจ๋“  ํ•„๋“œ, ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋งŽ์€ ์ฃผ์„์„ ๊ฐ–๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋” ๋งŽ์€ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์‹ถ๋‹ค

์‚ฌ๋žŒ๋“ค์ด ์ˆ˜๋งŽ์€ ํ‚ค์›Œ๋“œ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ ์ค‘ ์ผ๋ถ€๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

export MyClass : Node2D # export replaces class_name, : replaces extends 

signal mySignal #signal is kept

group(MyHeader, "res://icon.png" )
export var my_property : Array(int) setget _set_my_property, _get_my_property # : replaces export type

var test = 0 # no need for onready. variables declared outside of _ready automatically try to be onready vars

#others are kept

๋‚˜๋Š” ์›๋ž˜ ์ œ์•ˆ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์œ„์˜ ์˜๊ฒฌ์— ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ ์žฅ์ ์ด ๋‹จ์ ๋ณด๋‹ค ํ›จ์”ฌ ํฝ๋‹ˆ๋‹ค.

@Shadowblitz16 ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์—ฌ๊ธฐ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ด๋Ÿฌํ•œ ์ œ์•ˆ ์ค‘ ๋งŽ์€ ๋ถ€๋ถ„์ด ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค...

export MyClass : Node2D # export replaces class_name, : replaces extends

export , class_name , : ๋ฐ extends ๊ฐ๊ฐ์€ 4๊ฐœ์˜ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์™€ ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋‹ค๋ฅธ ๊ฒƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์ „ํ™˜ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  • export ๋Š” ํŽธ์ง‘๊ธฐ GUI๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด Inspector๋กœ ์ „์†ก๋˜๋Š” ์ƒ์„ฑ๋œ PropertyInfo ๊ฐœ์ฒด๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • class_name ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ScriptServer์— ์ „์—ญ ํด๋ž˜์Šค๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ ์œ ํ˜• ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ๊ตฌ๋ฌธ ๋ถ„์„ ์‹œ๊ฐ„์— ์Šคํฌ๋ฆฝํŠธ์˜ ์ „์—ญ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ GDScript์˜ "์ •์  ์œ ํ˜• ์ง€์ •"์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.
  • : ๋Š” ์„ ํƒ์  ์œ ํ˜• ํžŒํŠธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด GDScript๋ฅผ ํ•ญ์ƒ ์ •์ ์œผ๋กœ ์ž…๋ ฅํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒด ์œ ํ˜• ํžŒํŠธ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๋Š” ํ•œ ์ฝœ๋ก  ํ† ํฐ์˜ ์šฉ๋„๋ฅผ ๋ณ€๊ฒฝํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
  • extends ๋Š” ์ƒ์†๋œ ํด๋ž˜์Šค์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์•Œ๋‹ค์‹œํ”ผ). ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ตฌ๋ฌธ์ด๋ฉฐ ๋ชจ๋“  ๋ฌธ์„œ์™€ ์ž์Šต์„œ๋Š” ์ด๋ฏธ ์ด ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์—์„œ ๋ฒ—์–ด๋‚˜ ์ˆœ์ „ํžˆ ๋ฏธ์šฉ์ƒ์˜ ์ด์œ ๋กœ ๋” ๋งŽ์€ ์ž‘์—…์„ ๋งŒ๋“ค๋ ค๋Š” ๊ฐ•๋ ฅํ•œ ๋™๊ธฐ๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
group(MyHeader, "res://icon.png")

์ด๊ฒƒ์ด ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ๋‚˜์—๊ฒŒ๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๋…ธ๋“œ๊ฐ€ "MyHeader" ๊ทธ๋ฃน์— ์ถ”๊ฐ€๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ด๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ). ๊ทธ๋Ÿฌ๋‚˜ ์•„์ด์ฝ˜์€ ๋ฌด์—‡์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ๊ทธ๋ฃน์—๋Š” ์—ฐ๊ฒฐ๋œ ์•„์ด์ฝ˜์ด ์—†์Šต๋‹ˆ๋‹ค.

export var my_property : Array(int) setget _set_my_property, _get_my_property # : replaces export type

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ’์˜ ์œ ํ˜•์ด๋‚˜ ์ดˆ๊ธฐํ™”๊ฐ€ ์œ ์—ฐํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์  GDScript์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

onready export(NodePath) var the_node = get_node(the_node)
var test = 0 # no need for onready. variables declared outside of _ready automatically try to be onready vars

์ค€๋น„ ์•Œ๋ฆผ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” Node ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ Object ํด๋ž˜์Šค์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์†์„ฑ์€ ๊ตฌ์„ฑ ์ค‘์— ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. Node ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ๋„๋‹ฌํ•˜๋”๋ผ๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. _ready() ์•Œ๋ฆผ์€ ์ธ์Šคํ„ด์Šคํ™” ํ›„ ํ›จ์”ฌ ๋‚˜์ค‘์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”์˜ ๊ธฐ๋ณธ ํƒ€์ด๋ฐ์ด ๊ฐ์ฒด์™€ ๋…ธ๋“œ ์‚ฌ์ด์— ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๊ทน๋„๋กœ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  Godot๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ๋งŽ์€ ํ–‰๋™์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‚˜๋Š” ๋‹น์‹ ์˜ ์ œ์•ˆ์„ ๋ฌด์‹œํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ •๋‹น์„ฑ์„ ๋ณด์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

@willnationsdev ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.
์ฃผ์„๊ณผ ์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๊ณ  ํ•„๋“œ๋‹น ์ˆ˜์‹ญ ๊ฐœ์˜ ์ฃผ์„์„ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: C#์„ ์ด๋ ‡๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ์†์„ฑ์œผ๋กœ ๊ธฐ๋กํ•ด ๋‘์‹ญ์‹œ์˜ค.
[Attribute1(), Attribute2()]
๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ค„ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„ ์ถ”์•…ํ•ฉ๋‹ˆ๋‹ค.

@Shadowblitz16 ์šฐ๋ฆฌ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ์ผ์„ ํ•˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋ถ„๋ช…ํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ๊ทธ ๋ชฉํ‘œ์— ๋ฐ˜๋Œ€๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Calinou ์‚ฌ๋žŒ๋“ค์ด ํƒ€ํ˜‘ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด gdscript๋Š” ๊ทธ๋Œ€๋กœ ๋‘์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
1 - ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.
2 - ๋” ํฐ ํŒŒ์ผ๊ณผ ๋œ ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
3 - ์‚ฌ๋žŒ๋“ค์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์œผ๋กœ ๊ฐ•์ œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
4 - ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค.

1 - ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.
2 - ๋” ํฐ ํŒŒ์ผ๊ณผ ๋œ ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
3 - ์‚ฌ๋žŒ๋“ค์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์œผ๋กœ ๊ฐ•์ œ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
4 - ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜์ง€ ์•Š๋Š” ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•ฉ๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ์•„์ฃผ ๋‚˜์œ ์ฃผ์žฅ๋“ค์ด๋‹ค. ์ด 4๊ฐœ ์ค‘ 3๊ฐœ๋Š” API์˜ ํฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋‚ด์žฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์€ ํ•œ๋™์•ˆ ์ด์ „ ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•จ์œผ๋กœ์จ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ  ํฌํ•จ).

_ํŽธ์ง‘: ์ž๋™ ๋ณ€ํ™˜ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค._

2๋ฒˆ ํ•ญ๋ชฉ์˜ ๊ฒฝ์šฐ ์ฃผ์„์ด ํŒŒ์ผ์— ๋” ๋งŽ์€ ํ–‰์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ชจ๋‘๊ฐ€ ๋™์˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ฃผ์„์ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@groud ์ด๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์— ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
1 - ์™œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋น„์ถ”์ฒœํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
2 - ํ•„๋“œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด 5์ค„ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

  • ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ์ง‘๊ธฐ์— ๋Œ€ํ•œ ๊ณต๊ฐœ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.
  • onready๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์˜ var ์„ ์–ธ์ž…๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ์ฃผ์„์œผ๋กœ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉค๋ฒ„ ์ •์˜๋Š” ๋‚ด๊ฐ€ ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์ด๋ฉฐ ์ด ๊ฒฝ์šฐ ์ ‘์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@groud ์ด๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ๊ฒƒ์— ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œํ™”, ๋‚ด์„ฑ, ๋” ๋ณต์žกํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋“ฑ... ํ‚ค์›Œ๋“œ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์—†๋Š” ์ฃผ์„์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1 - ์™œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋น„์ถ”์ฒœํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฐ ์ผ์„ ํ•˜๋Š” ๋ฐ์—๋Š” ์ถฉ๋ถ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๊นจ๋—ํ•œ API, ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ ๋“ฑ์„ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋ฐœ์ „ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ ๋ฒ„์ „์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ™•์‹คํžˆ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2 - ํ•„๋“œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด 5์ค„ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

๊ณผ์žฅํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ œ์•ˆ์„ ๋…ผ์˜ํ•˜๋Š” ๋ชฉ์ ์€ ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋˜‘๋˜‘ํ•œ ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. IMHO, ๋‚ด๋ณด๋‚ด๊ธฐ ํžŒํŠธ๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ ์ฃผ์„์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‚ด ์ƒ๊ฐ์— ๋ช…๋ช…๋œ ์ธ์ˆ˜ ์‹œ์Šคํ…œ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด). ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์‹œ์Šคํ…œ์€ ์ด์ „๋ณด๋‹ค ํ›จ์”ฌ ์ ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•„๋“œ์™€ ๋™์ผํ•œ ์ค„์— ์ฃผ์„์ด ์žˆ๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ์ง‘๊ธฐ์— ๋Œ€ํ•œ ๊ณต๊ฐœ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.
onready๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์˜ var ์„ ์–ธ์ž…๋‹ˆ๋‹ค.
๋‘˜ ๋‹ค ์ฃผ์„์œผ๋กœ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์„์˜ ์šฉ๋„์— ๋Œ€ํ•ด ์„ ์ž…๊ฒฌ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ฃผ์„ ์‹œ์Šคํ…œ์— ์™„๋ฒฝํ•˜๊ฒŒ ๋“ค์–ด๋งž๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ๊ฐ ์ƒํ™ฉ์€ ์ผ€์ด์Šค ๋ฐ”์ด ์ผ€์ด์Šค๋กœ ๋…ผ์˜๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” "lines" ์ธ์ˆ˜๊ฐ€ ํŠนํžˆ ์ข‹๋‹ค๊ณ  ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์„์ด ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๋ช…๋ น๋ฌธ(๋˜๋Š” "์ ‘๋‘์‚ฌ" ํ˜•์‹)์„ ์ง์ ‘ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ; ๋ฅผ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="7">@onready</strong> var my_sprite = $Sprite
@onready; var my_sprite = $Sprite


@export_hint_string("Attack,Defense")
@export_hint(ENUM) export var my_enum : int = 0

@export_hint_string("Attack,Defense")
@export_hint(ENUM); export var my_enum : int = 0


<strong i="8">@export_hint_string</strong> "Attack,Defense";
<strong i="9">@export_hint</strong> ENUM export var my_enum : int = 0

<strong i="10">@export_hint_string</strong> "Attack,Defense"
<strong i="11">@export_hint</strong> ENUM; export var my_enum : int = 0


<strong i="12">@export</strong> type=String hint=MULTILINE; var my_text = ""

# more options

@export(type = String, hint = MULTILINE) var my_text = ""
@export(type = String, hint = MULTILINE); var my_text = ""

@export(String, hint = MULTILINE) var my_text = ""

# I personally prefer this one (positional and named args supported, default/optional args too)
@export(String, MULTILINE) var my_text = ""
@export(String, hint = MULTILINE) var my_text = ""
@export(type = String, hint = MULTILINE) var my_text = ""
@export(int, ENUM, "Attack,Defense") var my_enum:= 0

ํŽธ์ง‘: ์•„, ๋„ˆ๋ฌด ๋Š๋ ธ์Šต๋‹ˆ๋‹ค. @groud๋Š” ์ด๋ฏธ lines ์ธ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธ€์Ž„, ์ ์–ด๋„ ๊ทธ ๋ช‡ ๊ฐ€์ง€ ์ฝ”๋“œ ์˜ˆ์ œ๋Š” ์ด ์Šค๋ ˆ๋“œ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ @๊ฐ€ ๋ชป์ƒ๊ฒผ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

ํŽธ์ง‘ํ•˜๋‹ค:
๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉค๋ฒ„ ์„ ์–ธ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”?
๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

<strong i="10">@description</strong> "Adds two numbers and returns the result."
<strong i="11">@parameter</strong> name=num1 type=float description="The first number"
<strong i="12">@parameter</strong> name=num2 type=float description="The second number"
<strong i="13">@returns</strong> type=float description="num1 and num2 added together"
func add(num1, num2):
    return num1 + num2

@description ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ func ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„๊นŒ์ง€ ์ถ•์†Œ๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

๋‚˜๋Š” ์ฃผ์„์ด ์œ ํ˜•์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด). ๋ฌธ์„œ ์ฃผ์„์„ ์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ•์ œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

func add(num1: float, num2: float) -> float: return num1 + num2

์ด ํ˜ผ๋ž€์€ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ์‹ค์ œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ ํžŒํŠธ๊ฐ€ ์žˆ๋Š” ์ด์ƒ์ ์ด์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๋†€๋ž๊ฒŒ๋„ ๋‚ด๋ณด๋‚ด๊ธฐ ํžŒํŠธ๊ฐ€ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ์ œ๋„ค๋ฆญ ์œ ํ˜•์ด ์—†๋‹ค๋Š” ๋ฌธ์ œ).

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ @๊ฐ€ ๋ชป์ƒ๊ฒผ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉค๋ฒ„ ์„ ์–ธ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”?
๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋”์ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ด ๋ชฉ์ ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์„์ด ์•„๋‹Œ ์ฃผ์„์„ ์ œ๊ณตํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์•ˆ๋œ ๊ฒƒ๊ณผ ๋™๋“ฑํ•˜๊ฑฐ๋‚˜ ๋” ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. C ์–ธ์–ด ๊ณ„์—ด(๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ์–ธ์–ด)์—์„œ @ ๋Š” ์ฃผ์„์— ๋Œ€ํ•ด ๋งค์šฐ ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค(์˜ˆ: Java, JavaScript, TypeScript, Scala ๋ฐ ๋‚ด๊ฐ€ ์ฝ์€ Python์—์„œ๋„ ์ฐธ์กฐ).

TypeScript(๋ฌธ์„œ์˜ ์œ ํ˜•์€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋„๊ตฌ๋Š” ์‹ค์ œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค):

/** Adds two numbers and returns the result.
 * <strong i="16">@param</strong> num1 {float} The first number
 * <strong i="17">@param</strong> num2 {float} The second number
 * <strong i="18">@return</strong> {float} num1 and num2 added together
  **/
const add = (num1: number, num2: number): number => num1 + num2;

๊ธฐ๋Šฅ์ ์ธ ํ’๋ฏธ:

@description("Adds two numbers and returns the result.")
@parameter(num1, "The first number", type=float)
@parameter(num2, "The second number", type=float)
@returns("num1 and num2 added together", type=float)
func add(num1: float, num2: float) -> float:
    return num1 + num2

์ค‘๋ณต ์œ ํ˜• ์—†์ด:

@description("Adds two numbers and returns the result.")
@parameter(num1, "The first number")
@parameter(num2, "The second number")
@returns("num1 and num2 added together")
func add(num1: float, num2: float) -> float:
    return num1 + num2

๋ถ€๋ชจ ์—†๋Š” ๋ง›:

<strong i="28">@description</strong> "Adds two numbers and returns the result."
<strong i="29">@parameter</strong> num1 "The first number"
<strong i="30">@parameter</strong> num2 "The second number"
<strong i="31">@returns</strong> "num1 and num2 added together"
func add(num1: float, num2: float) -> float:
    return num1 + num2

๋‚˜๋Š” ์ด ๊ตฌ๋ฌธ์ด ๋ฌธ์„œ ์ฃผ์„์— ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ๊ฐ€ ์•„๋‹Œ ์ฃผ์„์˜ ๊ฒฝ์šฐ func์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œํ™” ๋ชฉ์ ์œผ๋กœ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ์˜ˆ์ œ์—์„œ ์ฃผ์„ ์ด๋ฆ„์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. @parameter ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ์™€ ๊ฐ™์ด ๋‹จ์ˆœํžˆ @param ์ˆ˜ ์žˆ๊ณ  @description ๋Š” @desc , @descr ๋˜๋Š” @func .

GodoDoc ์—์„œ TypeScript(JSDoc ๋ฐ Javadoc์— ๊ธฐ๋ฐ˜ํ•œ TypeDoc) ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ œ ์ƒ๊ฐ์—๋Š” ๊ฝค ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

## Same as [[bool_]], but `on_false`/`on_true` are functions.
## Only selected function will be called and its return value will be returned from `bool_lazy`.
## <strong i="44">@typeparam</strong> T {any} Return type
## <strong i="45">@param</strong> cond {bool} Condition
## <strong i="46">@param</strong> on_false {FuncLike<T>} Function to call and return its result when `cond` is `false`
## <strong i="47">@param</strong> on_true {FuncLike<T>} Function to call and return its result when `cond` is `true`
## <strong i="48">@return</strong> {T}
func bool_lazy_(cond: bool, on_false, on_true): return GGI.bool_lazy_(cond, on_false, on_true)
var bool_lazy = funcref(self, "bool_lazy_")

@description ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„๋ถ€ํ„ฐ func์˜ ์‹œ์ž‘ ๋ถ€๋ถ„๊นŒ์ง€ ์ถ•์†Œ๋  ์ˆ˜ ์—†๋‹ค๋ฉด

์˜ˆ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๊ธฐ ๋ฐ ๊ธฐ๋ณธ ์ ‘๊ธฐ์— ๋Œ€ํ•œ ์˜ต์…˜์€ ํŽธ์ง‘๊ธฐ์— ์ข‹์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋ธ”๋ก ์œ ํ˜•์— ๋”ฐ๋ผ ์ ‘๊ธฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด๋ถ€ ํด๋ž˜์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ‘ํžˆ๋Š” ์„ค์ •์—์„œ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Œ).

๋‚˜๋Š” ์ฃผ์„์„ ์•ž์ด๋‚˜ ์œ„์— ๋‘๋Š” ๊ธฐ๋Šฅ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. @annotation(a, b) ๊ฐ€ ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€๊ด„ํ˜ธ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. export ์™€ onready ๊ฐ€ ์†์„ฑ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ž์— ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋ฉด ์˜ค๋Š˜์˜ ํ‚ค์›Œ๋“œ์™€ ๊ฐ™์€ ์“ฐ๊ธฐ ์†๋„๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ๋ฒ• ๋ฉด์—์„œ ๋‚˜๋Š” ๋ฌธ์„œํ™”๋„ ์‹ซ์–ดํ•œ๋‹ค. ๋‚˜๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ฃผ์„(๊ฐ„์ ‘์ ์ผ์ง€๋ผ๋„)์— ์ต์ˆ™ํ•˜์ง€๋งŒ ๋ฌธ์„œ๋Š” ์ฃผ์„๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์„ ์œ„ํ•ด ์–‘์„ ์„ธ ๋ฐฐ๋กœ ๋Š˜๋ฆฌ๊ณ  ๋ชจ๋“  ๊ณณ์— ํ‘œ์‹œ๋˜๊ณ  ๊ธฐ๋Šฅ์  ์ฃผ์„๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค... ๋ญ”๊ฐ€ ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์œ ๋น„์ฟผํ„ฐ์Šค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ €๋Š” C#์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฃผ์„ ์‚ฌ์šฉ๋ฒ•์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉค๋ฒ„ ์œ„์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ฃผ์„์ด ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์˜ˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ชจ๋“  ์‚ฌ๋žŒ์ด 5์ค„์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค) . ๋…ผ์Ÿ์ด ์Šคํฌ๋ฆฝํŠธ ๋ฌธ์„œ๋ฅผ ์ง€์ •ํ•˜๋Š” API๊ฐ€ ์—†๋Š” Godot์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด, ๊ทธ๊ฒƒ์€ ๋ฌธ์ œ์ด๋ฉฐ ์ฃผ์„ IMO๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ•์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ „์ฒด ๊ทœ๋ชจ์˜ ๋ฌธ์„œํ™”์—๋Š” ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. (๊ฒŒ๋‹ค๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋Š” GDScript์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ _get_property_list ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.)

๋‚˜๋Š” Zylann์˜ ๋ง์— ์ „์ ์œผ๋กœ ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ํ‚ค์›Œ๋“œ์™€ ๊ฐ™์€ ๋‚ด๋ณด๋‚ด๊ธฐ(๋˜๋Š” ์ค€๋น„ ์™„๋ฃŒ)์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

# No parenthesis when there are no parameters
<strong i="6">@export</strong> var myvar
# With parenthesis for parameters
@export(ENUM, "Up,Down,Left,Right") var myvar2
# Being able to write the annoation on the line before
@export(ENUM, "Up,Down,Left,Right") 
var myvar2

๋ฌธ์„œ ๋ถ€๋ถ„๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ตฌ๋ฌธ์„ ํ›จ์”ฌ ๋” ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค( @mnn ์˜ ์˜ˆ๋ฅผ

<strong i="11">@description</strong> "Adds two numbers and returns the result."
<strong i="12">@parameter</strong> "The first number" # No need to name the args if they are ordered
<strong i="13">@parameter</strong> "The second number"
<strong i="14">@returns</strong> "num1 and num2 added together"
func add(num1: float, num2: float) -> float:
    return num1 + num2

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜ ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. json, XML ๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์—์„œ ๋‚ด๊ฐ€ ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋‚ด ๋ฌธ์„œ๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ฌธ์„œ์šฉ์œผ๋กœ ๋งŽ์€ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๊ฐ€์‹œ๋ฉฐ ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ์„ฑ ๋งํฌ: godotengine/godot-proposals#177

ํŒŒํ‹ฐ์— ๊ฝค ๋Šฆ์—ˆ์ง€๋งŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋ฆฌํ”Œ๋ ‰์…˜์— ํฌ๊ฒŒ ์˜์กดํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ €๋Š” ์ฃผ์„์ด Godot์—์„œ ์ผ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ์ค€๋น„๋œ ํ•ญ๋ชฉ๊ณผ ๊ฐ™์€ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ๋” ์•„๋ฆ„๋‹ต๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚ด ์ฃผ์š” ์ฃผ์žฅ์€ ์ฃผ์„์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

onready ํ‚ค์›Œ๋“œ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ์— ๋Œ€ํ•ด.

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ดˆ๊ธฐ์— ๋…ธ๋“œ ์ฐธ์กฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด onready ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. _ready ์ข…์†์ ์ธ ์ผ๋ถ€ ์žฅ๋ฉด์„ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ null ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฌธ์ œ์— ๊ฑธ๋ ค ๋„˜์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฅ๊ธฐ์ ์œผ๋กœ ๋ฌธ์ œ ์—†์ด๋Š” ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

func explode():
    var bomb = preload("res://explosion.tscn").instance()
    # Oops, forgot to `add_child(bomb)` earlier
    bomb.fuse.wait_time = 5.0 # ERROR: fuse is `null`
    add_child(bomb)
    # ... because `fuse` is a $Timer node 
    # which is only initialized once added to the scene tree.

๋ฌผ๋ก  fuse ์„ค์ •์„ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ์ธ์Šคํ„ด์Šคํ™”๋œ ์žฅ๋ฉด์„ add_child() ํ•ด์•ผ ํ•˜์ง€๋งŒ ์žฅ๋ฉด์ด ์žฅ๋ฉด ํŠธ๋ฆฌ์— ์ถ”๊ฐ€ ๋˜๊ธฐ ์ „์— ๋‹ค๋ฅธ ๋…ธ๋“œ/์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ •ํ™•ํ•œ ํ“จ์ฆˆ ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ?

์–ผ๋งˆ ํ›„ https://github.com/godotengine/godot/issues/33620#issuecomment -559999681์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด onready ๋Š” ๋‹จ์ง€ NOTIFICATION_READY ์ธ ๋ฐ˜๋ฉด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ NOTIFICATION_INSTANCED ์ด์—ˆ๊ณ  ๋‚ด ์ฐธ์กฐ๋ฅผ ๋” ์ผ์ฐ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” oninstanced ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ฌด์Šจ ๋ง์„ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

๋”ฐ๋ผ์„œ onready ํ‚ค์›Œ๋“œ๋ฅผ ์ฃผ์„์œผ๋กœ ๋ฆฌ๋ฉ”์ดํฌํ•˜๋Š” ๋™์‹œ์— ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๋ฅผ ๋ถ€ํ’€๋ฆฌ์ง€ ์•Š๊ณ  @oninstanced ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ผ๋ถ€ ์‚ฌ๋ก€(์˜ˆ: ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ์ด!)๋„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. , ์ดˆ๊ธฐํ™”์™€ ๊ด€๋ จ๋œ ๊ธฐํƒ€ ์•Œ๋ฆผ ์ง€์› ์ถ”๊ฐ€( _init , _enter_tree ๋“ฑ).

๊ด€๋ จ ์ œ์•ˆ: godotengine/godot-proposals#260.

๋” ๊ตฌ์ฒด์ ์ธ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ œ์•ˆ์„œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/godotengine/godot-proposals/issues/828

์œ„์˜ ์ œ์•ˆ์œผ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰