본문 바로가기
프로그래밍/Godot

고도 엔진 (Godot) : 씬, 노드, 인스턴스, 상속

by drogrammer 2020. 8. 16.
반응형

1. 씬과 노드

노드는 화면 구성을 위한 빌딩 블럭이다. (예. Label, Camera, Viewport, Timer, Line2D).

은 게임 속 장면 하나를 의미하며 노드(들)로 만들어진 트리로 구성된다. 

씬과 노드
씬과 노드

 

뭔가 어려워 보이니 직접 만들어보자.  부모 노드에 네개의 자식 노드를 만들어서 사분할 후 다른 색상으로 칠해보자.

일단, 2D 로 만들 예정이므로, 단축키 'F1' 을 눌러서 2D 씬 에디터 모드로 변경하자

 

1) 부모 노드 (ColorRect) 추가

좌상단 '+' 버튼을 클릭하거나 단축키 'Ctrl + A' 를 통해 ColorRect를 추가하고 이름을 "Background"로 변경하자

배경 노드 추가 (1/2)
배경 노드 추가 (1/2)

그리고 Anchor를 0, 0, 1, 1로 설정하여 화면을 꽉 채워보자.

Anchor에 대해 궁금하면 아래 링크를 참고하자.
https://drogrammer.tistory.com/21

배경 노드 추가 (2/2)
배경 노드 추가 (2/2)

2) 자식 노드 (ColorRect) 추가

  • Background 노드를 선택한 상태에서, 다시 ColorRect 노드를 추가하고 이름을 Child1 로 변경하자.
  • Child1 를 선택하고, 'Ctrl + D' 단축키를 세번 눌러서 총 네 개의 자식 노드를 만든다. (Child1 ~ Child4)

자식 노드 추가
자식 노드 추가

  • 4분면에 빨강, 파랑, 녹색, 노랑색 사각형으로 자식노드가 배치되도록 속성을 변경한다.
노드 Anchor Color
Child1 0, 0, 0.5, 0.5 Red
Child2 0, 0.5, 0.5, 1 Blue
Child3 0.5, 0, 1, 0.5 Green
Child4 0.5, 0.5, 1, 1 Yellow

자식 노드 색상, 위치, 크기 변경
자식 노드 색상, 위치, 크기 변경

3) 결과 및 저장

아래와 같이 네가지 색상으로 사분할 된 결과를 확인할 수 있다.

결과
결과

곧 설명할 인스턴스 및 상속 개념 설명을 위해, 'Ctrl + S' 버튼을 누르고 NestedColorRects.tscn 으로 씬을 저장한다.

 

2. 인스턴스

고도 엔진의 가장 큰 장점은 씬을 타입 (클래스) 처럼 사용할 수 있다는 점이다. (흐음...) 다시 말해서, 기존에 만들어둔 씬을 타입처럼 활용하여 인스턴스를 만들어 쓸 수 있다는 것이다. (흐으음....) 다시 더 쉽게 말해도 어려울 것 같으니 직접 만들어보자. 앞서 만든 NestedColorRects.tscn 네개로 화면을 다시 사분할 해보자.

1) 씬 생성 후 부모 노드 (ColorRect) 추가

메뉴 -> Scene -> New Scene 을 선택해서 씬을 새로 생성하고, 1-1) 에서 했던 것처럼 Background 를 추가한다.

부모 추가
부모 추가

2) 자식 노드 추가 (NestedColorRects 인스턴스)

  • Background 노드 우클릭 후 "Instance Child Scene" 을 선택하고 NestedColorRect.tscn 을 선택한다.
  • 그리고 그 이름을 Child1 으로 변경한다.

인스턴스 씬 추가
인스턴스 씬 추가

  • Child1 를 선택하고, 'Ctrl + D' 단축키를 세번 눌러서 총 네개의 자식 노드를 만든다. (Child1 ~ Child4)
  • 4분면에 자식노드가 배치되도록 Anchor 속성을 변경한다. 
노드 Anchor
Child1 0, 0, 0.5, 0.5
Child2 0, 0.5, 0.5, 1
Child3 0.5, 0, 1, 0.5
Child4 0.5, 0.5, 1, 1

결과
결과

3) 조금만 더~

지금까지의 실습으로 막연하게 "다른 씬을 복사해 와서 사용할 수 있는 기능이구나!" 라고 생각하고 넘어가는 사람이 있을까봐, 조금만 더 설명하려고 한다.

실제로는 복사를 한것이 아니고, 다른 씬을 타입으로 사용해서 인스턴스를 만든 것이다.

만약 NestedColorRect.tscn 의 색상을 변경하면 어떤 일이 벌어질까?

  • 단순 복사라면, 사용하는 씬에서는 변경이 없어야 한다. (X)
  • 타입과 인스턴스 관계라면, 사용하는 씬도 함께 변경되어야 한다. (O)

테스트 해보자. NestedColorRect.tscn 씬의 우상단 (Child3) 의 색깔을 아래처럼 흰색으로 바꾸면,

NestedColorRect.tscn 우상단 색상 변경
NestedColorRect.tscn 우상단 색상 변경 (녹색 -> 흰색)

 

 

NestedColorRect를 인스턴스화 하여 사용하는 씬에서도 색상이 변경된다.

인스턴스 사용 씬에서도 색상 반영
인스턴스 사용 씬에서도 색상 반영 (녹색 -> 흰색)

 

3. 상속

1) 상속 씬 생성

메뉴 --> Scene --> New Inherited Scene 을 선택하고 앞서 만들어둔 NestedColorRects.tscn 을 열어보자.

상속 씬 생성
상속 씬 생성

 

결과적으로 NestedColorRects.tscn 을 상속받은 씬이 생성된다. 차이점은 아래와 같다

  • 부모에서 정의된 노드는 삭제가 불가능하다.
  • 하지만, 부모에서 정의된 노드의 속성은 변경 (오버라이딩) 가능하다.

상속받은 씬
상속받은 씬

 

2) 테스트 : 부모에서 상속 받은 노드 삭제 (안됨)

부모에서 정의되어 있는 Child3 노드를 우클릭해서 Delete Node(s) 를 선택하면 아래와 같이 삭제가 불가능 하다고 나온다. 

부모에서 상속 받은 노드 삭제 (안됨)
부모에서 상속 받은 노드 삭제 (안됨)

 

3) 테스트 : 부모에서 상속 받은 노드 속성 변경 (됨)

Child1 의 Anchor 값을 0, 0, 0.25, 0.25로 변경하면 아래와 같이 반영 된다.

부모에서 상속 받은 노드 속성 변경 (됨)
부모에서 상속 받은 노드 속성 변경 (됨)

4) 테스트 : 부모 씬을 변경하면 자식 노드에 반영 (오버라이드 되지 않은 속성만 됨)

부모 씬 (NestedColorRects) 의 Child1 색상을 보라색으로 바꾸면,

부모에서 노드 속성 변경
부모에서 노드 속성 변경

자식 씬도 함께 바뀐다.

부모의 노드 속성 변경이 자식에 반영 됨
부모의 노드 속성 변경이 자식에 반영 됨

반응형

댓글