(ํธ์งํ๋ค:
์ถ๊ฐ XY ๋ฌธ์ ๋ฌธ์ ๋ฅผ ์ต์ํํ๋ ค๋ฉด:
์ฌ๊ธฐ์์ ํด๊ฒฐ๋ ๋ฌธ์ ๋ Godot์ Node-Scene ์์คํ
/ ์คํฌ๋ฆฝํ
์ธ์ด๊ฐ 1) ๋ฃจํธ ๋
ธ๋์ ๊ธฐ๋ฅ์ ๊ณ ์ ํ๊ณ 2) ๊ต์ฒด ๋ฐ/๋๋ ๊ฒฐํฉํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ทธ๋ฃนํ๋ ๊ตฌํ ์์ฑ์ ์์ง ์ง์ํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ ์ ๋ฉ์๋๊ฐ ์๋ ์คํฌ๋ฆฝํธ ๋๋ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ํ์ ๋
ธ๋๊ฐ ํ์ ๋นํธ์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ Godot๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฃจํธ ๋
ธ๋์ ์ ์ฅ๋ ์ฌ์ ์ ์ฒด ๋์์ ๋ํ ๋ก์ง์ ์ ์งํ๋ ๊ฒ์ ์ ํธํ๋ ๋ฐ๋ฉด ํ์ ๋
ธ๋์์ ๊ณ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํฌ๊ฒ ๋ฒ์ด๋ ํ์ ์์
์ ๊ทธ๋ค์๊ฒ ์์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด KinematicBody2D๋ ์ ๋๋ฉ์ด์
์ ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก AnimationPlayer์ ์์ํฉ๋๋ค.
๋์์ ๊ตฌ๋ํ๊ธฐ ์ํด "๊ตฌ์ฑ์์" ์์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ ๋ ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ฐ๋ ๊ฒ์ ์๋์ ์ผ๋ก ์ฝํ ์์คํ ์ ๋๋ค. ๋ชจ๋ ๋์์ ์์ ๋ ธ๋์ ์์ํ๋ ๊ฑฐ์ ๋น์ด ์๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ๊ฐ๋ ๊ฒ์ ์ด ํจ๋ฌ๋ค์์ ๋ฐ๋๋ฉ๋๋ค. ์์ ๋ ธ๋๋ ์์ฒด์ ์ผ๋ก ์์ ์ ์ํํ๋ ์๊ธ์์กฑ ๊ฐ์ฒด๊ฐ ์๋๋ผ ๋ฃจํธ ๋ ธ๋์ ๋์ ํ์ฅ์ด ๋ฉ๋๋ค. ๋งค์ฐ ํฌ๋ฐํ๊ณ ๋ฃจํธ ๋ ธ๋์ ๋ชจ๋ ๋ ผ๋ฆฌ๋ฅผ ํตํฉํ ์ ์๋๋ก ํ์ฌ ์ค๊ณ๋ฅผ ๋จ์ํ/๊ฐ์ ํ ์ ์์ง๋ง ๋ ผ๋ฆฌ๋ฅผ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ค๋ฅธ ์ฒญํฌ๋ก ๋๋ ์๋ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ์ฃผ์ ๋ GDScript์ ๊ดํ ๊ฒ๋ณด๋ค ์์ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง GDScript ํน์ฑ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ง์ ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
)
์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ ํน์ฑ์ ๋ณธ์ง์ ์ผ๋ก ๋ ๊ฐ์ ํด๋์ค๋ฅผ ํ๋๋ก ํผํฉํ๋ ๋ฐฉ๋ฒ(๊ฑฐ์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ๋ฉ์ปค๋์ฆ)์ ๋๋ค. ๋ง ๊ทธ๋๋ก ํ์ผ์ ํ ์คํธ๋ฅผ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ๋์ ํค์๋ ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ํ์ผ์ ์ฐ๊ฒฐํฉ๋๋ค. (ํธ์ง: ํธ๋ฆญ์ ์คํฌ๋ฆฝํธ๊ฐ ํ๋์ ํด๋์ค๋ง ์์ํ ์ ์์ง๋ง ์ฌ๋ฌ ํน์ฑ์ ํฌํจํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค)
๋๋ ์ด๋ค GDScript ํ์ผ๋ ๋ค๋ฅธ GDScript ํ์ผ์ ๋ํ ํน์ฑ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ๊ฒ์ ์์ํ๊ณ ์์ต๋๋ค. ๋จ, ํน์ฑํ๋ ์ ํ์ด ๋ณํฉ๋ ์คํฌ๋ฆฝํธ์ ์ํด ์์๋ ํด๋์ค๋ฅผ ํ์ฅํ๋ ํ, ์ฆ Sprite ํ์ฅ GDScript๋ ๋ฆฌ์์ค GDScript๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํน์ฑ์ด์ง๋ง Node2D GDScript๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์์ํ ์ ์์ต๋๋ค.
# move_right_trait.gd
extends Node2D
class_name MoveRightTrait # not necessary, but just for clarity
func move_right():
position.x += 1
# my_sprite.gd
extends Sprite
is MoveRightTrait # maybe add a 'use' or 'trait' keyword for this instead?
is "res://move_right_trait.gd" # alternative if class_name isn't used
func _physics_process():
move_right() # MoveRightTrait's content has been merged into this script
if MoveRightTrait in self:
print("I have a MoveRightTrait")
์ด ์์ ์ ์ํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ ์ฌ๋๋ค์ ํน์ฑ GDScript์ ์ด๋ฆ์ด ์๊ธฐ๋ฅผ ์ํ ์ ์์ง๋ง ํด๋น GDScript์ class_name์ด CreateDialog์ ํ์๋๋ ๊ฒ์ ์ํ์ง ์์ ์ ์์ต๋๋ค(์์ฒด์ ์ผ๋ก ์์ฑ๋์ง ์๊ธฐ ๋๋ฌธ์). ์ด ๊ฒฝ์ฐ, ์ด๋ค ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๊ฒ์ ์ง์ํ๋๋ก ํ๋ ๊ฒ์ ์ค์ ๋ก ์ข์ ์๊ฐ์ด ์๋ ์ ์์ต๋๋ค. ํน๋ณํ ํ์๋ ๊ฒ๋ค๋ง (์๋ง๋ ํ์ผ ๋งจ ์์ 'ํน์ฑ'์ ์จ์?). ์ด์จ๋ ์๊ฐํด๋ณผ ๋ฌธ์ .
์๊ฐ?
ํธ์ง: ์ฝ๊ฐ์ ์๊ณ ๋์ 1) ์คํฌ๋ฆฝํธ ์ธ๊ทธ๋จผํธ๊ฐ ์ด๋ค ์คํฌ๋ฆฝํธ์์ ์๋์ง (๋ ๋์ ์ค๋ฅ ๋ณด๊ณ ๋ฅผ ์ํด) 2) ์ดํ ๋ฐ์ํ ์ค๋ฅ๋ฅผ ์๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ ์ต์ 2๊ฐ ํจ์ฌ ๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํฌํจ๋ ์คํฌ๋ฆฝํธ๋ ๋ง์ง๋ง์ ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ฒ์ด ์๋๋ผ ์์๋๋ก ๊ตฌ๋ฌธ ๋ถ์ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ตฌ๋ฌธ ๋ถ์ ํ๋ก์ธ์ค์ ์ถ๊ฐ๋๋ ์ฒ๋ฆฌ ์๊ฐ์ด ์ค์ด๋ญ๋๋ค.
extends "res://move_right_trait.gd"
๋์ ์ด๋ค ์ด์ ์ด ์์ต๋๊น?
@MrJustreborn ํ ํด๋์ค์ ์ฌ๋ฌ ํน์ฑ์ ๊ฐ์ง ์ ์์ง๋ง ํ๋์ ์คํฌ๋ฆฝํธ๋ง ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก C#์ด " ์ธํฐํ์ด์ค "๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด์ง๋ง ๋น์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๊น? ํ๋ก๊ทธ๋๋จธ์๊ฒ ์น์ํ ํน์ฑ ๋์ ๊ธฐ๋ฅ ์ธํฐํ์ด์ค๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๋ค.
@aaronfranke Traits ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Mixins ์ ๋์ผํ๋ฉฐ ๋ฉ์๋ ๊ตฌํ์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค์ ์์ ํ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ต๋๋ค. ์ธํฐํ์ด์ค๊ฐ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ๋ค๋ฉด ์ค์ ๋ก ๋ ์ด์ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒ์ ๋๋ค.
Traits/Mixins๋ PHP, Ruby, D, Rust, Haxe, Scala ๋ฐ ๊ธฐํ ์ฌ๋ฌ ์ธ์ด (๋งํฌ๋ Wiki์ ์์ธํ ์ค๋ช ๋์ด ์์)์ ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํ ๊ด๋ฒ์ํ ๋ ํผํ ๋ฆฌ๋ฅผ ๊ฐ์ง ์ฌ๋๋ค์๊ฒ ์ด๋ฏธ ๋๋ฆฌ ์น์ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด(ํนํ ์ ํ์ ์ ์ ํ์ดํ์ด ์ค๋ ๊ฒฝ์ฐ์) ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ฌ์ค์ ํจ์ ์๋ช ์ ์ง์ ํ๊ณ ๊ด๋ จ GDScript ์คํฌ๋ฆฝํธ๊ฐ ํน์ฑ์ ์ฌ์ฉํ์ฌ ํด๋น ํจ์ ์๋ช ์ ๊ตฌํํ๋๋ก ์๊ตฌํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค. ํฌํจ๋ฉ๋๋ค(ํด๋น ์์ ๊น์ง ์กด์ฌํ๋ ๊ฒฝ์ฐ).
includes
์ ๊ฐ์ ํค์๋?
extends Node2D
includes TraitClass
ํน์ฑ, mixin, has ๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ด๋ฆ๋ ํ์คํ ๊ด์ฐฎ์ต๋๋ค.
์ถ๊ฐ ๋ฉ๋ด์์ class_name ์ ํ์ ์ ์ธํ ์ ์๋ ์ต์ ์ด ์๋ค๋ ์์ด๋์ด๋ ๋ง์์ ๋ญ๋๋ค. ์์ฒด์ ์ผ๋ก ๋ ธ๋๋ก ์๋ํ์ง ์๋ ์์ ์ ํ์ผ๋ก ์ธํด ๋งค์ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
๊ทธ ์์ฒด๋ก ํ๋์ ๊ธฐ๋ฅ ์ฃผ์ ์ผ ์๋ ์์ต๋๋ค.
(์ค์๋ก ๋ด ๋๊ธ์ ์ญ์ ํ์ต๋๋ค, ์์ค! ๋ํ "์ฌ๋ฌ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ์ง ์๋ ์ด์ ๋ ๋จ์ผํ๋ฉ๋๋ค." )
์ด๊ฒ์ด VisualScript์์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
๋ํ ํน์ฑ์ด ๊ตฌํ๋ ๊ฒฝ์ฐ ํน์ฑ์ ๋ํ ์ธ์คํํฐ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ต๋๊น? ํน์ฑ์ ๋ํ ์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก์๋ ํน์ฑ๋ง ์๊ณ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํฌํจ๋ ์ ์๋ค๊ณ ์์ํฉ๋๋ค(์ ์ด๋ ํน์ฑ ํ์ผ์ ํฌํจํ๋ ์คํฌ๋ฆฝํธ ์ธ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์์). ํ์ง๋ง ๊ณฐ๊ณฐ์ด ์๊ฐํด๋ณด๋ฉด ํธ๋ ์ดํธ ํ์ผ์ด ํฌํจ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ๊ทธ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๋ฐ ๋ค์ธ ๋ ธ๋ ฅ์ด ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@LikeLakers2
์ด๊ฒ์ด VisualScript์์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น?
๋ด๊ฐ ์ ์ํ ๋ฐฉ์์ผ๋ก ์ํ๋๋ฉด VisualScript์์๋ ์ ํ ๋ฐ์ํ์ง ์์ต๋๋ค. GDScript ์ ์ฉ. VisualScript์ ๋ํด ๊ตฌํ๋ ํน์ฑ ์์คํ ์ VisualScript๊ฐ ๊ตฌ๋ฌธ ๋ถ์๋ ์ธ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์์ ํ ๋ค๋ฅด๊ฒ ์ค๊ณ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฅ์ฑ์ ์ ํ ๋ฐฐ์ ํ์ง ์์ต๋๋ค(๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํจ). ๋ํ VisualScript ์์ ์ง์์ ๋จผ์ ๊ณ ๋ คํด์ผ ํ ๊น์? ใ ใ ใ
๋ํ ํน์ฑ์ด ๊ตฌํ๋ ๊ฒฝ์ฐ ํน์ฑ์ ๋ํ ์ธ์คํํฐ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ต๋๊น?
๋ณ ์๋ฏธ๊ฐ ์์ ๊ฒ์ ๋๋ค. ํน์ฑ์ ํน์ฑ, ์์, ์ ํธ ๋ฐ ํน์ฑ์ ์ํด ์ ์๋ ๋ฉ์๋๋ฅผ ์ ๋ฌํ์ฌ GDScript์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ ๋ฌํฉ๋๋ค.
ํน์ฑ์ ๋ํ ์ผ๋ถ ์ฌ์ฉ ์ฌ๋ก์๋ ํน์ฑ๋ง ์๊ณ ์คํฌ๋ฆฝํธ๊ฐ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํฌํจ๋ ์ ์๋ค๊ณ ์์ํฉ๋๋ค(์ ์ด๋ ํน์ฑ ํ์ผ์ ํฌํจํ๋ ์คํฌ๋ฆฝํธ ์ธ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์์).
๋ค๋ฅธ ์ธ์ด๋ก ํ์๋๋ ํน์ฑ์ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง ์ฌ์ฉํ๋ ค๋ฉด ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ํฌํจ ๋์ด์ผ ํฉ๋๋ค .
๊ทธ๋ฌํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ๋ค์ธ ๋ ธ๋ ฅ์ด ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด๋ค ์์ผ๋ก๋ Inspector ์ธํฐํ์ด์ค๋ฅผ ๋ง๋๋ ๊ฒ์ GDScript ๋จ๋
์ผ๋ก๋ ๊ทธ๋ค์ง ์๋ฏธ๊ฐ ์์ต๋๋ค. ํน์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ค๋ฉด ์คํฌ๋ฆฝํธ ๋ฆฌ์์ค์ source_code
์์ฑ์ ์์ค ์ฝ๋๋ฅผ ์ง์ ํธ์งํด์ผ ํฉ๋๋ค. ์ฆ, ์คํฌ๋ฆฝํธ ์์ฒด์ ์์ฑ์ด ์๋๋๋ค. ๋ฐ๋ผ์ ์ด๋ ์ชฝ์ด๋ ...
๊ทธ๋ฌํ ๊ธฐ๋ฅ์ด ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด๊ฒ์ด ์ง๊ธ ํ ์ ์๋ ๊ฒ์ ํ์ฉํฉ๋๊น? ์๋๋ฉด ์ผ๋ถ ์์ ์ ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
๊ฑฐ์ ์ฌ์ฉ๋์ง ์๋ ๋ณต์กํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค GDscript๋ฅผ ๋จ์ํ ์ธ์ด๋ก ์ ์งํ๊ณ ์ถ์ต๋๋ค.
๊ทธ๊ฒ์ ์ด ์ฌ๋์ด ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์๋ Child-Nodes-As-Script-Dependencies ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง MultiScript๊ฐ ๋จ์ผ ์ธ์ด๋ก ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ข ๋ฅ์ ์ํ๋ฌผ ๊ณผ ํจ๊ป ์ ๊ณต๋์ง ์์ต๋๋ค. GDScript ๋ชจ๋์ ํน์ฑ์ด ์๋ก ๋ฐ ๊ธฐ๋ณธ ์คํฌ๋ฆฝํธ์ ์ด๋ป๊ฒ ๊ด๋ จ๋๋์ง์ ๋ํ ๋ ผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ ์ ์์ง๋ง ๋ค๋ฅธ ์ธ์ด ๊ฐ์ ์ฐจ์ด์ ์ ํด๊ฒฐํ๋ ๊ฒ์ ํจ์ฌ ๋ ๋ณต์กํฉ๋๋ค.
๋ค์ค ๊ฐ์ ธ์ค๊ธฐ/๋ค์ค ์์์ด ์๊ธฐ ๋๋ฌธ์ ์คํฌ๋ฆฝํธ ์ข ์์ฑ์ ์์ ๋ ธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ฝ๋๋ฅผ ๋ง์ด ๋ฐ๋ณตํ์ง ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ฉฐ ์ด๋ ํ์คํ ๋ฌธ์ ๋ฅผ ์ข์ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
@groud @Zireael07 ๋ด ๋ง์, ๋ ๊ธ์ง์ ์ธ ๊ต์ฐจ ์ธ์ด ์ ๊ทผ ๋ฐฉ์์ 1) ScriptStack์ ์ฌ์ฉํ์ฌ ๋์ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋จ์ผ ์คํฌ๋ฆฝํธ ํํ์ผ๋ก ๋ณํฉํ๋๋ก Object๋ฅผ ์์ ํ ์ฌ์ค๊ณํ๊ณ , 2) MultiScript๋ฅผ ๋ค์ ๋์ ํ๊ณ ์๋์ผ๋ก ๋ณํํ๋ ํธ์ง๊ธฐ ์ง์์ ๋ง๋๋ ๊ฒ์ ๋๋ค. ๋ฉํฐ์คํฌ๋ฆฝํธ์ ์คํฌ๋ฆฝํธ ์ถ๊ฐ(๋๋ ๋จ์์ฑ์ ์ํด ๋ชจ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฉํฐ์คํฌ๋ฆฝํธ๋ก ์์ ํ ๋ง๋๋ ๊ฒ, ์ด ๊ฒฝ์ฐ MultiScript์ ๊ตฌํ์ ๋ณธ์ง์ ์ผ๋ก ScriptStack์ด ๋จ), ๋๋ 3) ๋ณํฉํ ์ ์๋ Object ์ ํ์ ๋ํ ์ผ์ข ์ ๊ต์ฐจ ์ธ์ด ํน์ฑ ์์คํ ๊ตฌํ ์ฐธ์กฐ ํ์ฅ ์คํฌ๋ฆฝํธ๋ ํน์ฑ์ผ๋ก, ์ผ๋ฐ์ ์ธ ์คํฌ๋ฆฝํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ด์ฉ์ ํตํฉํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ต์ ์ ์์ง์ ํจ์ฌ ๋ ์นจ์ต์ ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ ๊ฐ๋จํด์ง๋๋ค.
๋๋ ํน์ฑ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ฅ ํ์ํ ๊ฒ์ ๋น ๋ฅธ ์์ง ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ์ ๋๋ค. ๋ด ๋ง์ ๋๋ถ๋ถ์ IDE์์ ํ๋ฌ๊ทธ์ธ ์คํ์ผ๊ณผ ๊ฐ์ด ์ dll ์ ๋ ํ์ผ์ ์ถ๊ฐํ๊ณ ์์ง์ด ์๋์ผ๋ก ํตํฉ๋๋ ๊ฒ์ฒ๋ผ ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ์์ง์ ๋ณด๋ค ์ ์ฐํ๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๋ ๋ป์ ๋๋ค. ์๋ฅผ ๋ค์ด websocket์ด ์๋ํ๋ ๋ฐ ์ ๋ง ์ ์คํ ํ์ํฉ๋๋ค. 3.1์ด ๋ฆด๋ฆฌ์ค๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ต๋๋ค. 3.1์ ํ์ฌ ๋๋ฌด ๋ง์ ๋ฒ๊ทธ๋ก ์ธํด ๊นจ์ก์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ ํด๋์ค๋ ์์์ .dll ๋๋ ์ผ๋ถ ๊ฒฝ๋ก์ .so์์ GDScript์ ์๋ ์ฃผ์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด C++์์ ์ผ๋ง๋ ๋ง์ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์๋์ง ๋ชจ๋ฅด์ง๋ง ์ด๊ฒ์ด ๋๋ฌด ์ด๋ ต์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค ๐
@fian46 ๊ธ์์, ๋๊ตฐ๊ฐ ์น ์์ผ์ ๋ค์ด๋ก๋ ๊ฐ๋ฅํ GDNative ํ๋ฌ๊ทธ์ธ์ผ๋ก ๊ตฌํํ๋ค๋ฉด ์, ๋น์ ์ด ์ค๋ช ํ ๊ฒ์ ์ํฌํ๋ก์ผ ๊ฒ์ ๋๋ค. ๋์ ๊ทธ๋ค์ ๋ฐ๋๋ผ ์์ง์์ ์ฌ์ฉํ ์ ์๋ ํตํฉ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ฌ๋๋ค์ด ๊ทธ๋ฐ ์์ผ๋ก ๊ธฐ๋ฅ์ ๋ง๋๋ ๊ฒ์ ๋ง์ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ผ๋ฏ๋ก ๊ทํ์ ์์ ์ ์ด ๋ฌธ์ ์ ์ฃผ์ ์ ์ ํ ๊ด๋ จ์ด ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. GDNative๊ฐ ์กด์ฌํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค ๐๐๐. ํน์ฑ์ ํ๋ฅญํ์ง๋ง ๊ฐ์ง ํน์ฑ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ธ์คํด์คํํ๊ณ ๋์ค์ ๊ธฐ๋ณธ ์คํฌ๋ฆฝํธ์ฒ๋ผ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๊น?
Godot ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ฆ ์๋ ํด๋์ค๋ผ๋ฉด, "my_sprite.gd"์ "move_right_trait.gd"๋ฅผ ์ธ์คํด์คํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๋ฌธ์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค๋ฉด ์ ๋ฌด์ง์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
Rust ๋๋ (์ธํฐํ์ด์ค) C++์ ๊ฐ์ ๋ณด๋ค ๊ฐ๋ ฅํ ํ์์ ์ธ์ด์์ ํน์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ํ์ง๋ง ๋ํน ํ์์ ์ธ์ด์์๋ ์ฝ๊ฐ ๋ถํ์ํ์ง ์์ต๋๊น? ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ๋ง ํ๋ฉด ์ ํ ๊ฐ์ ๊ท ์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค. GDScript๊ฐ ์ธํฐํ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ ํธ๋ ์ดํธ ์์คํ ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ๋์์ด ๋๋์ง์ ๋ํ ์ ํํ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ํ์ ์ด ์์ง ์์ต๋๋ค.
๋ํ preload("Some-other-behavior.gd")๋ฅผ ์ฌ์ฉํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ์ ์ฅํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๊น?
@fian46 @DriNeo ๋ค, ๊ทธ๋ ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๊ณ ์คํฌ๋ฆฝํธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ ํด๊ฒฐ๋์ง๋ง ๋ฌธ์ ๋ ๊ทธ ์ด์์ผ๋ก ํ์ฅ๋ฉ๋๋ค.
@TheYokai
๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์ ํ ๊ฐ์ ๊ท ์ผํ ์ธํฐํ์ด์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ๋น์ ์ด ์ณ์๋ ๊ท ์ผํ ์ธํฐํ์ด์ค๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ด ์๋๋ผ ๋ ํ์ดํ์ด ์ ํด๊ฒฐ๋๋ ๊ฒ์ด ์๋๋ผ ๊ด๋ จ ๊ตฌํ์ ๊ทธ๋ฃน์ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑ(๊ฒฐํฉ/๊ต์ฒด)ํ๋ ๊ฒ์ ๋๋ค.
3.1์์๋ ์คํฌ๋ฆฝํธ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฐธ์กฐ ์คํฌ๋ฆฝํธ(๋๋ ์ค์ ๋ก ๋ชจ๋ ์ ํ)์์ ์ ์ ํจ์๋ฅผ ์ ์ํ ๋ค์ ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์์คํ์ด์ค๋ก ์ฌ์ฉํ์ฌ GDScript์์ ํด๋น ํจ์์ ์ ์ญ์ ์ผ๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค.
extends Reference
class_name Game
static func print_text(p_text):
print(p_text)
# can even add inner classes for sub-namespaces
extends Node
func _ready():
Game.print_text("Hello World!")
๊ทธ๋ฌ๋ ๋น์ ์ ์ฝํ ์ธ , ํนํ ๋ ธ๋๋ณ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์ฝํ ์ธ ์ ๊ฒฝ์ฐ ๋ ผ๋ฆฌ๋ฅผ ๋๋๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋กญ์ต๋๋ค.
์๋ฅผ ๋ค์ด, KinematicBody2D๊ฐ ์๊ณ "์ ํ" ๋์๊ณผ "์คํ" ๋์์ ๊ฐ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น? ์ด๋ฌํ ๊ฐ ๋์์ KinematicBody2D์ ์
๋ ฅ ์ฒ๋ฆฌ ๋ฐ move_and_slide
๊ธฐ๋ฅ์ ์ก์ธ์คํด์ผ ํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ๊ฐ ๋์์ ๊ตฌํ์ ๋
๋ฆฝ์ ์ผ๋ก ๊ต์ฒดํ๊ณ ๊ฐ ๋์์ ๋ํ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณ๋์ ์คํฌ๋ฆฝํธ์ ๋ณด๊ดํ ์ ์์ต๋๋ค.
ํ์ฌ ๋ด๊ฐ ์ต์ํ ๋ชจ๋ ์ํฌํ๋ก๊ฐ ์ต์ ์ด ์๋๋๋ค.
move_and_slide
๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ด์ํ "๊ตฌ์ฑ ์์" Node2D ๋
ธ๋๊ฐ ์๋ค๋ ์๋ฏธ์
๋๋ค.์ด์ ์ต์ 3์ด ํ์ฌ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ํฌํ๋ก์ด๋ฉฐ 3.1์์ GDScript์ ๋ํ ํธ๋ฆฌํ ์ ์ ์ ๋ ฅ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ๋๋ถ๋ถ ํด๊ฒฐํ ์ ์์์ ์ธ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Godot์ ๋ ธ๋-์ฌ ์์คํ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฐํ๋ ์์คํ ์์ ํน์ ์์ ์ ์ํํ๋ ๋ ธ๋ ๋๋ ์ฅ๋ฉด์ ์์ฑํ๋ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ์ฅ๋ฉด ๋ด์์ ํด๋น ๋ ธ๋/์ฅ๋ฉด์ ์ธ์คํด์คํํ๊ณ ์์ ์ฅ๋ฉด์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ๋๋ก ํ ์ ์์ต๋๋ค(์: Area2D ๋ฐ CollisionShape2D ๊ด๊ณ์ ๊ฒฝ์ฐ).
๊ทธ๋ฌ๋ ๋ฐ๋๋ผ ์์ง์ ์ฌ์ฉ ๋ฐ ์ผ๋ฐ์ ์ธ ๋ชจ๋ฒ ์ฌ๋ก ๊ถ์ฅ ์ฌํญ์ ์ฅ๋ฉด์ ๋์ ์ ๋ฃจํธ ๋ ธ๋ ๋ฐ/๋๋ ํด๋น ์คํฌ๋ฆฝํธ์ ๊ณ ์ ๋ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ๋ฃจํธ์๊ฒ ๋ฌด์์ ํด์ผ ํ๋์ง ์๋ ค์ฃผ๋ "๋์ ๊ตฌ์ฑ ์์" ๋ ธ๋๋ ๊ฑฐ์ ์์ต๋๋ค(์์ ๋ ๋งค์ฐ ํฌ๋ฐํ๊ฒ ๋๊ปด์ง๋๋ค). AnimationPlayer/Tween ๋ ธ๋๋ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ๋ ผ์์ ์ฌ์ง๊ฐ ์๋ ์์ธ์ด์ง๋ง ํด๋น ์์ ์กฐ์ฐจ๋ ๋ฃจํธ์ ์ํด ์ง์๋ฉ๋๋ค(์ด๋ ์ผ์์ ์ผ๋ก ์ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ํฉ๋๋ค). (ํธ์ง: ์ด ๊ฒฝ์ฐ์๋ ์ ๋๋ฉ์ด์ ๋ฐ ํธ์๋ ์ KinematicBody2D์ ์์ ์ด ์๋๋ฏ ๋ก ์ด๋ฌํ ์์ ์ ์์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌ๋ฆฌ๊ธฐ ๋ฐ ์ ํ์ ๊ฐ์ ์์ง์ ์ ์ฑ ์์ ๋๋ค) ํ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ๊ณ ์์ฐ์ค๋ฝ์ต๋๋ค. ๋ ธ๋ ๊ฐ์ ๊ด๊ณ๋ฅผ ์๊ฒฉํ๊ฒ ๋ฐ์ดํฐ ์ /๋์ ๋ค์ด์ผ๋ก ์ ์งํ๊ณ ์ฝ๋๋ฅผ ์์ฒด ์คํฌ๋ฆฝํธ ํ์ผ๋ก ๋ ๊ฒฉ๋ฆฌํ๋๋ก ์ ์งํ๋ฏ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํ ํน์ฑ ๊ตฌํ.
์ด, ์์ ์ '์ธํฐํ์ด์ค/ํน์ฑ ๊ตฌํ'์ผ๋ก ํ์ํ๋ ๊ฒ๋ * is *
ํ
์คํธ๋ฅผ ์ํํด์ผ ํ๋๋ฐ, ์ด๋ ๋ฌด์ธ๊ฐ์ ๊ธฐ๋ฅ์ ํ
์คํธํ๋ ๋ฐ ํธ๋ฆฌํฉ๋๋ค.
@OvermindDL1 ์ ๋ง์ ๊ทธ๋ฐ ํ
์คํธ๋ฅผ ํ๋ ์๋ฅผ ๋ค์์ง๋ง ์์๊ณผ ํน์ฑ ์ฌ์ฉ์ ๊ตฌ๋ถํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ๋์ in
๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ฌ๊ธฐ์์ XY ๋ฌธ์ ์ ๋น ์ง ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ ์ด ์ฃผ์ ๋ฅผ ์ด๋ค ์์ผ๋ก๋ ๋ค๋ฃจ์๊ณ ์ ์์๋ฅผ ์ ์ถํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ 2๊ฐ์ ๋ค๋ฅธ ๋ฌธ์ (#23052, #15996)์์ ๋ฐฉ๊ธ ๋์์ง๋ง ๋ชจ๋ ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํ์ง๋ ์์์ต๋๋ค.
@groud ์ด ์๋ฃจ์ ์ #19486์ ๋ํด ์ ๊ธฐ๋ ๋ฌธ์ ์ค ํ๋๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
@willnationsdev ์ข์ ์์ด๋์ด, ๊ธฐ๋๋ฉ๋๋ค!
๋ด ์ ํ๋ ์ค๋ช
์์ ์ด ํน์ฑ ์์คํ
์ด ๋ฌ์ฑํ๊ณ ์ ํ๋ ๊ฒ์ ์ด ๋น๋์ค์ ํ์๋ ์ํฌํ๋ก์ ์ ์ฌํ ๊ฒ์ ํ์ฑํํ๋ ๊ฒ์
๋๋ค. https://www.youtube.com/watch?v=raQ3iHhE_Kk
(์ฌ์ฉ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ ํ์๋ _workflow_์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ ๊ณ ๋ คํ์ญ์์ค.)
๋น๋์ค์์๋ ์ฅ์ ๊ณผ ๋จ์ ์ด ์๋ ๋ค๋ฅธ ์ข ๋ฅ์ ์ํฌํ๋ก์ ๋น๊ตํฉ๋๋ค.
์ ์ด๋ ๋ด๊ฐ ์๋ ํ ์ด๋ฌํ ์ข ๋ฅ์ ์ํฌํ๋ก๋ ์์์ด ์๋ํ๋ ๋ฐฉ์ ๋๋ฌธ์ ํ์ฌ GDScript์์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
@AfterRebelion ๊ทธ๊ฐ ์ฝ๋๋ฒ ์ด์ค์ ๋ชจ๋์ฑ, ํธ์ง ๊ฐ๋ฅ์ฑ, ๋๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ(๋ฐ ํด๋น ์์ฑ์ ๊ด๋ จ ์ธ๋ถ ์ ๋ณด)์ ๋ถ๋ฆฌํ๋ ๋น๋์ค์ ์ฒ์ ๋ช ๋ถ ์ ์ค์ ๋ก ์ด ๊ธฐ๋ฅ์ ์ถ๊ตฌํ๋ ๊ฒ์ ๋๋ค.
์ ์ด๋ ๋ด๊ฐ ์๋ ํ ์ด๋ฌํ ์ข ๋ฅ์ ์ํฌํ๋ก๋ ์์์ด ์๋ํ๋ ๋ฐฉ์ ๋๋ฌธ์ ํ์ฌ GDScript์์๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
Godot๋ ๋ ธ๋ ๊ณ์ธต ๊ตฌ์กฐ์ ๋์์ธ ์ฌ๊ณผ ๊ด๋ จํ์ฌ ์ค์ ๋ก ์ด๊ฒ์ ์์ฃผ ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ ์ฌ์ค์ด ์๋๋๋ค. ์ฅ๋ฉด์ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋์์ด๋ฉฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ์ง ์๊ณ ํธ์ง๊ธฐ์์ ์ง์ ์์ฑ์ ๋ด๋ณด๋ผ ์ ์์ผ๋ฉฐ(์ฌ์ง์ด ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ง๋ค๊ธฐ๋ ํฉ๋๋ค) ์ฅ๋ฉด์ด ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ๊ฒฉ๋ฆฌ๋ ์ํ์์ ํ ์คํธ/๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
์ด๋ ค์์ ๋ ผ๋ฆฌ๊ฐ ๋ฃจํธ ๋ ธ๋์ ์์๋ ๊ธฐ๋ฅ์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์์ ๋ ธ๋์ ์์์์ฑ๋๋ ๋ ผ๋ฆฌ๋ฅผ ๋ฃจํธ ๋ ธ๋์์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ์๋ฌธ์ ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ถ๋ชจ๊ฐ ์ฌ์ฉํ๋ ๋์ ์๋ ๊ฐ ์์ ์ ์ผ์ ์ ๊ฒฝ์ ์ฐ๊ฒ ํ๊ธฐ๋ณด๋ค ๋ถ๋ชจ์๊ฒ ๋ฌด์์ ํด์ผ ํ๋์ง ๋งํ๊ธฐ ์์ํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
GameObject์๋ ์ฌ์ฉ์๊ฐ ํ์ฉํ ์ ์๋ ์ค์ ์์์ด ์๊ธฐ ๋๋ฌธ์ Unity์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. Unreal์์๋ Actor์ ๋ํด ์ ์ฌํ ๋ ธ๋/์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ด๋ถ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ(?) ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
์, ์ฌ๊ธฐ์ ์ ์ Devil 's Advocate๋ฅผ ํ๋ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. Unreal์์ ์ด๋ฌํ ์์คํ ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋๊ณ ์ด๋ ์ ์๊ฒ ์ด์ ๋ํ ์๋ก์ด ๊ด์ ์ ์ ๊ณตํ์ต๋๋ค. ์ด๊ฒ์ด ์ข์ ์๊ฐ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ ์ฌ๋๋ค์๊ฒ ์ฃ์กํฉ๋๋ค / ๊ทธ๊ฒ์ ๋ํด ํฅ๋ถํ์ต๋๋ค:
ํน์ฑ ์์คํ ์ ๋์ ํ๋ฉด ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋๋ ์ธ์ด์ธ GDScript์ ๋ณต์ก์ฑ ๊ณ์ธต์ด ์ถ๊ฐ๋ฉ๋๋ค.
๊ฒ๋ค๊ฐ, ํน์ฑ์ผ๋ก์์ ํน์ฑ์ ๋ณ์, ์์, ์ ํธ, ๋ฉ์๋, ์ฌ์ง์ด ํ์ ํด๋์ค ๊ฐ ์ค์ ๋ก ์ด๋์์ ์๋์ง ๋ถ๋ฆฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ ธ๋์ ์คํฌ๋ฆฝํธ์ ๊ฐ์๊ธฐ 12๊ฐ์ ๋ค๋ฅธ ํน์ฑ์ด ์๋ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒ์ด ์ด๋์์ ์ค๋์ง ๋ฐ๋์ ์ ํ์๋ ์์ต๋๋ค. ๋ฌด์ธ๊ฐ์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ณด์ด๋ฉด ์ฝ๋๋ฒ ์ด์ค์์ ์ฌ๋ฌผ์ด ์ด๋์ ์๋์ง ์๊ธฐ ์ํด 12๊ฐ์ ๋ค๋ฅธ ํ์ผ์ ์ดํด๋ด์ผ ํฉ๋๋ค.
์ฃผ์ด์ง ๋ฌธ์ ๋ ์ฝ๋ ๊ธฐ๋ฐ์์ ํ๊ท 2~3๊ฐ์ ๋ค๋ฅธ ์์น๋ฅผ ์ ํํด์ผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ค์ ๋ก ์ธ์ด๋ก์์ GDScript ์ ๋๋ฒ๊น ๊ฐ๋ฅ์ฑ์ ์ ํ์ํต๋๋ค. ์ด๋ฌํ ์์น ์ค ํ๋๋ผ๋ ์ฐพ๊ธฐ ์ด๋ ค์ด ์ด์ ๋ ๊ทธ๋ค์ด ํ๋์ ์คํฌ๋ฆฝํธ์ ์๋ค๊ณ ๋งํ์ง๋ง ์ค์ ๋ก๋ ๋ค๋ฅธ ๊ณณ์ ์์ผ๋ฉฐ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋ฐ์ดํฐ/๋ ผ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ช ํํ๊ฒ ๋ํ๋ด์ง ์์ผ๋ฉด 2 ๋๋ 3์ ๋๋ค. ๋จ๊ณ๋ ์์์ ํฌ๊ณ ์คํธ๋ ์ค๊ฐ ๋ง์ ๋จ๊ณ ์ธํธ๋ก ๊ณฑํด์ง๊ณ ์์ต๋๋ค.
ํ๋ก์ ํธ์ ๊ท๋ชจ์ ๋ฒ์๊ฐ ์ฆ๊ฐํ๋ฉด ์ด๋ฌํ ๋ถ์ ์ ์ธ ์ํฅ์ด ๋์ฑ ํ๋๋๊ณ ํน์ฑ์ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ํ์ง์ด ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌด์์ ํ ์ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ์์ "์ปดํฌ๋ํธ ๋ก์ง" ๋ ธ๋๊ฐ ์ฌ ๋ฃจํธ์ ๋ฌด์์ ํด์ผ ํ๋์ง ์๋ ค์ฃผ๋ ๊ฒ์ ์ํ์ง ์์ง๋ง, ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์์ด๋ ์ ์ฒด ์คํฌ๋ฆฝํธ ๋ณ๊ฒฝ์ ์์กดํ ์๋ ์์ต๋๋ค.
์ด ์ํฉ ์์ ๋น ECS ์์ง์ ๋ฌด์์ ํ ๊น์? ๊ตฌ์ฑ์ด ์ฌ์ ํ ๋ต์ด์ง๋ง ์ด ๊ฒฝ์ฐ ์ ์ฒด ๋
ธ๋๋ ์์ ๊ถ ๊ณ์ธต ๊ตฌ์กฐ์ ์ญํ์ ํ์ฅ/๋ณต์กํ๊ฒ ๋ง๋ค ๋ ๋นํฉ๋ฆฌ์ ์
๋๋ค. ๋์ , ๊ตฌ์ฒด์ ์ธ ํ๋ ๊ตฌํ์ ์ถ์ํํ๋ ๋น๋
ธ๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ ์ํ ์ ์์ง๋ง ์ด ๊ฐ์ฒด๋ ๋ชจ๋ ์ฌ์ ํ ๋ฃจํธ ๋
ธ๋๊ฐ ์์ ํฉ๋๋ค. ์ด๊ฒ์ Reference
์คํฌ๋ฆฝํธ๋ก ์ํํ ์ ์์ต๋๋ค.
# root.gd
extends KinematicBody2D
export(Script) var jump_impl_script = null setget set_jump_impl_script
var jump_impl
func set_jump_impl_script(p_script):
jump_impl = p_script.new() if p_script else null
export(Script) var move_impl_script = null setget set_move_impl_script
var move_impl
func set_move_impl_script(p_script):
move_impl = p_script.new() if p_script else null
func _physics_process():
# use logic involving these...
move_impl.move(...)
jump_impl.jump(...)
๋ด๋ณด๋ด๊ธฐ๊ฐ ์๋ก์ด Resource ์ธ์คํด์ค์ ๋ํด ํ ์ ์๋ ๊ฒ์ฒ๋ผ ํน์ ์ ํ์ ํ์ํ๋ ํด๋์ค์ ๋ํ ์ด๊ฑฐํ์ผ๋ก Inspector์์ ํธ์งํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค๋ฉด ์ ๋ง ์ข์์ ๊ฒ์ ๋๋ค. ์ง๊ธ ํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฆฌ์์ค ์คํฌ๋ฆฝํธ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์์ ํ ๋ค์ ๊ตฌํ ์คํฌ๋ฆฝํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ํ์ฅํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค(๋ค๋ฅธ ์ด์ ์์ด). ๊ทธ๋ฌ๋ ๊ตฌํ ์์ฒด์ Inspector์์ ์ ์ํ ์ ์๋ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ฆฌ์์ค๋ฅผ ํ์ฅํ๋ ๊ฒ์ด ์ข์ต๋๋ค. :-)
์ด์ ์ด๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๊ฒ์ ์ค๋ํซ ์์คํ ์ด๋ ๋งคํฌ๋ก ์์คํ ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฌ์ฉ๋๋ ์ ์ธ์ ์ฝ๋ ์น์ ์ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ด์จ๋ , ๋ค, ์ ๋ ํน์ฑ ์์คํ ๊ณผ ๋ฌธ์ ํด๊ฒฐ์ ๋ํ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์์ ๋์ ๋๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ค๊ณ ์๊ฐํฉ๋๋ค. XY ๋ฌธ์ ๋ฌธ์ ๋ง ๋ง์ธ! /์์ค
ํธ์งํ๋ค:
๋ฐ๋ผ์ ์ ์์ ์ ์ํฌํ๋ก์๋ ๊ตฌํ ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ํ ๋ค์ ๋ฐํ์์ ์คํฌ๋ฆฝํธ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ์ ์ํ๋ ์์ ์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌํ ์์ฒด์ Inspector์์ ์ ์ ์ผ๋ก ์ค์ ํ๋ ค๋ ๋งค๊ฐ๋ณ์๊ฐ ํ์ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ค์์ ๋์ ๋ฆฌ์์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ฒ์ ์ ๋๋ค.
# root.gd
extends KinematicBody2D
# if you use a Resource script AND had a way of specifying that the assigned Resource
# must extend that script, then the editor would automatically assign an instance of
# that resource script to the var. No separate instancing or setter necessary.
export(Resource) var jump_impl = null # set jump duration, max height, tween easing via Inspector
export(Resource) var move_impl = null # similarly customize movement from Inspector
# can then create different Resources as different implementations. Because they are resources,
# one can edit them even outside of a scene!
func _physics_process():
move_impl.move(...)
jump_impl.jump(...)
๊ด๋ จ: #22660
@AfterRebelion
์ฌ์ฉ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ ํ์๋ ์ํฌํ๋ก์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ ๊ณ ๋ คํ์ญ์์ค.
์์ด๋ฌ๋ํ๊ฒ๋ ๋น์ ์ด ์ด๊ฒ์ ๋ช ํํ ํ๊ณ ๋ด๊ฐ ์ต์ ์ ์ํฌํ๋ก์ ๋์ํ ๋ค์ ๋๊ธ์ ๋ท๋ถ๋ถ์ ๋์ํ์ง ์์ ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋น๋์ค์์ "์ฌ์ฉ๋ ๊ธฐ๋ฅ"์ด ์ค์ ๋ก ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ด์์ ์ธ ๋ฐฉ๋ฒ์ธ์ง ๋งํจ์ผ๋ก์จ ํ์ ์กฐ์น๋ฅผ ์ทจํฉ๋๋ค. ์ด์จ๋ Godot์ ์ด ๋ฌธ์ . ใ .
# root.gd extends KinematicBody2D export(Script) var jump_impl_script = null setget set_jump_impl_script var jump_impl func set_jump_impl_script(p_script): jump_impl = p_script.new() if p_script else null ...
์, ์์ถ์ด ์ด๋ ๊ฒ ๊ฐ๋ ฅํ์ง ๋ชฐ๋์ต๋๋ค. ํ๋ฆฌ๋ฏธํฐ๋ธ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์๋ง ์ํธ ์์ฉํ ์ ์์ ๊ฒ์ผ๋ก ์์ํ์ต๋๋ค.
์ด๊ฒ์ ๋์ ์ด์ ์๊ฒฌ์ ๋ฌดํจ๋ก ๋ง๋ญ๋๋ค.
๋ง์ํ์ ๋๋ก ๊ตฌํ์ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ด๋ค ์ข
๋ฅ์ ๋งคํฌ๋ก๊ฐ ๊ตฌํ๋๋ค๋ฉด MultiScript ์์ด๋ ํด๋น ์ํฌํ๋ก๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์
๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ Unity๋งํผ ๋ค์ฌ๋ค๋ฅํ์ง๋ ์์ง๋ง ์ฌ์ ํ ์ข์ ์ต์
์
๋๋ค.
@AfterRebelion
๋ง์ํ์ ๋๋ก ๊ตฌํ์ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด ์ด๋ค ์ข ๋ฅ์ ๋งคํฌ๋ก๊ฐ ๊ตฌํ๋๋ค๋ฉด MultiScript ์์ด๋ ํด๋น ์ํฌํ๋ก๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๋ ๊ฒ์ ๋๋ค.
๊ธ์์, ๊ฐ์ ๋๊ธ์์ ์ธ๊ธํ Resource
๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์๊ณผ #22660์ ๋ ๋์ ํธ์ง๊ธฐ ์ง์์ ๊ฒฐํฉํ๋ฉด Unity๊ฐ ํ ์ ์๋ ๊ฒ๊ณผ ๋น์ทํ ํ์ง์ ๋ง๋ค ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ๋ชจ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ Unity๋งํผ ๋ค์ฌ๋ค๋ฅํ์ง๋ ์์ง๋ง ์ฌ์ ํ ์ข์ ์ต์ ์ ๋๋ค.
๊ธ์, ๊ทธ๋ค์ด 3.2์์ ๋ฐฐ์ด ์ ํ ํํธ๋ฅผ ์์ ํ๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฅํ๊ณ ์์ ์ ๊ฒ์ ํจ๊ณผ์ ์ผ๋ก ์ถ๊ฐํด์ผ ํ๋ ํ์ผ ๊ฒฝ๋ก์ ๋ํด ๋ด๋ณด๋ธ ๋ฐฐ์ด์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ EditorInspectorPlugin
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋ฆฌ์์ค ๋๋ ๋
ธ๋์ ๋ํ Inspector์ ์ฌ์ฉ์ ์ ์ ์ฝํ
์ธ ๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ 3.1์ ํ๋ฌ๊ทธ์ธ์ ํตํด ์ํํ ์๋ ์์ต๋๋ค.
๋ด ๋ง์, "Unity"์ ๊ฐ์ ์์คํ ์ ์ํ๋ค๋ฉด ์ค์ ๋ก ๋ฃจํธ์ ์ํํ ์์ ์ ์๋ ค์ฃผ๋ ํ์ ๋ ธ๋๊ฐ ์๊ณ ์๋์ผ๋ก ์ ์ธํ๊ฑฐ๋ ์ถ๊ฐํ์ง ์๊ณ ์ด๋ฆ์ ์ฐธ์กฐํ์ฌ ๊ฐ์ ธ์ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ฃจํธ ๋ ธ๋์ ์คํฌ๋ฆฝํธ์์. Resource ๋ฉ์๋๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์ฌ ๋ ํจ๊ณผ์ ์ด๋ฉฐ ๋ ๊นจ๋ํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํฉ๋๋ค.
ํน์ฑ ์์คํ ์ GDScript ์ฝ๋์ ์ฌ์ฉ์ฑ์ ๊ณผ๋ํ ๋ถ๋ด์ ์ฃผ๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ์ค๋ช ํ ์ด์ ์ ๋ฐ๋ผ ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ฒ ์ต๋๋ค. ์ถ๊ฐ์ ํจ์ ์ ๊ทธ๋ฌํ ์์คํ ์์ ์ป์ ์ ์๋ ๋น๊ต์ ๋น์ฝํ ์ด์ ๋ณด๋ค ํจ์ฌ ํฝ๋๋ค. ์ด๋ฌํ ๋์ผํ ์ด์ ์ ๋ ๋ช ํํ๊ณ ์ ์ฉํ๊ฒ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๊ธ์์, ์ ๊ฐ ์๋ ๋์ ์ด ํ ๋ก ์ ๋์ณค์ต๋๋ค. ์์ง ๋ชจ๋ ๊ฒ์ ์ฝ์ง๋ ์์์ง๋ง ์ฝ๋ ์ฌ์ฌ์ฉ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด GDScript์ ํน์ฑ์ ์ถ๊ฐํ๋ ์์ด๋์ด๊ฐ ์์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ํ์ ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฒจ๋ถํ๋ ๊ฐ์ง ๋ค์ค ์์๋ณด๋ค ํจ์ฌ ๋ ์ฐ์ํ๊ณ ๋ช ํํฉ๋๋ค. ๋ด๊ฐ ํ ์ผ์ ํน์ ํธ๋ ์ ํ์ผ์ ๋ง๋๋ ๊ฒ์ด์ง๋ง ์ด๋ค ํด๋์ค ํ์ผ๋ ํธ๋ ์์ด ๋๋๋ก ํ์ฉํ์ง ์์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋๋ฌด ๋์๋ค๊ณ ์๊ฐํ์ง ์๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๋ฌ ๋ ธ๋ ์ ํ์์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ์ฃผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ ์์ ์ด๋ ค ์์ต๋๋ค.
@vnen ๋ง์ง๋ง ํญ๋ชฉ์ธ ์๋ฃจ์ ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์น์ ์ ๋ฆฌ์์ค ์คํฌ๋ฆฝํธ์ ์์์์ฑํ๋ ๊ฒ์ ๋๋ค.
๋ ธ๋์ ๋ฉค๋ฒ ๋ณ์์ธ ๊ฒ์ฒ๋ผ ์ฌ์ ํ ๋ ธ์ถ๋๊ณ ์์ฑ์ด ์ธ์คํํฐ์์ ํธ์ง๋ ์ ์์ต๋๋ค.
๊ทธ๋ค์ ๋ฐ์ดํฐ์ ๋ ผ๋ฆฌ๊ฐ ์ด๋์์ ์๋์ง์ ๋ํ ๋ช ํํ ํ์ ์ ์ ์งํฉ๋๋ค. ๋ง์ ํน์ฑ์ด ํ๋์ ์คํฌ๋ฆฝํธ์ ํฌํจ๋๋ฉด ์ฝ๊ฒ ์์๋ ์ ์์ต๋๋ค.
๊ทธ๋ค์ ์ธ์ด๋ก์์ GDScript์ ๊ณผ๋ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํ์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์กด์ฌํ๋ค๋ฉด ๊ณต์ ํ์ง(์์ฑ, ์์, ์ ํธ)์ด ๊ธฐ๋ณธ ์คํฌ๋ฆฝํธ์ ๋ณํฉ๋๋ ๋ฐฉ์์ ํด๊ฒฐํด์ผ ํฉ๋๋ค(๋๋ ๋ณํฉ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ข ์์ฑ ์ถฉ๋์ ์ฒ๋ฆฌํ๋๋ก ๊ฐ์ ).
๋ฆฌ์์ค ์คํฌ๋ฆฝํธ๋ Inspector์์ ํ ๋น ๋ฐ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก ๋ ์ข์ต๋๋ค. ๋์์ด๋, ์๊ฐ ๋ฑ์ ํธ์ง๊ธฐ์์ ์ง์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
@willnationsdev (๋ชจ๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ฆฌ์์ค์ด๊ธฐ ๋๋ฌธ์ "๋ฆฌ์์ค ์คํฌ๋ฆฝํธ"๋ผ๋ ์ด๋ฆ์ด ์ด์ํ๊ฒ ๋ค๋ฆด์ง๋ผ๋) ์๊ฒ ์ต๋๋ค. ์ด ์๋ฃจ์ ์ ์ฃผ์ ๋ฌธ์ ๋ ์ฌ๋๋ค์ด ์์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๊ธฐ๋ํ๋ ๊ฒ์ ํด๊ฒฐํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ด๋ณด๋ธ ๋ณ์์ ์ ํธ๋ฅผ ์ฅ๋ฉด์ ๋ฃจํธ ๋ ธ๋์ ์ถ๊ฐํฉ๋๋ค(ํนํ ์ฅ๋ฉด์ ๋ค๋ฅธ ๊ณณ์์ ์ธ์คํด์คํํ ๋). ํ์ ๋ฆฌ์์ค์์ ๋ด๋ณด๋ธ ๋ณ์๋ฅผ ๊ณ์ ํธ์งํ ์ ์์ง๋ง ์ค์ฉ์ฑ์ด ๋จ์ด์ง๋๋ค(ํธ์งํ ์ ์๋ ์์ฑ์ ํ ๋์ ์ ์ ์์).
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ๋ง์ด ๋ฐ๋ณตํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฆฌ์์ค ์คํฌ๋ฆฝํธ๊ฐ ์ค์ ๋ก ์ค์ ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์ฅ์ ์ ์๋ฌด๊ฒ๋ ํ์ํ์ง ์์ผ๋ฉฐ ์ด๋ฏธ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ฌธ์ํ๋์ด์ผ ํ๊ณ ํ์ฌ "ํ์ ๋ ธ๋์ ์คํฌ๋ฆฝํธ ์ฒจ๋ถ" ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ์๋ฃจ์ ์ด ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ์ง ๋ณด๊ธฐ ์ํด ์๋ฃจ์ ์ ๋ํด ์ธ๊ธํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@vnen
๊ทธ๋ฌ๋ ๋ ์ค์ฉ์ ์ด ๋ฉ๋๋ค(ํธ์งํ ์ ์๋ ์์ฑ์ ํ ๋์ ์ ์ ์์).
์ฌ๊ธฐ์ ๋ฌด์จ ๋ง์ธ์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ํนํ #22660๊ณผ ๊ฐ์ ํญ๋ชฉ์ด ๋ณํฉ๋ ๊ฒฝ์ฐ ์ด๋ค ์์ฑ์ ์ก์ธ์คํ ์ ์๋์ง์ ๋ํ ๋ช ํ์ฑ์ด ์๋นํ ๋ถ์กฑํ ์ ์์ต๋๋ค.
export(MoveImpl) var move_impl = FourWayMoveImpl.new()
use FourWayMoveTrait
๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ง ์๋ ํ, ๋์๊ฒ ๊ฐ์ ์์ ๋จ๊ณ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ํ, ์ด๋ค ์์ฑ์ด ํธ์ง ๊ฐ๋ฅํ์ง ์ค์ ๋ก ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๋ ๋ช
ํํด์ง๋๋ค. ๊ตฌํ์ ๊ณ ์ ํ ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๊ตฌํ๊ณผ ๊ด๋ จ๋์ด ์๋ค๋ ์ฌ์ค์ด ๊ตฌํ ์ธ์คํด์ค, ์ฆ move_impl.<property>
.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ๋ง์ด ๋ฐ๋ณตํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ฆฌ์์ค ์คํฌ๋ฆฝํธ๊ฐ ์ค์ ๋ก ์ค์ ๋์๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ฌ์ค์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ธฐํ๊ฐ ํฌํจ๋ ๋ด๋ณด๋ด๊ธฐ์ ์ด์ ์ด ์ถ๊ฐ๋ ๋ง์ ๋น์ฉ๋ณด๋ค ๋ ํฌ๋ค๊ณ ์๊ฐํฉ๋๋ค.
("๊ณ ์๊ธ ํ์", HLT, ๋์์ด๋, ์๊ฐ, ์ํฐ์คํธ ๋ฑ)
์คํฌ๋ฆฝํธ๋ฅผ ์ด์ง ์๊ณ Inspector์์ ์ง์ ๊ฐ์ ํ ๋นํ๊ณ ๋ณ๊ฒฝํ ์ฌ๋ฐ๋ฅธ ์ค์ ์ฐพ์ ๋ค์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค(์ด๋ฏธ ์ธ๊ธํ์ง๋ง...).
๋ด๋ณด๋ธ ์ฝํ
์ธ ์ ๊ธฐ๋ณธ ์ ํ ์๊ตฌ ์ฌํญ์ด ์์์ ์ง์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด Inspector๋ ํ์ฉ ๊ฐ๋ฅํ ๊ตฌํ์ ์ด๊ฑฐ๋ ๋ชฉ๋ก์ ์๋์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ HLT๋ ํด๋น ์ ํ์ ํ์๋ฌผ๋ง ์์ ํ๊ฒ ํ ๋นํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฃผ์์ ๋ ๋์๋ค๋๋ ๋ชจ๋ ๋ค๋ฅธ ํน์ฑ ์คํฌ๋ฆฝํธ์ ๊ฒฐ๊ณผ๋ฅผ ์์์ผ ํ๋ ๋์์์ ๊ทธ๋ค์ ๊ฒฉ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ํ use
ํค์๋๋ฅผ ๋ณธ ๊ฒ์ ๋ํ ์๋ต์ผ๋ก ๋ช
๋ช
๋ ํน์ฑ ํ์ผ๊ณผ ๋ช
๋ช
๋์ง ์์ ํน์ฑ ํ์ผ ์กฐํ๋ฅผ ์ง์ํ๋๋ก GDScript์ ์๋ ์์ฑ์ ์์ ํด์ผ ํฉ๋๋ค.
๊ตฌํ ๊ตฌ์ฑ์ *.tres ํ์ผ๋ก ์ง๋ ฌํํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ HLT๋ FileSystem ๋ํฌ์์ ๋์ด๋ค ๋๊ฑฐ๋ Inspector์์ ๊ณ ์ ํ ๊ถํ์ ๋ง๋ค ์๋ ์์ต๋๋ค. ํน์ฑ์ผ๋ก ๋์ผํ ์์ ์ ์ํํ๋ ค๋ฉด ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฌ์ ์ํ๋ ์ฌ์ฉ์ ์ ์ ์์ฑ์๋ฅผ ์ ๊ณตํ๋ ํ์ ํน์ฑ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ช ๋ นํ์ผ๋ก ์ฝ๋ฉ๋ ์์ฑ์๋ฅผ ํตํด ๋์ ํด๋น ํน์ฑ์ "์ฌ์ ๊ตฌ์ฑ"์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
use MoveTrait
use FourWayMoveTrait
๋ผ๊ณ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ๊ธฐ๋ณธ MoveTrait
์๋ ํธํ๋๋ค๋ ์ง์์ ์ธ ํ์๊ฐ ๋ ์ด์ ์์ต๋๋ค. ๊ทธ๊ฒ์ FourWayMoveTrait
๊ฐ ๊นจ์ง์ง ์๊ณ ๋ค๋ฅธ MoveTrait
๋ก ๋ณ๊ฒฝ๋ ์ ์๋์ง ์ฌ๋ถ์ ๋ํ HLT ํผ๋์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.๊ฐ์ ์ ํ์ ๋ฆฌ์์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์๋ ์์ต๋๋ค(์ด์ ๊ฐ ์๋ ๊ฒฝ์ฐ). ํน์ฑ์ ์ด๋ฅผ ์ง์ํ์ง ์์ง๋ง ๋์ ๊ตฌ๋ฌธ ๋ถ์ ์ถฉ๋์ ์ ๋ฐํฉ๋๋ค.
2D/3D ๋ทฐํฌํธ๋ฅผ ๋ฒ์ด๋์ง ์๊ณ ๋ ๊ตฌ์ฑ ๋ฐ/๋๋ ๊ฐ๋ณ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๊ฒ์ HLT์ ํจ์ฌ ๋ ํธ์ํฉ๋๋ค(์ฝ๋ ๋ฅผ ๋ด์ผ ํ ๋ ์์ ํ ์ง์ฆ์ด ๋๋ ์ฌ๋์ ๋ง์ด ์๊ณ ์์ต๋๋ค).
๊ทธ ๋ชจ๋ ๋ง๊ณผ ํจ๊ป, ๋๋ ์์ฉ๊ตฌ๊ฐ ์ง์ฆ๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ง๋ง ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋งคํฌ๋ก ๋๋ ์ค๋ํซ ์์คํ ์ ์ถ๊ฐํ์ฌ ๋จ์ํํ๊ณ ์ถ์ต๋๋ค. ์ค๋ํซ ์์คํ ์ GDScript ๋จ๋ ์ด ์๋๋ผ ScriptEditor์์ ํธ์งํ ์ ์๋ ๋ชจ๋ ์ธ์ด๋ฅผ ์ง์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ข์ ์์ด๋์ด์ ๋๋ค.
์ ๋ํ:
๊ทธ๋ฌ๋ ๋ ์ค์ฉ์ ์ด ๋ฉ๋๋ค(ํธ์งํ ์ ์๋ ์์ฑ์ ํ ๋์ ์ ์ ์์).
๋๋ ์ธ์คํํฐ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ "HLT"๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฝ๋๋ฅผ ์ดํด๋ณด์ง ์๋ ์ฌ๋๋ค. ํน์ฑ์ ์ฌ์ฉํ์ฌ ์ ๋ด๋ณด๋ธ ์์ฑ์ ์คํฌ๋ฆฝํธ์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ์๋ฅผ ๋ฆฌ์์ค ์์ฒด๋ก๋ง ๋ด๋ณด๋ผ ์ ์์ผ๋ฏ๋ก ํ์ ๋ฆฌ์์ค๋ฅผ ํธ์งํ์ง ์๋ ํ ์ธ์คํํฐ์ ํ์๋์ง ์์ต๋๋ค.
๋๋ ๋น์ ์ ์ฃผ์ฅ์ ์ดํดํ์ง๋ง ๊ทธ๊ฒ์ ์๋์ ๋ฌธ์ ๋ฅผ ๋์ด์๋ ๊ฒ์ ๋๋ค: ์ฝ๋ ๋ฐ๋ณต์ ํผํ์ญ์์ค(์์ ์์ด). ํน์ฑ์ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ๋ง์ ๊ฒฝ์ฐ ์ฌ์ฌ์ฉํ๊ณ ์ถ์ ๊ตฌํ์ด ํ๋๋ฟ์ด๋ฉฐ ์ด๋ฅผ ์ธ์คํํฐ์ ๋ ธ์ถํ๊ณ ์ถ์ง ์์ต๋๋ค. ๋ฌผ๋ก ์ฝ๋์์ ์ง์ ํ ๋นํ๋ ๊ฒ๋ง์ผ๋ก ๋ด๋ณด๋ด๊ธฐ ์์ด ๋ฆฌ์์ค ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์์ง๋ง ์ฌ์ ํ ๊ณตํต ๊ตฌํ์์ ๋ด๋ณด๋ธ ๋ณ์์ ์ ํธ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ์ด๊ฒ์ด ์ฌ๋๋ค์ด ์๋ํ๋ ์ฃผ๋ ์ด์ ์ค ํ๋์ ๋๋ค. ์์์ ์ฌ์ฉํฉ๋๋ค.
์ฆ, ์ฌ๋๋ค์ ํ์ฌ ๊ธฐ๋ฅ๋ฟ๋ง ์๋๋ผ ๋ด๋ณด๋ธ ์์ฑ(์ผ๋ฐ์ ์ผ๋ก ํด๋น ๊ธฐ๋ฅ๊ณผ ๊ด๋ จ๋จ) ๋ฐ ์ ํธ(๊ทธ๋ฌ๋ฉด UI์ ์ฐ๊ฒฐํ ์ ์์)์ ๋ํด ์ผ๋ฐ ์คํฌ๋ฆฝํธ์์ ์์์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ์ ๋๋ค. GDScript๋ง์ผ๋ก ์ด๋ฅผ ์ํํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ค์ ํ ๋ฒ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ผ ํฉ๋๋ค.
์ธ๋ถ ์คํฌ๋ฆฝํธ๊ฐ ๋ง์น ๋ฉ์ธ ์คํฌ๋ฆฝํธ ์์ฒด์ ์ง์ ์์ฑ๋ ๊ฒ์ฒ๋ผ ์๋ํ๋๋ก ํ๊ธฐ ์ํด ๋ฐ์ํด์ผ ํ๋ ์ ํ ๊ด๊ณ๋ฅผ ์์ํ ์ ์์ ๋ฟ์ ๋๋ค.
๊ทธ๊ฒ์ ์ด๋ฃจ๊ธฐ ์ํด ํ๋๊ณผ ๋ ์ด ์์ง์ฌ์ผ ํ๋ ๊ฒ์ด ์๋๋ผ๋ฉด ์์ผ๋ฉด ์ข์ ํ ๋ฐ. ์์ค)
@vnen ์ง๊ธ ๋ฌด์จ ๋ง์ ํ์๋์ง ์๊ฒ ์ต๋๋ค. ๊ธ์, ์ด๋ฒ ํธ์๋ ์์ง ์๋ช ์ด ์๋ ๊ฒ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ค์์ ๊ธฐํ๊ฐ ์์ ๋ ๋ค์ ์ด๊ฒ ์ต๋๋ค.
์ฌ๊ฐ๋ด ์์์ ์๋์? ์ด์ GodotCon 2019๊ฐ ๋ฐํ๋๊ณ Godot Sprint๊ฐ ํ๋์ ์ผ์ด๋ฏ๋ก, ์๋ง๋ ์ด๊ฒ์ ์ด์ผ๊ธฐํ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค.
@AfterRebelion ๋๋ ๋์์์ ๊ทธ๊ฒ์ ๋ค์ ์ฌ๋ ๊ฒ์ ์์์ต๋๋ค. ์๊ธฐ์์ผ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. XD
@willnationsdev EditorInspectorPlugin ์ ๊ดํด ์ฝ์ ๋ด์ฉ์ด ๋ง์์ ๋ค์์ต๋๋ค! ๋น ๋ฅธ ์ง๋ฌธ, ์ด๊ฒ์ ๋ฐ์ดํฐ ์ ํ์ ๋ํ ์ฌ์ฉ์ ์ ์ ๊ฒ์ฌ๊ธฐ๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค... ์๋ฅผ ๋ค์ด... ๊ฒ์ฌ๊ธฐ์ ๋ฒํผ์ ์ถ๊ฐํฉ๋๋ค.
(์ด ์์
์ ์ํํ์ง ๊ฝค ์ค๋๋์์ต๋๋ค. ์ธ์คํํฐ์ ๋ฒํผ์ ์ฌ์ฉํ์ฌ ๋๋ฒ๊น
๋ชฉ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฒํผ์ ๋๋ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ ์ ์์ต๋๋ค.)
@xDGameStudios ๋ค , ๊ทธ ์ธ์๋ ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ์ปจํธ๋กค์ ์๋จ, ํ๋จ, ์์ฑ ์ ๋๋ ๋ฒ์ฃผ ์๋์์ Inspector์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
@willnationsdev ๊ฐ์ธ์ ์ผ๋ก ์ฐ๋ฝ๋๋ ค๋ ๋๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์!! ํ์ง๋ง EditorInspectorPlugin(์ผ๋ถ ์ํ ์ฝ๋์ ๊ฐ์)์ ๋ํด ๋ ์๊ณ ์ถ์ต๋๋ค. ์ฌ์ฉ์ ์ง์ ๋ฆฌ์์ค ์ ํ(์: MyResource)์ ์์ฑ ๋ด๋ณด๋ด๊ธฐ "์ด๋ฆ"์ด ์๊ณ "์ด๋ฆ"์ ์ธ์ํ๋ ๊ฒ์ฌ๊ธฐ ๋ฒํผ์ด ์๋ ์ค์ ์๋ ๊ฒ ๋ณ์๋ฅผ ๋๋ฅด๋ฉด (ํธ์ง๊ธฐ์์ ๋๋ ๋๋ฒ๊น ์ค)! ์ด ๋ฌธ์ ์์ ๋ฌธ์ํ๋ ์๊ฐ์ด ๋ง์ด ๋ถ์กฑํฉ๋๋ค... ์ด๊ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ฉด ๋ฌธ์๋ฅผ ์ง์ ์์ฑํ ๊ฒ์ ๋๋ค! :D ๊ฐ์ฌํฉ๋๋ค
๋๋ ๋ํ ๊ทธ๊ฒ์ ๋ํด ๋ ์๊ณ ์ถ์ต๋๋ค. ์์ค)
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ ์ ์ ํจ์๋ฅผ ํฌํจํ๋ ์๋ธํด๋์ค๊ฐ ์๋ ์๋ ๋ก๋ ์คํฌ๋ฆฝํธ์ ๋์ผํ๊ฐ์?
์๋ฅผ ๋ค์ด ๊ทํ์ ์ฌ๋ก๋ Traits.MoveRightTrait.move_right()
๊ฐ ๋ฉ๋๋ค.
๋๋ ๋ ๊ฐ๋จํ๊ฒ ์๋ก ๋ค๋ฅธ ํน์ฑ ํด๋์ค์ ๋ํด ์๋ก ๋ค๋ฅธ ์๋ ๋ก๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Movement.move_right()
์๋์, ํน์ฑ์ ํ ์คํฌ๋ฆฝํธ์ ์์ค ์ฝ๋๋ฅผ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๊ฒ๊ณผ ๊ฐ์ ์ธ์ด๋ณ ๊ธฐ๋ฅ์
๋๋ค(ํ์ผ ๋ณํฉ๊ณผ ์ ์ฌ). ๋ฐ๋ผ์ move_right()
๊ฐ ์๋ ํน์ฑ์ด ์๊ณ ๋ ๋ฒ์งธ ์คํฌ๋ฆฝํธ๊ฐ ํด๋น ํน์ฑ์ ์ฌ์ฉํ๋ค๊ณ ์ ์ธํ๋ฉด ์ ์ ์ด ์๋๊ณ ์ก์ธ์คํ๋๋ผ๋ move_right()
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋์ค์ ๋ค๋ฅธ ์์น์ ์๋ ์์ฑ. ์์ฑ์ด ๋ ๋ฒ์งธ ์คํฌ๋ฆฝํธ์ ์์ผ๋ฉด ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋๋ ๋ค์ค ์์์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ฝ๋(์์ ๊ธฐ๋ฅ, ์๋ฅผ ๋ค์ด ํธ ๋ง๋ค๊ธฐ) ๋๋ ๋ถํ์ํ ๋ ธ๋๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด๊ฒ์ ๊ต์ฅํ ๊ฒ์
๋๋ค. ์ ํํ ๋์ผํ ๊ธฐ๋ฅ์ ๊ฐ์ง ์คํฌ๋ฆฝํธ๋ฅผ ๋ค๋ฅธ ๋
ธ๋ ์ ํ์์ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ผ ํ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์ค์ ์ฝ๋์ ๋ํด ์๋ก ๋ค๋ฅธ extend
๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ํ์ฌ ์์คํ
์ผ๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์๋ ์ฌ๋์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค.
extends Node
๊ฐ ์๋ ์คํฌ๋ฆฝํธ์ ๋ํ ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ ์์ค ํ์ผ์ ๋ณต์ ํ๊ณ ์ ์ ํ extend
๋ก ๋ฐ๊พธ์ง ์๊ณ ๋ ๋์ผํ ๋์์ ๋ค๋ฅธ ๋
ธ๋ ์ ํ์ ์ฐ๊ฒฐํ ์ ์์ต๋๊น?
์ด์ ๋ํ ์ง์ ์ด ์์ต๋๊น? ์์์ ๋งํ๋ฏ์ด ๊ณ์ ์ฝ๋๋ฅผ ๋ณต์ ํ๊ฑฐ๋ ๋ ธ๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด 3.1์์ ๋๋์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์๋ง๋ 3.2๋ฅผ ๋ชฉํ๋ก ํ ๊ฒ์ ๋๊น?
์ค, ๋๋ ์ด๊ฒ์ ๋ํด ์ ํ ์์ ํ์ง ์์์ต๋๋ค. ์ฌ์ค, ๋๋ ์ด๊ฒ๋ณด๋ค ํ์ฅ ๋ฉ์๋ ๊ตฌํ์ ๋ ๋์ํฉ๋๋ค. ๋๋ ๊ทธ์ ํจ๊ป ์ต๊ณ ์ ๊ตฌ๋ฌธ/๊ตฌํ ์ธ๋ถ ์ฌํญ์ ํด๊ฒฐํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ๋ ๋ค์ ๋ํด vnen๊ณผ ์ด์ผ๊ธฐํด์ผ ํฉ๋๋ค.
ํธ์ง: ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ํน์ฑ์ ๊ตฌํํ๋ ๋ฐ ๊ท ์ด์ ์ผ์ผํค๊ณ ์ถ๋ค๋ฉด ๋ฐ์ด๋ค ์ ์์ต๋๋ค. ๊ฐ๋ฐ์์ ํ๋ ฅํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
"ํ์ฅ ๋ฐฉ๋ฒ ๊ตฌํ"?
@Zireael07 #15586
๊ทธ๊ฒ์ ์ฌ๋๋ค์ด ์์ง ํด๋์ค์ ๋ํ ์๋ก์ด "๋ด์ฅ๋" ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค. ๊ตฌ๋ฌธ์ ๋ํ ๋ด ํด์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
static Array func sum(p_self: Array):
if not len(p_self):
return 0
var value = p_self[0]
for i in range(1, len(p_self)):
value += p_self[i]
return value
๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ๊ณณ์์ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
var arr = [1, 2, 3]
print(arr.sum()) # prints 6
์ง์์ ์ผ๋ก ๋ก๋๋๋ ํ์ฅ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋ฐ๋ฆฌ์ ํธ์ถํ๊ณ Array ํด๋์ค์ ๋ฐ์ธ๋ฉ๋ ๋์ผํ ์ด๋ฆ์ ์ ์ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ธ์คํด์ค๋ฅผ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค.
์ด์ ๋ํด @vnen ๋ฐ @jahd2602 ์ ๋ช ๊ฐ์ง ์ด์ผ๊ธฐ๋ฅผ ๋๋ด์ต๋๋ค. ๋ง์์ ๋ ์ค๋ฅด๋ ํ ๊ฐ์ง๋ ๋คํ์ฑ์ ๋ํ Jai์ ์๋ฃจ์ ์ธ ์์ฑ์ ๋ค์์คํ์ด์ค ๊ฐ์ ธ์ค๊ธฐ์ ๋๋ค.
์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
class A:
var a_prop: String = "Hello"
func foo():
print("A's a_prop: ", a_prop)
func bar():
print("A's bar()")
class B:
using var a: A = A.new()
var a_prop: String = "World" # Overriding A's a_prop
func bar(): # Overriding A's bar()
print("B's bar()")
func main():
var b: B = B.new()
b.foo() # output: "A's a_prop: World"
b.bar() # output: "B's bar()"
์์ ์ using
ํค์๋๊ฐ ์์ฑ์ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก b.foo()
๋ ์ค์ ๋ก b.a.foo()
์ ๋ํ ๊ตฌ๋ฌธ์ ์คํ์ผ ๋ฟ์
๋๋ค.
๊ทธ๋ฐ ๋ค์ b is A == true
๋ฐ ํด๋น B๊ฐ A๋ฅผ ํ์ฉํ๋ ์
๋ ฅ๋ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋์ง ํ์ธํฉ๋๋ค.
์ด๊ฒ์ ๋ํ ํน์ฑ์ผ๋ก ์ ์ธํ ํ์๊ฐ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค. ์ด๋ ๊ณตํต ํ์ง ์ด๋ฆ์ด ์๋ ๋ชจ๋ ํญ๋ชฉ์ ์ ์ฉ๋ฉ๋๋ค.
ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ด๊ฒ์ด ํ์ฌ ์์ ์์คํ
๊ณผ ์ ๋ง์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. A์ B๊ฐ ๋ชจ๋ Node2D์ด๊ณ A: func baz(): print(self.position)
์์ ํจ์๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ b.baz()
๋ฅผ ํธ์ถํ ๋ ์ด๋ค ์์น๊ฐ ์ธ์๋ฉ๋๊น?
ํ ๊ฐ์ง ํด๊ฒฐ์ฑ
์ ํธ์ถ์๊ฐ self
๋ฅผ ๊ฒฐ์ ํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. b.foo()๋ฅผ ํธ์ถํ๋ฉด b๋ฅผ self๋ก ์ฌ์ฉํ์ฌ foo()๋ฅผ ํธ์ถํ๊ณ bafoo()๋ foo()๋ฅผ self๋ก ํธ์ถํฉ๋๋ค.
Python( x.f(y)
์ f(x,y)
์ ๋ํ ์คํ)๊ณผ ๊ฐ์ ๋
๋ฆฝํ ๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ๊ตฌํํ๊ธฐ๊ฐ ์ ๋ง ์ฌ์ธ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๊ด๋ จ ์๋ ์์ด๋์ด:
๋ ๋ฆฝํ ๊ธฐ๋ฅ, JavaScript ์คํ์ผ์๋ง ์ค์ ์ ๋ก๋๋ค.
์ ์ ํจ์์ ๋ํด x.f(y)
== f(x,y)
๊ท์น์ ์ฑํํ๋ฉด ๋ค์์ ๋งค์ฐ ์ฝ๊ฒ ์ป์ ์ ์์ต๋๋ค.
class Jumper:
static func jump(_self: KinematicBody2D):
# jump implementation
class Runner:
static func run(_self: KinematicBody2D, direction: Vector2):
# run implementation
class Character:
extends KinematicBody2D
func run = Runner.run # Example syntax
func jump = Jumper.jump
func main():
var character = Character.new()
character.jump()
character.run(Vector2(1,0))
์ด๊ฒ์ ์ค์ ๋ก ๋ฉ์๋์๋ง ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ํด๋์ค ์์คํ ์ ์ต์ํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ์ ๋ง๋ก ์ ์ฐํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์์ ํ JavaScript๋ก ์ ํํ๊ณ ํจ์ ์ ์๊ฐ ํ ๋น ๊ฐ๋ฅํ๊ณ ํธ์ถ ๊ฐ๋ฅํ ๊ฐ์ ํ์ฉํ๋๋ก ํ ์ ์์ต๋๋ค.
@jabcross ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ์ข ์ ์ ํ์ ๋ค์์คํ์ด์ค ๊ฐ๋ ์ด ๋ง์์ ๋ค๊ณ ๊ธฐ๋ฅ ์์ด๋์ด๊ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค.
ํ๋์ ๋ค์์คํ์ด์ค์ ๊ด๋ จํ์ฌ ๋จ์ํ using A
๊ฐ ์๋ ๋ค๋ฅธ ์ ์ธ์ ์ฌํญ์ด ๊ด๋ จ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด์ ๊ฐ ๊ถ๊ธํฉ๋๋ค.
๋ค์ค ์์์ผ๋ก ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ๋์ง๋ ๊ถ๊ธํฉ๋๋ค. ์ต์ A๋ ๋ ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋์ผํ ์ ํ์ ์์ํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ด๋ฏ๋ก ํน๋ณํ ๋ณํฉ ์์ด ๋ ๋ค ๋์ผํ ํด๋์ค์ ๋งจ ์์์ ํ์ฅ๋ฉ๋๋ค.
์ต์ B, ํน์ฑ ํด๋์ค๋ฅผ ์ง์ ํ๊ธฐ ์ํ ์ถ๊ฐ GDScript ํค์๋ ๋ฐ ํํธ๋ฅผ ์ํ๋ ํด๋์ค. ๊ฐ์ ์๊ฐ์ด์ง๋ง ๋ ๋ช ํํ๊ฒ ๋ณด์ด๋ ค๋ฉด ์ถ๊ฐ ๋จ๊ณ๋ง ์์ ๋ฟ์ ๋๋ค.
A.gd ์๋จ:
extends Trait as Node2D
is Trait as Node2D
is Trait extends B
extends B as Trait
์ค, ๋๋ ๋ค์์คํ์ด์ค ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ๋ ์ ์ ๋ง ์ข์ํฉ๋๋ค. ํน์ฑ ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ์์ง ์ ํ์ ์ฝํ ์ธ ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ์ ์ฌ์ ์ผ๋ก "ํ์ฅ ๋ฐฉ๋ฒ" ๊ฐ๋ ๋ ํด๊ฒฐํฉ๋๋ค.
class_name ArrayExt
static func sum(_self: Array) -> int:
var sum: int = 0
for a_value in _self:
sum += a_value
return sum
using ArrayExt
func _ready():
var a = [1, 2, 3]
print(a.sum())
@jabcross ๊ทธ๋ฐ ๋ค์ ๋๋ฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ์ฒด๊ฐ ํธ์ถ ์ฐ์ฐ์๋ฅผ ๊ตฌํํ๋๋ก ํ์ฉํ๋ค๋ฉด(ํธํ ๊ฐ๋ฅํ ๊ฐ์ ๋ํด callable
์ ํ์ ๊ฐ์ง) GDScript ์ฝ๋์ ๋ณด๋ค ๊ธฐ๋ฅ ์งํฅ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ถ๊ฐํ ์ ์์ต๋๋ค( ์ข์ ์์ด๋์ด๊ฐ ๋ ๊ฒ ๊ฐ์์.) ๋ฌผ๋ก ๊ทธ ์์ ์์ @vnen ์ #18698 ์์ญ์ ๋ ๋ง์ด ๋ค์ด๊ฐ๊ธด ํ์ง๋ง...
์ฐ๋ฆฌ๋ GDScript๊ฐ ์ฌ์ ํ ๋์ ์ธ์ด์ด๋ฉฐ ์ด๋ฌํ ์ ์ ์ค ์ผ๋ถ๋ ํธ์ถ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ๋ฐํ์ ๊ฒ์ฌ๊ฐ ํ์ํ๊ณ ์ฑ๋ฅ ์ ํ๊ฐ ์ถ๊ฐ๋๋ค๋ ์ ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค(๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋ ์ฌ๋๋ค์๊ฒ๋ ๋ชจ๋ ํจ์ ํธ์ถ์ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ฑ ์กฐํ๋ ๊ฐ๋ฅ). ์ด๊ฒ์ด ํ์ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ธ์ง ํ์ ํ ์ ์๋ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค(ํนํ ๋ณธ์ง์ ์ผ๋ก ๊ตฌ๋ฌธ ์คํ์ด๊ธฐ ๋๋ฌธ์).
๋๋ ํน์ฑ์ด ํด๋์ค๊ฐ ์๋๋ผ ๊ณ ์ ํ ํน์ฑ์ธ ์์ ํน์ฑ ์์คํ ์ ์ ํธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปดํ์ผ ์๊ฐ์ ์์ ํ ํด๊ฒฐ๋ ์ ์๊ณ ์ด๋ฆ ์ถฉ๋์ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ์ถ๊ฐ์ ์ธ ๋ฐํ์ ์ค๋ฒํค๋ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค.
@vnen Ahhh, ๋ฐํ์ ๋น์ฉ์ ๋ํด ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋ชจ๋ ํ์ฅ ๋ฉ์๋ ๊ตฌํ์ ์ ์ฉ๋๋ค๋ฉด ๊ทธ๊ฒ๋ ์ด์์ ์ด์ง ์์ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์์ํ ํน์ฑ ์์คํ
์ ๋ง๋ค์๋ค๋ฉด ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์์ extends
์ using TraitName
under extends ๋์ trait TraitName
๋ฅผ ๋ง๋ค ์๊ฐ์ด์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ง์ ๊ตฌํํ์๊ฒ ์ต๋๊น, ์๋๋ฉด ์์ํ์๊ฒ ์ต๋๊น?
์ฐ๋ฆฌ๊ฐ ์์ํ ํน์ฑ ์์คํ ์ ๋ง๋ค์๋ค๋ฉด ๋ค๋ฅธ ์คํฌ๋ฆฝํธ์์
extends
์using TraitName
under extends ๋์trait TraitName
๋ฅผ ๋ง๋ค ์๊ฐ์ด์์ต๋๊น?
๊ทธ๊ฒ ๋ด ์๊ฐ์ด์ผ. ๋๋ ๊ทธ๊ฒ์ด ์ถฉ๋ถํ ๊ฐ๋จํ๊ณ ์ฝ๋ ์ฌ์ฌ์ฉ์ ๋ํ ๊ฑฐ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค. ๋๋ ํน์ฑ์ ์ฌ์ฉํ๋ ํด๋์ค๊ฐ ํน์ฑ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋๋ก ํ์ฉํ ๊ฒ์ ๋๋ค(์ปดํ์ผ ํ์์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ). ํน์ฑ์ ๋ค๋ฅธ ํน์ฑ์ ํ์ฅํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ง์ ๊ตฌํํ์๊ฒ ์ต๋๊น, ์๋๋ฉด ์์ํ์๊ฒ ์ต๋๊น?
๋๋ ๊ทธ ์ผ์ ํ ์ ์๋ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๊ทธ ์ผ์ ๋งก๊ธฐ๋ ๊ฒ์ ๊บผ๋ คํ์ง ์์ ๊ฒ์ ๋๋ค. ์ด์จ๋ ์๊ฐ์ด ๋ถ์กฑํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฏธ๋ฆฌ ๋์์ธ์ ๋์ํด์ผ ํฉ๋๋ค. ๋๋ ์ธ๋ถ ์ฌํญ์ ๋ํด ์๋นํ ์ ์ฐํ์ง๋ง 1) ๋ฐํ์ ๊ฒ์ฌ์์ ๋ฐ์ํ์ง ์์์ผ ํ๊ณ (GDScript๋ ์ปดํ์ผ์์ ์์๋ผ ์ ์๋ ํญ๋ชฉ์ ์ ํฉํ๋ค๊ณ ๋ฏฟ์ด์ผ ํจ), 2) ๋น๊ต์ ๊ฐ๋จํด์ผ ํ๋ฉฐ, 3) ์ปดํ์ผ ์๊ฐ.
@vnen ์ด ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค. ํธ๋ ์์ด ํฌํจ๋ ํด๋์ค์ ๋ํด ์๋ ์์ฑ๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์๋์ง ๋๋ ๋ถ๊ฐ๋ฅํ ๊ฒ์ธ์ง ์ด๋ป๊ฒ ์์ํ๋์ง ๊ถ๊ธํ์ญ๋๊น?
ํธ๋ ์์ด ํฌํจ๋ ํด๋์ค์ ๋ํด ์๋ ์์ฑ๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์๋์ง ๋๋ ๋ถ๊ฐ๋ฅํ ๊ฒ์ธ์ง ์ด๋ป๊ฒ ์์ํ๋์ง ๊ถ๊ธํ์ญ๋๊น?
๋ด ๊ด์ ์์ ํน์ฑ์ ๋ณธ์ง์ ์ผ๋ก "๊ฐ์ ธ์ค๊ธฐ"์ ๋๋ค. ๊ตฌ์ฑ์์ ์ํ ์๋ฃ๊ฐ ์๋ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์๋ฃ๋ฅผ ํ์ํ๋ ๊ฒ์ด ๊ฐ๋จํด์ผ ํฉ๋๋ค.
@vnen ๊ธฐ๋ณธ์ ์ผ๋ก trait
ํ๋๊ทธ๊ฐ ์ค์ ๋ ClassNode๋ก ๊ตฌ๋ฌธ ๋ถ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ using
๋ฌธ์ ์ํํ๋ฉด ๋ชจ๋ ์์ฑ/๋ฉ์๋/์ ํธ/์์/ํ์ ํด๋์ค๋ฅผ ํ์ฌ ์คํฌ๋ฆฝํธ์ ๋ณํฉํ๋ ค๊ณ ์๋ํฉ๋๋ค.
๋์ ์๊ฐ? ์๋๋ฉด ๋น๋ฉ์๋ ์ถฉ๋์ ์์ ํ ๊ธ์งํด์ผ ํฉ๋๊น? ์๋ธํด๋์ค๋ ์ด๋ป์ต๋๊น? ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฌํ ๊ฐ๋ฑ์ ๋ง๋ค์ด์ผ ํ๋ค๋ ๋๋์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
@willnationsdev "๋ค์ด์๋ชฌ๋ ๋ฌธ์ "(์ผ๋ช "์ฃฝ์์ ๋ค์ด์๋ชฌ๋"๋ผ๊ณ ๋ ํจ)์ฒ๋ผ ๋ค๋ฆฌ๋๋ฐ, ์ด๋ฏธ ์ฌ๋ฌ ์ธ๊ธฐ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ ์ฉ๋ ๋ค์ํ ์๋ฃจ์ ๊ณผ ํจ๊ป ์ ๋ฌธ์ํ๋ ๋ชจํธ์ฑ์ ๋๋ค.
์๊ฐ๋๋ ๊ฒ:
@vnen ํน์ฑ์ด ๋ค๋ฅธ ํน์ฑ์ ํ์ฅํ ์ ์์ต๋๊น?
@jahd2602 ๊ทธ๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ ์ํ์ต๋๋ค .
ํน์ฑ์ ๋ค๋ฅธ ํน์ฑ์ ํ์ฅํ ์๋ ์์ต๋๋ค.
@jahd2602 Perl/Python ์๋ฃจ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ํด๋์ค์ ์ฝํ ์ธ ๋ฅผ ํฌํจํ๋ ๋ ์ด์ด์ "์คํ"์ ํ์ฑํ์ฌ ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ํน์ฑ์ ์ถฉ๋์ด ๋ค๋ฅธ ๋ฒ์ ์์ ๋์ด๊ณ ๋ฎ์ด์ฐ๋๋ก ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด ์๋๋ฆฌ์ค์ ๋ํ ๊ฝค ์ข์ ์๋ฃจ์ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋น์ ์ด๋ @vnen ์๊ฒ ๋ค๋ฅธ ์๊ฐ์ด ์๋ค๋ฉด. ์๋ฃจ์ jahd์ ์ฐ๊ฒฐ๋ ๊ฐ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋๋ค.
์ฒซ์งธ: using ๋ฌธ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ง์ํด์ผ ํ๋์?
using
๋ฌธ์๋ ์์ ๊ฐ GDScript๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
using preload("res://my_trait.gd") # a preloaded expression
using ScriptClass.MyTrait # a const resource
using Autoload.MyTrait # a const resource
using MyTrait # a regular script class
์์ ๋ชจ๋ ๊ฒ์ ์๊ฐํ๊ณ ์์ต๋๋ค.
๋์งธ: ํน์ฑ ๋ฐ/๋๋ ๊ทธ ์ด๋ฆ์ ์ ์ํ๋ ๋ฐ ํ์ฉ๋๋ ๊ตฌ๋ฌธ์ ๋ฌด์์ด์ด์ผ ํฉ๋๊น?
๋๊ตฐ๊ฐ๋ ๋ฐ๋์ ์์ ์ ํน์ฑ์ ๋ํด ์คํฌ๋ฆฝํธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ดํ์ง ์์ ์ ์์ผ๋ฏ๋ก trait TraitName
์๊ตฌ ์ฌํญ์ ์ ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. trait
๊ฐ ์ค์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ผ์ ๋๊ตฌ ์คํฌ๋ฆฝํธ๋ผ๋ฉด ๋น์ฐํ ๋งจ ์์ ๋๊ตฌ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํน์ฑ์ด๋ฉด ๋ค์ ์ค์ ํน์ฑ์ธ์ง ์ฌ๋ถ๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ์ ํ์ ์ผ๋ก ๋ค๋ฅธ ์ฌ๋์ด ๊ฐ์ ์ค์ ์๋ ํน์ฑ ์ ์ธ ๋ค์์ ์คํฌ๋ฆฝํธ ํด๋์ค ์ด๋ฆ์ ๋ช
์ํ๋๋ก ํ์ฉํ๊ณ , ๊ทธ๋ ๊ฒ ํ๋ ๊ฒฝ์ฐ class_name
๋ ์ฌ์ฉํ๋๋ก ํ์ฉํ์ง ๋ง์ญ์์ค. ํน์ฑ ์ด๋ฆ์ ์๋ตํ๋ฉด class_name <name>
๊ฐ ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ์ ํ์ ํ์ฅํ ๋ ํน์ฑ ์ ์ธ ๋ค์ extends
๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ํน์ฑ ์ ์ธ ๋ค์ ์์ฒด ํ์ ์ฝ์
ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๊ฐ ํญ๋ชฉ์ด ์ ํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
# Global name from trait keyword.
trait MyTrait extends BaseTrait
# Global name from class_name keyword, but is still a trait and also happens to be a tool script.
tool
trait
extends BaseTrait
class_name MyTrait
# A trait with no global name associated with it. Does not extend anything.
trait
์ ์งธ: ์๋ ์์ฑ ๋ชฉ์ ๋ฐ/๋๋ ์๋/์๊ตฌ ์ฌํญ ์ ์ธ์ ์ํด ํธ๋ ์์ด ํ์ฅํด์ผ ํ๋ ๊ธฐ๋ณธ ์ ํ์ ์ ์ํ๋๋ก ํ์ฉํด์ผ ํฉ๋๊น?
์ฐ๋ฆฌ๋ ์ด๋ฏธ ํน์ฑ์ด ๋ค๋ฅธ ํน์ฑ์ ์์์ ์ง์ํด์ผ ํ๋ค๊ณ ๋
ผ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ TraitA๋ฅผ extend Node
๋ก ํ์ฉํ๊ณ TraitA ์คํฌ๋ฆฝํธ๊ฐ ๋
ธ๋ ์๋ ์์ฑ์ ์ป๋๋ก ํ์ฉํด์ผ ํ์ง๋ง ํ์ฌ ํด๋์ค๊ฐ Node๋ฅผ ํ์ฅํ์ง ์์ ๋ using TraitA
๋ฌธ์ ์ํํ๋ฉด ๊ตฌ๋ฌธ ๋ถ์ ์ค๋ฅ๋ ๋ฐ์ํฉ๋๋ค. ๋๋ ํ์ ์ ํ ์ค ํ๋?
๋ค ๋ฒ์งธ: ํธ๋ ์์ด ๋ค๋ฅธ ํธ๋ ์์ ํ์ฅํ๋๋ก ํ๋ ๋์ ํด๋์ค ํ์ฅ์ ์ํด ์์ฝ๋ extends
๋ช
๋ น๋ฌธ์ ์ ์งํ๊ณ ํธ๋ ์์ด ์ด ๋ช
๋ น๋ฌธ์ ์ ํ ํ์๋ก ํ์ง ์๊ฒ ํ๊ณ ๊ธฐ๋ณธ ํธ๋ ์์ ํ์ฅํ๋ ๋์ ํ์ฉํ ์ ์์ต๋๊น? ํน์ฑ์ ํ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํตํด ๊ณ ์ ํ using
๋ช
๋ น๋ฌธ์ ๊ฐ๋๋ก ํ์๊ฒ ์ต๋๊น?
# base_trait.gd
trait
func my_method():
print("Hello")
# derived_trait.gd
trait
using preload("base_trait.gd")
func my_method():
print("World") # overrides previous method, will only print "World".
๋ฌผ๋ก ์ฌ๊ธฐ์ ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ํฌํจํ๋ C++ ํฌํจ ํ์ผ๊ณผ ์ ์ฌํ๊ฒ ์ฌ๋ฌ using
๋ฌธ์ ์ฌ์ฉํ์ฌ ๋จ์ผ ํน์ฑ ์ด๋ฆ์ผ๋ก ์ฌ๋ฌ ํน์ฑ์ ์ผ๊ด ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ค์ฏ์งธ: ํน์ฑ์ด ์๊ณ ๋ฉ์๋์ ๋ํด using
๋๋ extends
๊ฐ ์๊ณ ๊ณ ์ ํ ํน์ฑ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ ํด๋น ํจ์ ๋ด์์ ํธ์ถํ ๋ ์ํํ ์์
.<method_name>
๊ธฐ๋ณธ ๊ตฌํ์ ์คํํ์๊ฒ ์ต๋๊น? ์ด๋ฌํ ํธ์ถ์ ํญ์ ํด๋์ค ์์ ์ปจํ
์คํธ ๋ด์์ ์คํ๋๊ณ ํน์ฑ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์ฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๊ณ ๊ฐ์ ํฉ๋๊น?
cc @vnen
์ฒซ์งธ: using ๋ฌธ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ง์ํด์ผ ํ๋์?
using
๋ฌธ์๋ ์์ ๊ฐ GDScript๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.using preload("res://my_trait.gd") # a preloaded expression using ScriptClass.MyTrait # a const resource using Autoload.MyTrait # a const resource using MyTrait # a regular script class
๋๋ ๊ทธ ๋ชจ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฝ๋ก์ ๊ฒฝ์ฐ ๋ฌธ์์ด์ ์ง์ ์ฌ์ฉํฉ๋๋ค. using "res://my_trait.gd"
๋์งธ: ํน์ฑ ๋ฐ/๋๋ ๊ทธ ์ด๋ฆ์ ์ ์ํ๋ ๋ฐ ํ์ฉ๋๋ ๊ตฌ๋ฌธ์ ๋ฌด์์ด์ด์ผ ํฉ๋๊น?
๋๊ตฐ๊ฐ๋ ์์ ์ ํน์ฑ์ ๋ํด ์คํฌ๋ฆฝํธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ดํ์ง ์์ ์ ์์ผ๋ฏ๋ก
trait TraitName
์๊ตฌ ์ฌํญ์ ์ ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.trait
๊ฐ ์ค์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.๋ฐ๋ผ์ ๋๊ตฌ ์คํฌ๋ฆฝํธ๋ผ๋ฉด ๋น์ฐํ ๋งจ ์์ ๋๊ตฌ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํน์ฑ์ด๋ฉด ๋ค์ ์ค์ ํน์ฑ์ธ์ง ์ฌ๋ถ๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ์ ํ์ ์ผ๋ก ๋ค๋ฅธ ์ฌ๋์ด ๊ฐ์ ์ค์ ์๋ ํน์ฑ ์ ์ธ ๋ค์์ ์คํฌ๋ฆฝํธ ํด๋์ค ์ด๋ฆ์ ๋ช ์ํ๋๋ก ํ์ฉํ๊ณ , ๊ทธ๋ ๊ฒ ํ๋ ๊ฒฝ์ฐ
class_name
๋ ์ฌ์ฉํ๋๋ก ํ์ฉํ์ง ๋ง์ญ์์ค. ํน์ฑ ์ด๋ฆ์ ์๋ตํ๋ฉดclass_name <name>
๊ฐ ์ข์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ์ ํ์ ํ์ฅํ ๋ ํน์ฑ ์ ์ธ ๋ค์extends
๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ํน์ฑ ์ ์ธ ๋ค์ ์์ฒด ํ์ ์ฝ์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๊ฐ ํญ๋ชฉ์ด ์ ํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.# Global name from trait keyword. trait MyTrait extends BaseTrait # Global name from class_name keyword, but is still a trait and also happens to be a tool script. tool trait extends BaseTrait class_name MyTrait # A trait with no global name associated with it. Does not extend anything. trait
ํธ๋ ์ดํธ์ tool
๋ ์ง์ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋๋ ํน์ฑ์ด ๋ฐ๋์ ๊ธ๋ก๋ฒ ์ด๋ฆ์ ๊ฐ์ง ํ์๋ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. trait
tool
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด์ด์ผ ํฉ๋๋ค(์ฃผ์ ์ ์ธ). ํค์๋ ๋ค์์ ํน์ฑ ์ด๋ฆ์ด ์ ํ์ ์ผ๋ก ์์ผ ํฉ๋๋ค. ๋๋ ํด๋์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ์ class_name
๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์
๋๋ค.
์ ์งธ: ์๋ ์์ฑ ๋ชฉ์ ๋ฐ/๋๋ ์๋/์๊ตฌ ์ฌํญ ์ ์ธ์ ์ํด ํธ๋ ์์ด ํ์ฅํด์ผ ํ๋ ๊ธฐ๋ณธ ์ ํ์ ์ ์ํ๋๋ก ํ์ฉํด์ผ ํฉ๋๊น?
์์งํ ํธ์ง์๋ฅผ ์ํด ์ธ์ด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๋ค. ๋ฐ๋ก ์ฃผ์์ด ์ ์ฉํ ๊ฒ์ ๋๋ค.
์ด์ ํน์ ์ ํ(๋ฐ ํ์ ์ํ)์๋ง ํน์ฑ์ ์ ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๊ด์ฐฎ์ต๋๋ค. ์ฌ์ค, ์ ๋ ์ด๊ฒ์ด ์ ์ ๊ฒ์ฌ๋ฅผ ์ํด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค: ์ด๊ฒ์ ํธ๋ ์์ด ํด๋์ค์ ํญ๋ชฉ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๋ฐ๋ฉด ์ปดํ์ผ์ ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ์ ํ ๋ฐ ๊ธฐํ ํญ๋ชฉ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๋ค ๋ฒ์งธ: ํธ๋ ์์ด ๋ค๋ฅธ ํธ๋ ์์ ํ์ฅํ๋๋ก ํ๋ ๋์ ํด๋์ค ํ์ฅ์ ์ํด ์์ฝ๋
extends
๋ช ๋ น๋ฌธ์ ์ ์งํ๊ณ ํธ๋ ์์ด ์ด ๋ช ๋ น๋ฌธ์ ์ ํ ํ์๋ก ํ์ง ์๊ฒ ํ๊ณ ๊ธฐ๋ณธ ํธ๋ ์์ ํ์ฅํ๋ ๋์ ํ์ฉํ ์ ์์ต๋๊น? ํน์ฑ์ด _๊ทธ_ ํน์ฑ์ ํ์ ๊ฐ์ ธ์ค๊ธฐํ๋ ์์ฒดusing
๋ฌธ์ ๊ฐ๋๋ก ํ๋ ค๋ฉด?
๊ธ์์, ๊ทธ๊ฒ์ ๋๋ถ๋ถ ์๋ฏธ๋ก ์ ๋ฌธ์ ์
๋๋ค. ํน์ฑ์ด ๋ค๋ฅธ ํน์ฑ์ ํ์ฅํ ์ ์๋ค๊ณ ์ธ๊ธํ์ ๋ extends
ํค์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒ์ ์๋๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ extends
๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋๋ง ํ์ฅํ ์ ์๊ณ using
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ๋ง์ ํน์ฑ์ ํ๋์ ํฌํจํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋๋ using
๊ด์ฐฎ์ต๋๋ค. ์ฃผ๊ธฐ๊ฐ ์๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋ค์ฏ ๋ฒ์งธ: ํน์ฑ์ด ์๊ณ ๋ฉ์๋์ ๋ํด
using
๋๋extends
๊ฐ ์๊ณ ๊ณ ์ ํ ํน์ฑ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ ํด๋น ํจ์ ๋ด์์ ํธ์ถํ ๋ ์ํํ ์์.<method_name>
๊ธฐ๋ณธ ๊ตฌํ์ ์คํํ์๊ฒ ์ต๋๊น? ์ด๋ฌํ ํธ์ถ์ ํญ์ ํด๋์ค ์์ ์ปจํ ์คํธ ๋ด์์ ์คํ๋๊ณ ํน์ฑ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ์ฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๊ณ ๊ฐ์ ํฉ๋๊น?
์ด๋ ค์ด ์ง๋ฌธ์ ๋๋ค. ๋๋ ํน์ฑ์ด ํด๋์ค ์์์ ๋ค๋ฃจ๋ ๋น์ฆ๋์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ ํ๊ธฐ๋ฒ์ ๋ถ๋ชจ ํน์ฑ์ ๋ํ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค(์๋ ๊ฒฝ์ฐ). ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํน์ฑ์ ์์ ์ด ์ํ ํด๋์ค๋ฅผ ์ธ์ํ์ง ์์์ผ ํฉ๋๋ค.
OTOH, ํน์ฑ์ ๊ฑฐ์ "ํฌํจ"๊ณผ ๊ฐ์ผ๋ฏ๋ก ํด๋์ค์ ๊ทธ๋๋ก ์ ์ฉ๋๋ฏ๋ก ๋ถ๋ชจ ๊ตฌํ์ ํธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์งํ ๊ทธ ๋ฐฉ๋ฒ์ด ๋ถ๋ชจ ํธ๋ ์์์ ๋ฐ๊ฒฌ๋์ง ์๋๋ค๋ฉด ๋๋ ๋จ์ํ ์ ํ๊ธฐ๋ฒ์ ๊ธ์งํ ๊ฒ์ ๋๋ค.
ํด๋์ค์ ํ๋ ์ด์์ ๋ค๋ฅธ ํน์ฑ์ด ์์ด์ผ ํ๋ ํน์ฑ์ ์ด๋ป์ต๋๊น? ์๋ฅผ ๋ค์ด Jumper
, Upgradable
, ๊ทธ๋ฆฌ๊ณ KinematicBody2D
๋ฅผ ์์ํ๋ ํด๋์ค๊ฐ ๋ชจ๋ ํ์ํ DoubleJumper
$ ์
๋๋ค.
์๋ฅผ ๋ค์ด, Rust๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ ๊ฐ์ ์ ํ ์๋ช
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. KinematicBody2D: Jumper, Upgradable
์ ๊ฐ์ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ :
๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ์ฃผ์์ ๋ฌ๊ธฐ ๋๋ฌธ์ KinematicBody2D & Jumper & Upgradable
๋๋ ๊ธฐํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋คํ์ฑ ๋ฌธ์ ๋ ์์ต๋๋ค. ํน์ฑ ๊ตฌํ์ด ํด๋์ค๋ง๋ค ๋ค๋ฅด์ง๋ง ๋์ผํ ์ธํฐํ์ด์ค๋ฅผ ๋ ธ์ถํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์๋ฅผ ๋ค์ด, Enemy
์ Player
๋ชจ๋์์ ์ฌ์ฉํ๋ Jumper
ํธ๋ ์์ kill()
๋ฉ์๋๊ฐ ํ์ํฉ๋๋ค. ๋์ผํ Jumper
์ ํ ์๊ทธ๋์ฒ์ ํธํ๋๋๋ก ์ ์งํ๋ฉด์ ๊ฐ ๊ฒฝ์ฐ์ ๋ํด ์๋ก ๋ค๋ฅธ ๊ตฌํ์ ์ํฉ๋๋ค. ์ด ์์
์ ์ํํ๋ ๋ฐฉ๋ฒ?
๋คํ์ฑ์ ๊ฒฝ์ฐ kill()
๊ฐ ์๋ ํน์ฑ์ ํฌํจํ๋ ๋ณ๋์ ํน์ฑ์ ๋ง๋ ๋ค์ ๋ฉ์๋์ ๊ณ ์ ํ ํน์ ๋ฒ์ ์ ๊ตฌํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด์ ์ ํฌํจ๋ ํธ๋ ์ดํธ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ํธ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ํ ์ ํ ํํธ์ ํน์ฑ ์๊ตฌ ์ฌํญ์ด ํฌํจ๋๋๋ก ํ ๊ณํ์ (์์ง) ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์ ์ผ์ ๋๊น?
๋ณ๋์ ํน์ฑ์ ์์ฑ
์ผํ์ฑ ํน์ฑ ํ์ผ์ ๋ง์ด ์์ฑํ์ง ์์ต๋๊น? ์ค์ฒฉ๋ ํน์ฑ ์ ์ธ( class
ํค์๋์ ์ ์ฌ)์ ์ํํ ์ ์๋ค๋ฉด ๋ ํธ๋ฆฌํ ์ ์์ต๋๋ค. ํน์ฑ์ ์ฌ์ฉํ๋ ํด๋์ค์์ ์ง์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค.
๊ฐ๋ ฅํ ์ ํ ์๋ช ์์คํ (๋ถ์ธ ๊ตฌ์ฑ ๋ฐ ์ ํ ์ฌํญ/null์ด ์๋ ๊ฒฝ์ฐ)์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํน์ฑ์ด ๋ฑ ๋ค์ด๋ง์ ๊ฒ์ ๋๋ค.
๋ ผ์๋์๋์ง ํ์คํ์ง ์์ง๋ง ๊ธฐ๋ฅ์ ํน์ฑ ํน์ ๋ฒ์ ์ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
trait A
func m():
print("A")
trait B
func m():
print("B")
class C
using A
using B
func c():
A.m()
B.m()
m()
A
, B
, B
๋ฅผ ์ธ์ํฉ๋๋ค.
๋ํ "๋ฐํ์ ๋น์ฉ ์์"์ ๋ํด ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋ด๋ณด๋ด๊ธฐ ์ ์ ์ ์๋ ํน์ฑ์ ์ฌ์ฉํ๋ ํด๋์ค์ ํจ๊ป ๋์ ์ผ๋ก ๋ก๋๋ ์คํฌ๋ฆฝํธ(๋ด๋ณด๋ด๊ธฐ ์ค์๋ ์ฌ์ฉํ ์ ์์)๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? ๋ด๊ฐ ๋ญ๊ฐ ์คํดํ๊ณ ์๋ ๊ฑธ๊น? ์๋๋ฉด ๊ทธ ๊ฒฝ์ฐ๊ฐ "๋ฐํ์"์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๊น?
๋ ผ์๋์๋์ง ํ์คํ์ง ์์ง๋ง ๊ธฐ๋ฅ์ ํน์ฑ ํน์ ๋ฒ์ ์ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๋ฏธ ์ด๊ฒ์ ๊ณ ๋ คํ๊ณ ์์์ง๋ง ํด๋์ค๊ฐ ์ถฉ๋ํ๋ ํน์ฑ(์ฆ, ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํน์ฑ)์ ์ฌ์ฉํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋ํด ํ์ ์ด ์์ต๋๋ค. using
๋ฌธ์ ์์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋ํ "๋ฐํ์ ๋น์ฉ ์์"์ ๋ํด ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋ด๋ณด๋ด๊ธฐ ์ ์ ์ ์๋ ํน์ฑ์ ์ฌ์ฉํ๋ ํด๋์ค์ ํจ๊ป ๋์ ์ผ๋ก ๋ก๋๋ ์คํฌ๋ฆฝํธ(๋ด๋ณด๋ด๊ธฐ ์ค์๋ ์ฌ์ฉํ ์ ์์)๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? ๋ด๊ฐ ๋ญ๊ฐ ์คํดํ๊ณ ์๋ ๊ฑธ๊น? ์๋๋ฉด ๊ทธ ๊ฒฝ์ฐ๊ฐ "๋ฐํ์"์ผ๋ก ๊ฐ์ฃผ๋์ง ์์ต๋๊น?
์์ถํ๋ ๊ฒ์ด ์๋๋๋ค. ์ปดํ์ผ์ ๋ก๋ฉ ์์ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ก๋ฉ ์๊ฐ์ ํ์คํ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด์ง๋ง(๋งค์ฐ ์ค์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง) ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋ ๋๋ ์ํฅ์ ๋ฏธ์น์ง ์์์ผ ํฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ด๋ณด๋ผ ๋ ์ปดํ์ผํด์ผ ํ์ง๋ง ์ด๋ ๋ ๋ค๋ฅธ ๋ ผ์์ ๋๋ค.
์ฌ๋ฌ๋ถ, ์๋ ํ์ธ์.
์ ๋ Godot๋ฅผ ์ฒ์ ์ ํ๊ณ ์ง๋ ๋ฉฐ์น ๋์ ์ต์ํด์ก์ต๋๋ค. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ฉด์ ํจํด์ ๊ฒฐ์ ํ์ต๋๋ค. ๋๋ ํญ์ ๋ค๋ฅธ ์ฅ๋ฉด์์ ์ธ์คํด์ฑ๋๋๋ก ์๋๋ ํ์ ์ฅ๋ฉด์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ธ๋ถ์์ ์ค์ ํ๋ ค๋ ๋ชจ๋ ์์ฑ์ ๋ด๋ณด๋ด๋๋ก ๋ง๋ค ๊ฒ์ ๋๋ค. ๊ฐ๋ฅํ ํ ๋๋จธ์ง ์ฅ๋ฉด์๋ ์ธ์คํด์ค๋ ๋ถ๊ธฐ์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ์ง์์ด ํ์ํ์ง ์๊ฒ ํ๊ณ ์ถ์์ต๋๋ค.
์ด ์์
์ ์ํํ๋ ค๋ฉด ๋ฃจํธ ๋
ธ๋๊ฐ ์์ฑ์ "๋ด๋ณด๋ด๊ธฐ"ํ ๋ค์ ๊ฐ์ _ready์ ์ ์ ํ ์์์ ๋ณต์ฌํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์์ Timer๊ฐ ์๋ Bomb ๋
ธ๋๋ฅผ ์์ํด ๋ณด์ญ์์ค. ํ์ ์ฅ๋ฉด์ ๋ฃจํธ Bomb ๋
ธ๋๋ "detonation_time"์ ๋ด๋ณด๋ธ ๋ค์ _ready์์ $Timer.wait_time = detonation_time
๋ฅผ ์ํํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ธ์คํด์คํํ ๋๋ง๋ค ์์ด๋ค์ ํธ์ง ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ํ์ด๋จธ๋ก ๋๋ฆด๋ค์ดํ ํ์ ์์ด Godot์ UI์์ ๋ฉ์ง๊ฒ ์ค์ ํ ์ ์๋๋ก ํฉ๋๋ค.
ํ์ง๋ง
1) ๊ทธ๊ฒ์ ๋งค์ฐ ๊ธฐ๊ณ์ ๋ณํ์ด๋ฏ๋ก ์์คํ
์์ ์ ์ฌํ ๊ฒ์ ์ง์ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
2) ์์ ๋
ธ๋์์ ์ง์ ์ ์ ํ ๊ฐ์ ์ค์ ํ๋ ๊ฒ๋ณด๋ค ์ฝ๊ฐ์ ๋นํจ์จ์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ณ์ํ๊ธฐ ์ ์ ์ด๊ฒ์ ์ผ์ข ์ "๋น๊ณต๊ฐ" ์์(C++ ์ฉ์ด๋ก)์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ผ์ ์ค์ธ ๋ด์ฉ๊ณผ ๊ด๋ จ์ด ์์ด ๋ณด์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ์์๊ณผ ๊ฐ์ ์์ง๋์ด๋ง ๋์ Scene ์์๋ฅผ ๊ตฌ์ฑํ์ฌ ๋์์ ๊ตฌ์ถํ๋ Godot์ ์์คํ ์ ์ค์ ๋ก ์ข์ํฉ๋๋ค. ์ด๋ฌํ "๊ธฐ์ฌ๋" ๊ด๊ณ๋ ๋ณ๊ฒฝ๋์ง ์๊ณ ์ ์ ์ ๋๋ค. OTOH, ์ฅ๋ฉด ๊ตฌ์กฐ๋ ๋์ ์ด๋ฉฐ ๋ฐํ์์ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค. ๊ฒ์ ๋ก์ง์ ๊ฐ๋ฐํ๋ ๋์ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ Godot์ ๋์์ธ์ด ์ฌ์ฉ ์ฌ๋ก์ ์์ฃผ ์ ๋ง๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
์์ ๋ ธ๋๊ฐ ๋ฃจํธ ๋ ธ๋์ ๋์ ํ์ฅ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฒ์ด ์ฌ์ค์ด์ง๋ง ๊ทธ๋ ๋ค๊ณ ํด์ ์๊ธ์์กฑ์ด ๋ถ์กฑํ ๊ฒ์ ์๋๋๋ค(IMO). ํ์ด๋จธ๋ ์๊ฐ์ ์ต์ํด์ง๋ ๊ฒ๊ณผ ์๊ด์์ด ์๋ฒฝํ๊ฒ ๋ ๋ฆฝ์ ์ด๋ฉฐ ๋์์ ์์ธกํ ์ ์์ต๋๋ค. ์๊ฐ๋ฝ์ผ๋ก ์ํ๋ฅผ ๋จน๋ ์์ด์คํฌ๋ฆผ์ ๋จน๋ ์์ ๋ป๋ ์ญํ ์ ํ๋ฉด์๋ ์ ๊ธฐ๋ฅ์ ์ ๋๋ก ๋ฐํํ๋ค. ๋๋ ๋ฃจํธ ๋ ธ๋๋ฅผ ์์ ๋ ธ๋์ ๋์์ ์กฐ์ ํ๋ ๊ฑฐ์ฅ์ผ๋ก ๊ฐ์ฃผํ๋ฏ๋ก ์๋ก์ ๋ํด ์ง์ ์ ํ์๊ฐ ์์ผ๋ฉฐ ๋ฐ๋ผ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ง๋ ์ ์์ต๋๋ค. ์์/๋ฃจํธ ๋ ธ๋๋ ์ฑ ์์ ์์ํ์ง๋ง ์ง์ ์ ์ธ ์์ ์ ๋ง์ด ์ํํ์ง ์๋ ๋ฐ์คํฌ ๋ฐ์ธ๋ฉ๋ ๊ด๋ฆฌ์์ ๋๋ค. ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๋ค๋ฅธ ๋์์ ์ํด ์ ๊ฒ์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ฃจํธ ๋ ธ๋๋ ์ ์ฒด ์ธ์คํด์ค ๋ถ๊ธฐ์ ๊ธฐ๋ฅ์ ๋ํ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค ์ญํ ๋ ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ธ์คํด์ค์์ ์กฐ์ ํ ์ ์๋ ๋ชจ๋ ์์ฑ์ ์์ฑ์ ์ต์ข ์์ ์๊ฐ ์ผ๋ถ ์์ ๋ ธ๋์ธ ๊ฒฝ์ฐ์๋ ๋ถ๊ธฐ์ ๋ฃจํธ ๋ ธ๋์์ "์ค์ ๊ฐ๋ฅ"ํด์ผ ํฉ๋๋ค. ์ ๊ฐ ๋์น๊ณ ์๋ ๊ฒ์ด ์๋ค๋ฉด, ์ด๊ฒ์ Godot์ ํ์ฌ ๋ฒ์ ์์ ์๋์ผ๋ก ์ ๋ ฌ๋์ด์ผ ํฉ๋๋ค. ๋์ ์์คํ ์ ์ด์ ๊ณผ ๋ ์ฌ์ด ์คํฌ๋ฆฝํ ์ ๊ฒฐํฉํ๊ธฐ ์ํด ์ด๊ฒ์ด ์ด๋ป๊ฒ๋ ์๋ํ๋ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๋ด๊ฐ ์๊ฐํ๊ณ ์๋ ํ ๊ฐ์ง๋ Node.js์ ํ์ ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋ "๋์ ์์" ์์คํ
์
๋๋ค. ๊ทธ๋ฌํ ์คํฌ๋ฆฝํธ์๋ ์์ฑ/๋ฉ์๋์ ๋ ๊ฐ์ง ์์ค๊ฐ ์์ต๋๋ค. ํ๋๋ ํ์ฅํ๋ ์คํฌ๋ฆฝํธ์ ์์ค์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์ฅ๋ฉด ๊ตฌ์กฐ ๋ด์ ์์์์ "๋ฒ๋ธ์
๋" ์์ค์
๋๋ค. ๋ฐ๋ผ์ Bomb์ ๋ํ ๋ด ์์ ๋ bomb.gd ์คํฌ๋ฆฝํธ์ ๋ฉค๋ฒ ๋ณ์ ์น์
๋ด์์ export lifted var $Timer.wait_time [= value?] as detonation_time
์ ๊ฐ์ด ๋ฉ๋๋ค. ์์คํ
์ ๊ธฐ๋ณธ์ ์ผ๋ก _ready ์ฝ๋ฐฑ์์ $Timer.wait_time = detonation_time
๋ฅผ ์์ฑํ๊ณ Bomb ๋
ธ๋์ ๋ถ๋ชจ๋ก๋ถํฐ $Bomb.detonation_time = 5
๋ฅผ ํ์ฉํ์ฌ $Timer.wait_time = 5
๊ฐ ์ค์ ๋๋๋ก ํ๋ getter/setter๋ฅผ ์์ฑํฉ๋๋ค.
MoveRightTrait๊ฐ ์๋ OP์ ์์์๋ mysprite.gd๊ฐ ์ฐ๊ฒฐ๋ ๋
ธ๋์ MoveRightTrait๊ฐ ์์ ๋
ธ๋๋ก ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ mysprite.gd์ lifted func $MoveRightTrait.move_right [as move_right]
์ ๊ฐ์ ํญ๋ชฉ์ด ์์ต๋๋ค(์ด๋ฆ์ด ๊ฐ์ ๋ 'as'๋ ์ ํ ์ฌํญ์ผ ์ ์์). ์ด์ mysprite.gd์์ ์์ฑ๋ ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋ํด move_right๋ฅผ ํธ์ถํ๋ฉด ์๋์ผ๋ก ์ ์ ํ ์์ ๋
ธ๋์ ์์๋ฉ๋๋ค. ์๋ง๋ ์ ํธ๊ฐ ๋ฒ๋ธ๋ง๋์ด ๋ฃจํธ์์ ์์ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ์ ์์ต๋๊น? ์๋ง๋ ์ ์ฒด ๋
ธ๋๋ func, signal ๋๋ var ์์ด lifted $MoveRightTrait [as MvR]
๋ก ๋ฒ๋ธ๋ง๋ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ MoveRightTrait์ ๋ชจ๋ ๋ฉ์๋์ ์์ฑ์ mysprite.move_right๋ก mysprite์์ ์ง์ ์ก์ธ์คํ๊ฑฐ๋ 'as MvR'์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ mysprite.MvR.move_right๋ฅผ ํตํด ์ก์ธ์คํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ธ์คํด์ค ๋ธ๋์น์ ๋ฃจํธ์ ์๋ ์ฌ ๊ตฌ์กฐ์ ๋ํ ์ธํฐํ์ด์ค ์์ฑ์ ๋จ์ํํ๊ณ , ๊ทธ๋ค์ "๋ธ๋๋ฐ์ค" ํน์ฑ์ ์ฆ๊ฐ์ํค๊ณ Godot์ ๋ค์ด๋ด๋ฏนํ ์ฌ ์์คํ ์ ํ๊ณผ ํจ๊ป ์คํฌ๋ฆฝํ ํธ์์ฑ์ ์ป๋ ๋ฐฉ๋ฒ์ ๋ํ ํ๋์ ์์ด๋์ด์ ๋๋ค. ๋ฌผ๋ก ๊ณ ๋ คํด์ผ ํ ์ธก๋ฉด ์ธ๋ถ ์ฌํญ์ด ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ธฐ๋ณธ ํด๋์ค์ ๋ฌ๋ฆฌ ์์ ๋ ธ๋๋ ๋ฐํ์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ํด๋น ์ค๋ฅ์ ๊ฒฝ์ฐ ํธ์ถ/์ก์ธ์คํ๋ ๊ฒฝ์ฐ ๋ฒ๋ธ๋ง/๋ฆฌํํธ๋ ํจ์ ๋ฐ ์์ฑ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํฉ๋๊น? ์ฌ๋ฐ๋ฅธ NodePath๊ฐ ์๋ ๋ ธ๋๊ฐ ๋ค์ ์ถ๊ฐ๋๋ฉด ํด์ ๋ ์์ฑ์ด ๋ค์ ์๋ํ๊ธฐ ์์ํฉ๋๊น? [YES, IMO] ๋ํ Node์์ ํ์๋์ง ์์ ํด๋์ค์์ 'lifted'๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ๋ฒ๋ธ/๋ฆฌํํธํ ์์์ด ์ ๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ํ ๋ ธ๋์ ๋์ผํ ์ด๋ฆ์ ์์ฑ/๋ฉ์๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ค๋ณต๋ "as {name}" ๋๋ "lifted $Timer1 lifted $Timer2"๋ก ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์คํฌ๋ฆฝํธ ์ธํฐํ๋ฆฌํฐ๋ ์ด๋ฌํ ๋ ผ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ์ด์์ ์ผ๋ก ๊ฐ์งํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ ๋ฌ ํจ์์ ์ด๊ธฐํ๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ ๋จ์ง ๊ตฌ๋ฌธ์์ ์คํ์ผ์ง๋ผ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ ๋ง์ด ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋ ์ ์ผ๋ก ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ๊ตฌํํ๊ฑฐ๋ ์ค๋ช ํ๋ ๊ฒ์ด ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ ๊ฒ์ ๋๋ค.
์ด์จ๋ ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์ จ๋ค๋ฉด ๊ฐ์ฌํฉ๋๋ค!
๋๋ ๋ชจ๋ ๊ณณ์์ "๋ค์ด ์ฌ๋ฆฐ"์ ์ฌ์ฉํ์ง๋ง ๊ทธ๊ฒ์ ๋จ์ง ์์์ผ ๋ฟ์
๋๋ค.
using var $Timer.wait_time as detonation_time
๋๋ using $Timer
์ ๊ฐ์ ๊ฒ๋ ๋ถ๋ช
ํ ์ข์ต๋๋ค. ์ด๋ค ๊ฒฝ์ฐ๋ ์์ ๋
ธ๋์์ ํธ๋ฆฌํ๊ฒ ์์ฌ ์์์ ๋ฐ์ ์ ์์ผ๋ฏ๋ก ์ธ์คํด์คํํ ๋ถ๊ธฐ์ ๋ฃจํธ์์ ์ํ๋ ๊ธฐ๋ฅ์ ๋ํ ์ผ๊ด๋ ๋จ์ผ ์ก์ธ์ค ์ง์ ์ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ ๋ถ๋ถ์ ๋ํ ์๊ตฌ ์ฌํญ์ ๋
ธ๋ ๋๋ ํด๋น ํ์ ํด๋์ค๋ฅผ ํ์ฅํ์ฌ ๋ ํฐ ๊ตฌ์ฑ ์์์ ์์์ผ๋ก ์ถ๊ฐํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๊ทธ๊ฒ์ ๋ณด๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ ธ๋์์ ์์๋ ์คํฌ๋ฆฝํธ์ "ํ์ฅ" ํค์๋๊ฐ "is-a" ๊ด๊ณ๋ฅผ ์ ๊ณตํ๋ ๋ฐ๋ฉด ์คํฌ๋ฆฝํธ์์ "์ฌ์ฉ" ๋๋ "๋ฆฌํํธ" ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ "๋ฒ๋ธ์ "ํ๋ค๋ ๊ฒ์ ๋๋ค. ์์ ๋ ธ๋์ ๋ฉค๋ฒ๋ ๋จ์ผ ์์์ด์ง๋ง ๋ค์ค "์ธํฐํ์ด์ค"(์: Java)๊ฐ ์๋ ์ธ์ด์ ์กด์ฌํ๋ "๊ตฌํ"[ํค์ด, ๊ฐ๋ฅํ ํค์๋]๊ณผ ์ ์ฌํ ๊ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ฌด์ ํ ๋ค์ค ์์(์: C++)์์ ๊ธฐ๋ณธ ํด๋์ค๋ [์ ์ ์์ฑ] ํธ๋ฆฌ๋ฅผ ํ์ฑํฉ๋๋ค. ๋น์ ํ์๋ฉด ์ ๋ Godot์ ๊ธฐ์กด ๋ ธ๋ ํธ๋ฆฌ ์์ ํธ๋ฆฌํ ๊ตฌ๋ฌธ๊ณผ ์์ฉ๊ตฌ ์ ๊ฑฐ๋ฅผ ๋ ์ด์ด๋งํ๋ ๊ฒ์ ์ ์ํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ํ๊ตฌํ ๊ฐ์น๊ฐ ์๋ค๊ณ ํ๋จ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋์์ธ ๊ณต๊ฐ ์ธก๋ฉด์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
1) "์ฌ์ฉ"์์ ์ง๊ณ ์๋
๋ง ํ์ฉํด์ผ ํฉ๋๋ค. IOW using $Timer
๋ ์๋์ง๋ง using $Bomb/Timer'? This would be simpler but would force us to write boilerplate in some cases. I say that a full NodePath ROOTED in the Node to which the script is attached should be legal [but NO references to parents/siblings allowed].
2) Should there be an option that
find_node์ the "using"-ed node instead of following a written in NodePath? For example
using "Timer" with a string for the pattern would be slower but the forwarding architecture would continue to work if a referenced node's position in the sub-tree changes at run time. This could be used selectively for child nodes that we expect to move around beneath the root. Of course syntax would have to be worked out especially when using a particular member (eg.
using var "Timer".wait_time as detonation_time is icky).
3) Should there be a way query for certain functionality [equivalent to asking if an interface is implemented or a child node is present]? Perhaps "using" entire nodes with aliases should allow testing the alias to be a query. So
MoveRightTrait ์ฌ์ฉ DirectionalMover in a script would result in
node.DirectionalMover returning the child MoveRightTrait. This is logical because
node.DirectionalMover.move_right() calls the method on the child MoveRightTrait. Other nodes without that statement would return null. So the statement
node.DirectionalMover:`๊ฐ ๊ด๋ก์ ๋ฐ๋ผ ๊ธฐ๋ฅ ํ
์คํธ๊ฐ ๋๋ค๋ฉด.
4) ์ํ ํจํด์ "using"-ed ๋
ธ๋๋ฅผ "using" ๋ฌธ์์ ์ฐธ์กฐ๋ ๊ฒ๊ณผ ๋์ผํ ์ธํฐํ์ด์ค[๋ ํ์ดํ] ๋ฐ ๋์ผํ NodePath๋ฅผ ๊ฐ์ง๋ง ๋ณํ ๋์์ ๊ฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ก ๊ต์ฒดํ์ฌ ๊ตฌํ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค. ์ฅ๋ฉด ํธ๋ฆฌ๊ฐ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ์ด๊ฒ์ ๊ฑฐ์ ๋ฌด๋ฃ๋ก ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์คํ
์ ์์๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ์ ํธ๋ฅผ ์ถ์ ํ๊ณ ๊ต์ฒด๋ ํ์์์ ์ฐ๊ฒฐ์ ๋ณต์ํด์ผ ํฉ๋๋ค.
์ ๋ ์ง๊ธ ํ๋์ GDScript๋ก ์์ ํด ์์ผ๋ฉฐ ์ด๋ค ์ข ๋ฅ์ ํน์ฑ/๋ฏน์ค์ธ ๋ฐ ํ๋ก์/์์ ๊ธฐ๋ฅ์ด ์ ์คํ ํ์ํ๋ค๋ ๋ฐ ๋์ํด์ผ ํฉ๋๋ค. ์์ฑ์ ์ฐ๊ฒฐํ๊ฑฐ๋ ์ฅ๋ฉด์ ๋ฃจํธ์ ์๋ ์์ ๋ฉ์๋๋ฅผ ๋ ธ์ถํ๊ธฐ ์ํด ์ด ๋ชจ๋ ์์ฉ๊ตฌ๋ฅผ ์ค์ ํด์ผ ํ๋ ๊ฒ์ ์๋นํ ์ฑ๊ฐ์ ์ผ์ ๋๋ค.
๋๋ ๊ตฌ์ฑ ์์๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด์๋ง ํธ๋ฆฌ ์์ค์ ์ถ๊ฐํฉ๋๋ค(๊ฐ ์ ๊ตฌ์ฑ ์์๋ก ๋ชจ๋ ๋ ธ๋ ๊ฒฝ๋ก๋ฅผ ๊นจ๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋นํ ๋นจ๋ฆฌ ๋ณต์กํด์ง๋๋ค). ํ ๋ ธ๋์์ ์ฌ๋ฌ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๋ ๋ฉํ/๋ฉํฐ ์คํฌ๋ฆฝํธ์ ๊ฐ์ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๊ด์ฉ์ ์ธ ์๋ฃจ์ ์ด ์์ผ๋ฉด ๊ณต์ ํ์ญ์์ค ...
C++(GDNative)๋ฅผ ๋ฏน์ค์ ๋ฃ์ผ๋ฉด _ready
๋ฐ _init
๊ฐ ์๋ก ๋ค๋ฅด๊ฒ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ํฉ์ด ๋์ฑ ์
ํ๋ฉ๋๋ค(์ฝ๊ธฐ: ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ ์ด๊ธฐํ๊ฐ ๋ฐ์ฏค ์๋ํ๊ฑฐ๋ ์ ํ ์๋ํ์ง ์์).
์ด๊ฒ์ด ๋ด๊ฐ GDScript์์ ํด๊ฒฐํด์ผ ํ๋ ์ฃผ์ ์ฌํญ์ ๋๋ค. ์ ์ฒด ์์ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ฑํ์ง ์๊ณ ๋ ธ๋ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ณต์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๋ ์ด์ด์ ์์ ์ฃผ์ธ์๊ฒ๋ ์ธ๋ฒคํ ๋ฆฌ๊ฐ ์๊ณ , ํ๋ ์ด์ด+์์ดํ +์ ์๊ฒ๋ ํต๊ณ๊ฐ ์๊ณ , ํ๋ ์ด์ด์ ์ ์๊ฒ๋ ์ฅ๋น ์์ดํ ์ด ์์ต๋๋ค.
ํ์ฌ ๋๋ ์ด๋ฌํ ๊ณต์ '๊ตฌ์ฑ ์์'๋ฅผ ์ด๋ฅผ ํ์๋ก ํ๋ '์ํฐํฐ'์ ๋ก๋๋ ํด๋์ค ๋๋ ๋ ธ๋๋ก ๊ตฌํํ์ง๋ง ์ง์ ๋ถํ๊ณ (๋ ธ๋์ ๋ํ ๋ง์ ๊ฒ์์ ์ถ๊ฐํ๊ณ ์ค๋ฆฌ ํ์ดํ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๋ฑ) ๋์ฒด ์ ๊ทผ ๋ฐฉ์์๋ ์์ฒด ๋จ์ ์ด ์์ผ๋ฏ๋ก ๋ ๋์ ๋ฐฉ๋ฒ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค. ํน์ฑ/๋ฏน์ค์ธ์ ๋ด ์๋ช ์ ์ ๋์ ์ผ๋ก ๊ตฌํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก ์ ์์์ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ์๊ฐ์ ์ด๊ฒ์ ํ์ฌ Godot์์ ๊น๋ํ๊ฒ ์ํํ๋ ๊ฒ์ด ํ์ํ์ง๋ง ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ด๊ฐ Rust ํน์ฑ(https://doc.rust-lang.org/1.8.0/book/traits.html)์ ์ดํดํ๋ ๋ฐฉ์์ ๊ทธ๋ค์ด Haskell ์ ํ ํด๋์ค์ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ์ ํ์ ๋ํด ์ ์ํด์ผ ํ๋ ์ผ๋ถ ๋งค๊ฐ๋ณ์ํ๋ ํจ์๊ฐ ํ์ํฉ๋๋ค ํน์ฑ์ ์ถ๊ฐํ๊ณ ํน์ฑ์ ๊ตฌํํ๋ ๋ชจ๋ ์ ํ์ ๋ํด ์ ์๋ ์ผ๋ถ ์ผ๋ฐ ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. Rust ํน์ฑ์ด ์ฌ๊ธฐ์ ์ ์๋ ๊ฒ๊ณผ ๋ค๋ฅธ๊ฐ์?
์ฌ๊ธฐ์์ ๊ด๋ฒ์ํ๊ฒ ๋ ผ์๋์๊ธฐ ๋๋ฌธ์ ์ด ํญ๋ชฉ์ ์๋ง๋ ๋๋งค๋ก ๋ง์ด๊ทธ๋ ์ด์ ๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์์ ๊ด๋ฒ์ํ๊ฒ ๋ ผ์๋์๊ธฐ ๋๋ฌธ์ ์ด ํญ๋ชฉ์ ์๋ง๋ ๋๋งค๋ก ๋ง์ด๊ทธ๋ ์ด์ ๋ ๊ฒ์ ๋๋ค.
_๋๋ ์ ์์ "์ด๋"์ด ๋ฌด์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฌ๋๋ค์ด ๊ด์ฌ์ ํ๋ช ํ๋ฉด godot-proposals๋ฅผ ๋ซ๊ณ ๋ค์ ์ด๋๋ก ์์ฒญํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ์์ ์ค์ ๋ก ๊ตฌํํ๋๋ก ์์ฒญํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด์จ๋ ..._
๋๋ 1๋ ์ ์ ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ง๋ฌ์ง๋ง ์ด์ ์์ผ ํน์ฑ ์์คํ ์ ์ ์ฌ์ ์ธ ์ ์ฉ์ฑ์ ์ดํดํ๊ธฐ ์์ํ์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๋ฌธ์ ๋ฅผ ๋ ์ ์ดํดํ๋๋ก ์๊ฐ์ ์ฃผ๊ธฐ ์ํด ํ์ฌ ์์ ํ๋ฆ์ ๊ณต์ ํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ํน์ฑ ์์คํ ์ ๊ตฌํํ๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๋์์ ์ ์ํ ์ ์์).
@willnationsdev https://github.com/godotengine/godot/issues/23101#issuecomment -431468744
์ด์ ์ด๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๊ฒ์ ์ค๋ํซ ์์คํ ์ด๋ ๋งคํฌ๋ก ์์คํ ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฌ์ฉ๋๋ ์ ์ธ์ ์ฝ๋ ์น์ ์ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
๋น์ ์ ๋ฐ์์ทจ๋ฅผ ๋ฐ๋ผ ๊ฑท๋๋ค... ๐
tool
extends EditorScript
const TYPES = [
'Node',
'Node2D',
]
const TYPES_PATH = 'types'
const TYPE_BASENAME_TEMPLATE = 'component_%s.gd'
const TEMPLATE = \
"""class_name Component{TYPE} extends {TYPE}
signal host_assigned(node)
export(bool) var enabled = true
export(NodePath) var host_path
var host
func _ready():
ComponentCommon.init(self, host_path)"""
func _run():
_update_scripts()
func _update_scripts():
var base_dir = get_script().resource_path.get_base_dir()
var dest = base_dir.plus_file(TYPES_PATH)
for type in TYPES:
var filename = TYPE_BASENAME_TEMPLATE % [type.to_lower()]
var code = TEMPLATE.format({"TYPE" : type})
var path = dest.plus_file(filename)
print_debug("Writing component code for: " + path)
var file = File.new()
file.open(path, File.WRITE)
file.store_line(code)
file.close()
class_name ComponentCommon
static func init(p_component, p_host_path = NodePath()):
assert(p_component is Node)
# Try to assign
if not p_host_path.is_empty():
p_component.host = p_component.get_node(p_host_path)
elif is_instance_valid(p_component.owner):
p_component.host = p_component.owner
elif is_instance_valid(p_component.get_parent()):
p_component.host = p_component.get_parent()
# Check
if not is_instance_valid(p_component.host):
push_warning(p_component.name.capitalize() + ": couldn't find a host, disabling.")
p_component.enabled = false
else:
p_component.emit_signal('host_assigned')
์ฒซ ๋ฒ์งธ ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋ ๊ตฌ์ฑ ์์(ํน์ฑ)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class_name ComponentNode2D extends Node2D
signal host_assigned(node)
export(bool) var enabled = true
export(NodePath) var host_path
var host
func _ready():
ComponentCommon.init(self, host_path)
@vnen https://github.com/godotengine/godot/issues/23101#issuecomment -471816901
๊ทธ๊ฒ ๋ด ์๊ฐ์ด์ผ. ๋๋ ๊ทธ๊ฒ์ด ์ถฉ๋ถํ ๊ฐ๋จํ๊ณ ์ฝ๋ ์ฌ์ฌ์ฉ์ ๋ํ ๊ฑฐ์ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค. ๋๋ ํน์ฑ์ ์ฌ์ฉํ๋ ํด๋์ค๊ฐ ํน์ฑ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋๋ก ํ์ฉํ ๊ฒ์ ๋๋ค(์ปดํ์ผ ํ์์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ). ํน์ฑ์ ๋ค๋ฅธ ํน์ฑ์ ํ์ฅํ ์๋ ์์ต๋๋ค.
๋น์ ์ ๋ฐ์์ทจ๋ฅผ ๋ฐ๋ผ ๊ฑท๋๋ค... ๐
class_name ComponentMotion2D extends ComponentNode2D
const MAX_SPEED = 100.0
var linear_velocity = Vector2()
var collision
export(Script) var impl
...
์ค์ ๋ก ๋ด๋ณด๋ธ Script
๋ ๊ตฌ์ฑ ์์๋น ํน์ ํธ์คํธ/๋ฃจํธ ๋
ธ๋ ์ ํ์ ๋์์ ๊ตฌ๋ํ๊ธฐ ์ํด ์ด๋ฌํ ๊ตฌ์ฑ ์์์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ComponentMotion2D
์๋ ์ฃผ๋ก ๋ ๊ฐ์ ์คํฌ๋ฆฝํธ๊ฐ ์์ต๋๋ค.
motion_kinematic_body_2d.gd
motion_rigid_body_2d.gd
๊ทธ๋์ ์์ด๋ค์ ์ฌ์ ํ โโ์ฌ๊ธฐ์ host
/ root
ํ๋์ ํฉ๋๋ค. host
์ฉ์ด๋ ๋ด๊ฐ ์ํ ๋จธ์ ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์จ ๊ฒ์ด๋ฉฐ, ์ํ๊ฐ ๋
ธ๋ imo๋ก ๋ ์ ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ํน์ฑ์ด ์๋ฒฝํ๊ฒ ์ ํฉํ์ง ์์ ์ ์๋ ๋ถ๋ถ์ด ์ฌ๊ธฐ์ ์์ต๋๋ค.
๊ตฌ์ฑ ์์ ์์ฒด๋ onready
๋ฉค๋ฒ๋ก ๋ง๋ค์ด ๋ฃจํธ์ "ํ๋์์ด์ด๋ง"๋์ด ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ค์
๋๋ค(์ค์ ๋ก ์ด๋ค์ object.motion
๋ก ์ฐธ์กฐํด์ผ ํ๋ ๋น์ฉ ๋ถ๋ด).
extends KinematicBody2D
onready var motion = $motion # ComponentMotion2D
์ด๊ฒ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ ์ง ํ์คํ์ง ์์ง๋ง C#์๋ ํด๋์ค ์ ํ์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ํ์ฅ ๋ฉ์๋ ๋ผ๋ ๊ฒ์ด ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๋ ์ ์ ์ด์ด์ผ ํ๋ฉฐ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ํ์์ด๋ฉฐ self
์ฌ์ผ ํฉ๋๋ค. ์ ์๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ์ฅ์.gd
# any script that uses this method must be an instance of `Node2D`
static func distance(self source: Node2D, target: Node2D):
return source.global_position.distance_to(target.global_position)
# any script that uses this method must be an instance of `Rigidbody2D`
# a `Sprite` instance cannot use this method
static func distance(self source: Rigidbody2D, target: Node2D):
return source.global_position.distance_to(target.global_position)
๊ทธ๋ฐ ๋ค์ distance
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํฉ๋๋ค.
ํ๋ ์ด์ด.gd
func _ready() -> void:
print(self.distance($Enemy))
print($BulletPoint.distance($Enemy))
๋๋ ๊ทธ๊ฒ์ ์ต์ํ์ง๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด๋์ง ์์ต๋๋ค. ํคํค ๊ทธ๋๋ ๊ฐ์ฌํฉ๋๋ค.
@TheColorRed ํ์ฅ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ์ ์๋์์ง๋ง ๋์ ์ธ์ด์์๋ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ํ ๊ทธ๋ค์ด ์ฒ์์ ์ด ํ ๋ก ์ ์์ํ ๊ทผ๋ณธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ฐธ๊ณ ์ฌํญ์ผ๋ก, GDScript์ ๋ํ ๋ง์ ์ ์์ GIP๋ก ์ด ๊ฒ์ ๋๋ค( @willnationsdev ๊ฐ ์๊ดํ์ง ์๋ ๊ฒฝ์ฐ ํฌํจ๋จ).
๋๋ ์ฌ์ ํ ํน์ฑ์ด OO ์ธ์ด์์ ์ํ์ผ๋ก ์ฝ๋๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค(๋ค์ค ์์ ์์ด, ํ์ง๋ง ๊ทธ๋ ๊ฒ ๊ฐ๊ณ ์ถ์ง๋ ์์ต๋๋ค).
๋์ ์ธ์ด์์๋ ์คํ ๊ฐ๋ฅํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
GDS๋ ๋์ ์ ๋๊น? ํ์ฅ ๋ฉ์๋๋ ์ ํ์ด ์ง์ ๋ ์ธ์คํด์ค๋ก๋ง ์ ํ๋ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ธ์ด์์์ ์ ํํ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. ์ปดํ์ผ ์ค ๋ฉ์๋ ํธ์ถ์ ์ ์ ๋ฉ์๋(ํจ์) ํธ์ถ๋ก ๋์ฒดํ๋ ๊ตฌ๋ฌธ ์คํ๋ฟ์ ๋๋ค. ์์งํ ๋งํด์, ์ ๋ ํ๋กํ ํ์ ala JS ๋๋ ๋ฉ์๋๋ฅผ ํด๋์ค ๋๋ ์ฌ์ง์ด ์ธ์คํด์ค์ ์ฐ๊ฒฐํ๋ ๋ค๋ฅธ ๋์ ๋ฐฉ๋ฒ๋ณด๋ค ๋จผ์ ํฌ์ฃผ(ext. ๋ฉ์๋)๋ฅผ ์ ํธํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ ์ง ์ด๋ฆ์ "ํฌ์ฃผ"๋ก ์ง์ ํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
GDS๋ ๋์ ์ ๋๊น?
์ด ๋งฅ๋ฝ์์ "๋์ "์ ๋ํ ๋ง์ ์ ์๊ฐ ์์ต๋๋ค. ๋ถ๋ช ํ ํ์๋ฉด, ๋ณ์ ์ ํ์ ์ปดํ์ผ ์๊ฐ์ ์๋ ค์ง์ง ์์ ์ ์์ผ๋ฏ๋ก ๋ฐํ์์ ๋ฉ์๋ ํ์ฅ ๊ฒ์ฌ๋ฅผ ์ํํด์ผ ํฉ๋๋ค(์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ฑ๋ฅ์ด ์ ํ๋จ).
ํ์ฅ ๋ฉ์๋๋ ์ ํ์ด ์ง์ ๋ ์ธ์คํด์ค๋ก๋ง ์ ํ๋ ์ ์์ต๋๋ค.
์ด ์์ ์ ์์ํ๋ฉด GDScript๋ฅผ ์ ํ๋ง ์ง์ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ด๊ฐ ์ฌ๊ธฐ์์ ํ์ง ๋ง์์ผ ํ ์์ ํ ๋ค๋ฅธ ๋ ผ์์ ๋๋ค.
์์ ์ ์ฌ์ฉ์๊ฐ ์คํฌ๋ฆฝํธ์ ์ ํ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์์ ์ด ์์๋๊ฑฐ๋ ์ค์ง๋์ด์๋ ์ ๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ด ๋๋ฉด ๊ฑฐ์ ํญ์ ํผ๋์ค๋ฝ์ต๋๋ค.
๋ค์ ๋งํ์ง๋ง, ๋๋ ๊ทธ๊ฒ์ด ์ด์จ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋์ผํ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์ ํ์ ์ฒจ๋ถํ๋ ค๊ณ ํ๋ ๋ฐ๋ฉด ํ์ฅ ๋ฉ์๋๋ ํ ์ ํ์๋ง ์ถ๊ฐํฉ๋๋ค.
์์งํ ๋งํด์, ์ ๋ ํ๋กํ ํ์ ala JS ๋๋ ๋ฉ์๋๋ฅผ ํด๋์ค ๋๋ ์ฌ์ง์ด ์ธ์คํด์ค์ ์ฐ๊ฒฐํ๋ ๋ค๋ฅธ ๋์ ๋ฐฉ๋ฒ๋ณด๋ค ๋จผ์ ํฌ์ฃผ(ext. ๋ฉ์๋)๋ฅผ ์ ํธํฉ๋๋ค.
์๋ฌด๋ (๋ฐํ์์) ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ (์์ง) ์ ์ํ์ง ์์์ผ๋ฉฐ ๋๋ ์ํ์ง ์์ต๋๋ค. ํน์ฑ์ ์ปดํ์ผ ์ ์ ์ ์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
์๋ Hax์ ๋ฏน์ค์ธ ๋งคํฌ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์ธ๊ธํ์ง๋ง ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ํ์ฌ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
๋๋ ์ต๊ทผ์ ์ด๊ฒ์ด ํ์ํ๊ฒ ๋์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ํธ ์์ฉํ ์ ์์ง๋ง ๋์ผํ ๋ถ๋ชจ๋ฅผ ๊ณต์ ํ ์ ์๋ ์ผ๋ถ ๊ฐ์ฒด๊ฐ ์์ง๋ง ์ ์ฌํ API ๊ทธ๋ฃน์ด ํ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋์ผํ ๋ถ๋ชจ๋ก๋ถํฐ ์์ํ ์ ์์ง๋ง ์ ์ฌํ API ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ถ ํด๋์ค๊ฐ ์์ต๋๋ค.
์ฐฝ๊ณ : ์ฌ์ , ์ญ์ , MouseInteraction + ๊ธฐํ
์ฐจ๋: ์ฌ์ , ์ญ์ , MouseInteraction + ๊ธฐํ
VehicleTerminal: ์ฌ์ , ์ญ์ , MouseInteraction + ๊ธฐํ
์ฌ์ ์ ๊ฒฝ์ฐ get_finances_component()๊ฐ ๊ฒ์ ๊ฐ์ฒด์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ถฉ๋ถํ API์ด๋ฏ๋ก ์ต์ํ์ ์์ฉ๊ตฌ ์ฝ๋๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋:
MouseInteraction ๋ฐ Deection ๊ฒ์ ๊ฐ์ฒด์ ๋ํด ์์์ผ ํ๋ฏ๋ก ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด์ํ ์์์ ํ์ง ์๋ ํ ์ผ๋ถ ๊ตฌ์ฑ์ ์ฌ๊ธฐ์์ ์๋ํ์ง ์์ต๋๋ค.
Warehouse:
func delete():
get_delete_component().delete(self);
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์์๋ ํด๋์ค๋ผ๋ฉด ํ์ํ ๊ฒฝ์ฐ ์ญ์ ์ฝ๋์ ์ผ๋ถ๋ฅผ ๋ค์ ์์ฑํ ์ ์๋ ์ญ์ ์๋ ๋ฐฉ์์ ์ฌ์ ์ํ ์๋ ์์ต๋๋ค.
๋ง์ฐ์ค ์ํธ ์์ฉ ๋ฐ ์ ํ ๊ฒ์ ๊ฐ์ฒด์ ๋ํด ์์์ผ ํ๋ฏ๋ก ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด์ํ ์์์ ํ์ง ์๋ ํ ์ผ๋ถ ๊ตฌ์ฑ์ ์ฌ๊ธฐ์์ ์๋ํ์ง ์์ต๋๋ค.
ํ์ฌ onready
๋
ธ๋๋ฅผ ํตํด ๊ตฌ์ฑ ์์์ ์ก์ธ์คํฉ๋๋ค. ๋น์ทํ ์ผ์ํ๊ณ ์์ต๋๋ค.
# character.gd
var input = $input # input component
func _set(property, value):
if property == "focused": # override
input.enabled = value
return true
๊ทธ๋์ ์ด๊ฑฐ:
character.input.enabled = true
๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
character.focused = true
@Calinou๊ฐ ์น์ ํ๊ฒ ๋ด ๋ฌธ์ ๋ฅผ ์ง์ ํ๋ฏ์ด https://github.com/godotengine/godot-proposals/issues/758 ์ ์ด๊ฒ๊ณผ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค. ๊ทธ๋ฃน์ ํน์ฑ์ ์ถ๊ฐํ ์ ์๋ค๋ ์ ์์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น? ์ด๋ก ์ธํด ์คํฌ๋ฆฝํธ ๋ฐ ๊ธฐํ ์ค๋ฒํค๋๊ฐ ํฌ๊ฒ ํ์ํ ์ ์์ต๋๋ค.
๊ณต์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ํด๋์ค์ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ฐ์ ๋ด๋ณด๋ธ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ฐ์ด ์ธ์คํํฐ์ ํ์๋๊ณ ๋ฉ์๋์ ์์ฑ์ ์ฌ์ฉํ ์ ์๊ณ ์ฝ๋ ์์ฑ์ผ๋ก ๊ฐ์งํ ์ ์์ต๋๋ค.
Godot ์์ง์ ๋ํ ๊ธฐ๋ฅ ๋ฐ ๊ฐ์ ์ ์์ ํ์ฌ ์ ์ฉ Godot ๊ฐ์ ์ ์(GIP) ( godotengine/godot-proposals ) ์ด์ ํธ๋์ปค์์ ๋ ผ์๋๊ณ ๊ฒํ ๋๊ณ ์์ต๋๋ค. GIP ์ถ์ ๊ธฐ์๋ ์ ์์์ ๋ชจ๋ ๊ด๋ จ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ฐ์ ์ธ ํ ๋ก ์ ์์ํ๊ณ ์ปค๋ฎค๋ํฐ๊ฐ ์์ง ์ ์์์ ์ ํจ์ฑ์ ํ๊ฐํ๋ ๋ฐ ๋์์ด ๋๋๋ก ์ค๊ณ๋ ์์ธํ ๋ฌธ์ ํ ํ๋ฆฟ์ด ์์ต๋๋ค.
๊ธฐ๋ณธ( godotengine/godot ) ์ถ์ ๊ธฐ๋ ์ด์ ์ ์ ์ผ๋ก ๋ฒ๊ทธ ๋ณด๊ณ ์ ๋ฐ ๋์ด์ค๊ธฐ ์์ฒญ ์ ์ฉ์ด๋ฏ๋ก ๊ธฐ์ฌ์๊ฐ ๋ฒ๊ทธ ์์ ์์ ์ ๋ ์ง์คํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์ ์ฃผ์ ์ด์ ํธ๋์ปค์์ ์ด์ ๊ธฐ๋ฅ ์ ์์ ๋ชจ๋ ์ข ๋ฃํฉ๋๋ค.
์ด ๊ธฐ๋ฅ ์ ์์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ฃผ์ด์ง ๋ฌธ์ ํ ํ๋ฆฟ ์ ๋ฐ๋ผ GIP ํธ๋์ปค์์ ์ ์ ์์ ์ฌ์ญ์์ค (์ด๋ฏธ ์กด์ฌํ์ง ์๋์ง ํ์ธํ ํ). ๊ด๋ จ ํ ๋ก ์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ด ๋ซํ ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค(์ ์ ์์์ ์์ฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค). ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ฐธ๊ณ : ์ด๊ฒ์ ์ธ๊ธฐ ์๋ ์ ์์ ๋๋ค. ๋๊ตฐ๊ฐ ์ด๋ฅผ Godot ์ ์์ผ๋ก ์ฎ๊ธฐ๋ฉด ํ ๋ก ๋ ์์ฝํด ๋ณด์ธ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@aaronfranke Traits ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Mixins ์ ๋์ผํ๋ฉฐ ๋ฉ์๋ ๊ตฌํ์ด ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธํฐํ์ด์ค์ ์์ ํ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ต๋๋ค. ์ธํฐํ์ด์ค๊ฐ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ๋ค๋ฉด ์ค์ ๋ก ๋ ์ด์ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ฒ์ ๋๋ค.
Traits/Mixins๋ PHP, Ruby, D, Rust, Haxe, Scala ๋ฐ ๊ธฐํ ์ฌ๋ฌ ์ธ์ด (๋งํฌ๋ Wiki์ ์์ธํ ์ค๋ช ๋์ด ์์)์ ์์ผ๋ฏ๋ก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํ ๊ด๋ฒ์ํ ๋ ํผํ ๋ฆฌ๋ฅผ ๊ฐ์ง ์ฌ๋๋ค์๊ฒ ์ด๋ฏธ ๋๋ฆฌ ์น์ํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด(ํนํ ์ ํ์ ์ ์ ํ์ดํ์ด ์ค๋ ๊ฒฝ์ฐ์) ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ์ฌ์ค์ ํจ์ ์๋ช ์ ์ง์ ํ๊ณ ๊ด๋ จ GDScript ์คํฌ๋ฆฝํธ๊ฐ ํน์ฑ์ ์ฌ์ฉํ์ฌ ํด๋น ํจ์ ์๋ช ์ ๊ตฌํํ๋๋ก ์๊ตฌํ๋ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค. ํฌํจ๋ฉ๋๋ค(ํด๋น ์์ ๊น์ง ์กด์ฌํ๋ ๊ฒฝ์ฐ).