티스토리 뷰

728x90

시그널(Signal)은 노드와 노드 간에 신호를 주고받을 수 있는 체계로 위의 그림처럼 특정 노드를 선택한 상태에서 우측 "노드"창의 시그널 탭을 통해서 해당 노드에서 사용할 수 있는 시그널을 사용할 수 있다. 

 

extends Control

var accum = 0

# Called when the node enters the scene tree for the first time.
func _ready():
	get_node("Button").connect("pressed", self, "_on_Button_pressed")

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	accum += delta
	if accum > 2.0 :
		get_node("Label").text = str(accum)


func _on_Button_pressed():
	get_node("Label").text = "Pressed!!!"
	accum = 0

앞선 예제 "고도의 스크립트 맛보기(Scripting)"에서는 Button 노드에서 버튼을 누를 때 발생하는 pressed() 시그널을 루트 노드로 보내도록 하는 작업을 씬의 활성화 시점(_ready)에 수행했다. "pressed" 시그널과 수신자 _on_Button_pressed 함수를 연결했다. 시그널을 다루는 과정에서 확인해야 하는 내용은 우선 시그널의 형식으로 버튼을 눌러졌을때 처럼 인수가 없을 수도 있지만 값을 수반하는 경우도 있으므로 고도에 내장되어 있는 노드의 경우에는 사용 가능한 시그널은 무엇인지 각 시그널의 인수 형식은 무엇인지 꼭 확인해야 한다. 두 번째 필요한 작업은 시그널을 수신할 메소드를 작성해야 한다. 위의 예제에서는 _on_Button_pressed()로 고도 편집기에서 만들어 주는 기본적인 이름을 쓰는 것도 좋지만 나름의 이름을 부여해도 된다. 마지막으로 시그널을 어떤 노드에서 어떤 노드를 연결할지와 시그널 수신자를 connect()로 지정하는 것이다. 위의 예제에서는 Button 노드에서 루트 노드로 시그널을 전송하는 것이고 수신자는 루트 노드의 _on_Button_pressed() 메서드이다.

 

다른 프로그래밍 언어처럼 고도에서도 시스템에서 정의되지 않은 사용자 시그널을 정의해서 사용할 수 있다. 앞선 예제를 이어서 활용한다. Label 노드를 선택하고 위의 그림처럼 스크립트를 작성한다. 3개의 인수를 받는 사용자 시그널을 정의하고 해당 시그널을 받아 처리할 메서드를 작성했다. 메서드의 내용은 시그널에서 전달한 RGB 값을 기준으로 레이블의 폰트 색상을 변경하는 작업이다. 물론 이런 작업은 해당 노드의 속성을 직접 변경하는 것으로도 수행할 수 있지만 시그널 시스템에 대한 이해를 위한 예제이다.

 

extends Control

var accum = 0
signal my_color_change(r, g, b)

# Called when the node enters the scene tree for the first time.
func _ready():
	get_node("Button").connect("pressed", self, "_on_Button_pressed")
	connect("my_color_change", $Label, "on_color_change")
	
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	accum += delta
	if accum > 2.0 :
		get_node("Label").text = str(accum)


func _on_Button_pressed():
	get_node("Label").text = "Pressed!!!"
	emit_signal("my_color_change", 255, 0, 0)
	accum = 0

 

 

루트 노드에서도 사용자 시그널을 정의하고 이번에는 루트 노드에서 Label 노드로 사용자 시그널을 보내는 방식으로 connect() 문을 설정했다. 사용자 시그널을 발송하기 위해서는 emit_signal()을 사용해야 하는데 위의 예제에서는 버튼 시그널을 받는 시점에 사용자 시그널을 발송하여 레이블의 색상을 바꾸도록 했다.

 

위의 화면은 버튼을 눌렀을 때 발생하는 시그널과 사용자 시그널이 모두 동작한 결과 화면이다.

 

시그널 중에서도 빈번하게 사용하는 것이 바로 타이머로 일정한 시간 간격으로 특정 노드에 시그널을 전송할 수 있다. 앞선 예제에 추가해서 새 노드 만들기를 선택하고 Timer 노드 유형으로 [만들기]를 수행한다. 

 

타이머 노드는 속성에서는 "Wait Time"을 초단위로 입력하면 해당 초간격으로 시그널을 받을 수 있으며, "Autostart" 속성을 사용하도록 설정하면 씬이 활성화될 때 자동적으로 타이머가 동작한다.

 

노드 시그널은 timeout() 시그널을 더블클릭하여 위와 같은 메서드 연결 창에서 루트 노드를 선택하고 [연결]을 누른다.

 

루트 노드의 스크립트에 더미(Dummy) 시그널 수신자가 생성되는데 위의 예제처럼 시그널을 받을 때마다 버튼의 숨기기/보이기를 반복하도록 코드를 작성하고 타이머 노드에서 루트 노드로 시그널을 발송하도록 connect() 설정하면 1초 간격으로 버튼은 숨기기/보이기를 반복하고 버튼을 누를 때의 기능도 그대로 동작한다.

 

 

728x90
댓글
글 보관함
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31