본문 바로가기
GodotEngine

[GodotEngine] Tutorial 2D Game - 4

by 스누누피 2024. 12. 19.

해당 내용 출처 :) https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html

 

이전 내용:) https://twd0622.tistory.com/86

 

[GodotEngine] Tutorial 2D Game - 3

해당 내용 출처 :) https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html 이전 내용:) https://twd0622.tistory.com/81 [GodotEngine] 2D Game Tutorial - 2해당 내용 출처 :) https://docs.godotengine.org/en/stable/gett

twd0622.tistory.com

 

 

저번 포스팅에서 플레이어씬에 스크립트를 생성해 방향키에 따라 플레이어가 움직이고, 거기에 맞는 애니메이션과 충돌을 설정해주었다.

 

이번 포스팅에서는 몹을 만들어 랜덤으로 스폰되어 플레이어와 충돌이 발생하면 게임이 끝나도록 해보겠다.


4장 몹 만들기

4-1 새로운 씬 생성

저번 플레이어의 씬을 생성한것 처럼 루트노드를 만들어 줘야한다.

상단 메뉴 '씬' → 새 씬 → 다른노드에 들어가준다.

새로운 씬 생성

 

루트 노드는 'RigidBody2D'로 생성해주고 이름은 'Mob'으로 변경해준다.

  • RigidBody2D: 물리 시뮬레이션에 의해 움직이는 2D 물리 몸체 노드

그리고 자식 노드로 플레이어씬과 동일하게 'AnimatedSprite2D'와 'CollisionShape2D'를 추가해준다.

 

새로운 씬 생성

마지막으로 'VisibleOnScreenNotifier2D' 노드까지 추가해준다. 

  • VisibleOnScreenNotifier2D: 화면에 표시되는지 여부를 감지하는 2D 공간의 직사각형 영역

새로운 씬 생성

노드만 생성한 상태는 이런 사진과 같고 플레이어씬때와 마찬가지로 노드 그룹화를 깜빡하면 안된다.

 

이제 노드들의 기본적인 설정을 해주겠다.

새로운 씬 생성

먼저 'Mob' 노드에서 인스펙터 메뉴에 Gravity Scale을 '0'으로 변경해 준다. Gravity Scale은 중력에 관한 설정으로 0으로 해주면 몹들이 바닥으로 추락하는 것을 방지해준다.

 

새로운 씬 생성

그리고 아래 Collision Object2D 안에 Collision영역을 열어 Mask 속성 내부의 1을 눌러 취소해 준다. 그러면몹들 간의 충돌을 방지해준다.

 

4-2 애니메이션 삽입 & 충돌 영역 설정

이제 'AnimatedSprite2D' 노드에서 애니메이션을 삽입해줄 차례다. 저번 플레이어를 만들때 처럼 인스펙터 메뉴에 Animation 영역을 열어 Sprite Frames에 '새 SpriteFrame'을 만들어준다.

 

애니메이션 삽입 & 충돌 영역 설정

그리고 'Swim', 'Walk', 'Fly' 애니메이션을 만들어 거기에 맞는 몹의 이미지를 넣어준다.

 

애니메이션 삽입 & 충돌 영역 설정

애니메이션의 속도 설정은 각각 해줘야 함으로 3개의 애니메이션 모두 프레임을 3으로 맞춰준다.

그리고 플레이어 이미지 처럼 몹도 크기를 줄여줘야 함으로, 인스펙터 메뉴에서 Node2D 영역에 Scale을 '(0.75, 0.75)'로 해준다.

 

이번엔 충돌 영역이다. 플레이어때와 마찬가지로 'CollisionShape2D'노드의 인스펙터 메뉴에서 Shape을 '새 CapsulShape'로 생성해준다.

 

애니메이션 삽입 & 충돌 영역 설정

플레이어와 달리 몹은 가로로 누워있기 때문에 인스펙터 메뉴 Node2D 영역안에 Transform을 열고 Rotation을 '90'으로 돌려준다.

 

애니메이션 삽입 & 충돌 영역 설정

애니메이션 별로 모양이 조금씩 다르기 때문에 가장 작은 'Walk' 애니메이션에 맞춰 충돌 영역을 설정해준다.

 

여기까지 했다면 씬을 저장 해주자(작업하면서 습관적으로 틈틈이 저장해주면 더 좋다).

 

4-3 몹 스크립트 생성

씬은 생성 완료했기 때문에 몹 스크립트를 작성할 차례다.

 

몹 스크립트 생성

'Mob'노드에서 스크립트를 생성해주자

 

먼저 _ready() 함수 영역에서 애니메이션을 랜덤해서 선택해 줄 거다.

func _ready() -> void:
	# 몸 애니메이션 이름들을 배열로 불러오기
	var mob_type = $AnimatedSprite2D.sprite_frames.get_animation_names() # ["walk", "swim", "fly"]
	
	# 0-2 사이의 숫자를 임의로 선택해 애니메이션 플레이
	$AnimatedSprite2D.play(mob_type[randi() % mob_type.size()])
  • randi % n는 0에서 n-1사이의 숫자를 선택

 

이제 마지막으로 몹들이 화면을 벗어나면 삭제해 주는 코드를 작성해 보겠다.

 

몹 스크립트 생성

먼저 'VisibleOnScreenNotifier2D' 노드를 클릭해 주고 노드 메뉴에서 'screen_exited()'를 연결해 준다.

 

연결하고 나면 아래의 코드를 넣어주면 된다.

func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
	queue_free()
  • 몹이 생성되면 queue라는 저장공간에 차례대로 들어오는데 queue_free()를 하면 queue에서 삭제시키는 메서드이다.

 

여기까지 하면 몹생성은 완성이다.

 

몹 스크립트 전체

extends RigidBody2D


func _ready() -> void:
	# 몸 애니메이션 이름들을 배열로 불러오기
	var mob_type = $AnimatedSprite2D.sprite_frames.get_animation_names() # ["walk", "swim", "fly"]
	
	# 0-2 사이의 숫자를 임의로 선택해 애니메이션 플레이
	$AnimatedSprite2D.play(mob_type[randi() % mob_type.size()]) # randi % n: 0에서 n-1사이의 숫자를 선택


func _process(delta: float) -> void:
	pass


func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
	queue_free()

다음 포스팅에서는 메인화면을 만들어 보겠다.

 

다음 포스팅 :) https://twd0622.tistory.com/90

 

[GodotEngine] Tutorial 2D Game - 5

해당 내용 출처 :) https://docs.godotengine.org/en/stable/getting_started/first_2d_game/index.html 이전 내용:) https://twd0622.tistory.com/89 [GodotEngine] 2D Game Tutorial - 4해당 내용 출처 :) https://docs.godotengine.org/en/stable/gett

twd0622.tistory.com

 

 

'GodotEngine' 카테고리의 다른 글

[GodotEngine] Tutorial 2D Game - 6  (1) 2024.12.27
[GodotEngine] Tutorial 2D Game - 5  (0) 2024.12.27
[GodotEngine] Tutorial 2D Game - 3  (2) 2024.12.16
[GodotEngine] Tutorial 2D Game - 2  (0) 2024.12.11
[GodotEngine] Tutorial 2D Game - 1  (0) 2024.12.10