본문 바로가기
Godot

[GodotDocs][Your First 2D Game] 5. 적(Mob) 코딩(GDScript, C#)

by 채식금지 2024. 2. 18.
728x90

본 게시글은 고도엔진 공식문서에 작성된 Your first 2D game를 정리하였습니다.

 

GDScript

  • res://Mob.tscn을 선택한다.
  • Scene 도크에서 Mob 노드를 선택한다.
  • Attach Script 아이콘을 클릭한다.

 

  • Attach Node Script 팝업창이 열리면 Path에서 파일명을 res://mob.gd라고 입력한다.
  • GDScript는 파이썬과 유사한 코딩 스타일을 권장한다.(GDScript style guide)
  • Create 버튼을 클릭하여 스크립트를 생성한다.

 

  • res://mob.gd 파일을 연다.
  • _ready() 함수 안에 아래의 코드를 추가한다.
  • _process(delta: float) 함수는 지운다.
func _ready():
    var mob_types = $AnimatedSprite2D.sprite_frames.get_animation_names()
    $AnimatedSprite2D.play(mob_types[randi() % mob_types.size()])
  • $AnimatedSprite2D.sprite_frames.get_animation_names() 함수를 사용하면 [GodotDocs][Your First 2D Game] 4. 적(Mob) 제작에서 추가했던 fly, swim, walk 애니메이션의 이름을 문자열 배열로 반환한다.
  • randi() % n 을 사용할 경우, 0~(n-1) 사이의 값을 렌덤하게 반환한다.
  • $AnimatedSprite2D.play(mob_types[randi() % mob_types.size()]) 를 사용할 경우, fly, swim, walk 애니메이션 중 1개를 렌덤하게 재생하게 된다.

 

  • Scene 도크에서 VisibleOnScreenNotifier2D 노드를 선택한다.
  • Node 도크를 선택한 후 screen_exited() 시그널을 더블 클릭한다.

 

  • Connect a Signal to a Method 팝업창이 열리면 Connect 버튼을 클릭하여 screen_exited() 시그널과 연결된 _on_visible_on_screen_notifier_2d_screen_exited() 함수를 추가한다.
  • _on_visible_on_screen_notifier_2d_screen_exited() 함수 안에 queue_free() 함수를 추가한다.
func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
    queue_free()
  • _on_visible_on_screen_notifier_2d_screen_exited() 함수는 Mob 노드가 화면 밖으로 나가면 자동 호출된다.
  • queue_free() 함수는 노드를 게임에서 제거한다.
  • Mob 노드가 화면 밖으로 나가면 자동으로 게임에서 제거된다.

 

완성된 스크립트(GDScript)

extends RigidBody2D

func _ready() -> void:
    var mob_types = $AnimatedSprite2D.sprite_frames.get_animation_names()
    $AnimatedSprite2D.play(mob_types[randi() % mob_types.size()])

func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
    queue_free()

 

C#

  • res://Mob.tscn을 선택한다.
  • Scene 도크에서 Mob 노드를 선택한다.
  • Attach Script 아이콘을 클릭한다.

 

  • Attach Node Script 팝업창이 열리면 Language를 C# 으로 선택한다.
  • C#을 선택하면 Path는 자동으로 res://Mob.cs로 변경된다.
  • Create 버튼을 클릭하여 스크립트를 생성한다.
  • res://Mob.cs 파일을 연다.
  • _Ready() 메소드를 안에 아래의 코드를 추가한다.
  • _Process(double delta) 메소드는 지운다.
public override void _Ready()
{
    var animatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
    var mobTypes = animatedSprite2D.SpriteFrames.GetAnimationNames();
    animatedSprite2D.Play(mobTypes[GD.Randi() % mobTypes.Length]);
}
  • animatedSprite2D.SpriteFrames.GetAnimationNames() 메소드를 사용하면 [GodotDocs][Your First 2D Game] 4. 적(Mob) 제작에서 추가했던 fly, swim, walk 애니메이션의 이름을 문자열 배열로 반환한다.
  • GD.Randi() % n 을 사용할 경우, 0~(n-1) 사이의 값을 렌덤하게 반환한다.
  • animatedSprite2D.Play(mobTypes[GD.Randi() % mobTypes.Length]) 를 사용할 경우, fly, swim, walk 애니메이션 중 1개를 렌덤하게 재생하게 된다.

 

  • Scene 도크에서 VisibleOnScreenNotifier2D 노드를 선택한다.
  • Node 도크를 선택한 후 screen_exited() 시그널을 더블 클릭한다.
  • Connect a Signal to a Method 팝업창이 열리면 Receiver Method: 에 적힌 메소드의 이름을 OnVisibleOnScreenNotifier2DScreenExited 로 수정한 후, Connect 버튼을 클릭한다.
  • res://Mob.cs 파일을 열어 void OnVisibleOnScreenNotifier2DScreenExited() 메소드를 추가한다.
  • OnVisibleOnScreenNotifier2DScreenExited() 메소 안에 QueueFree() 함수를 추가한다.
public void OnVisibleOnScreenNotifier2DScreenExited()
{
    QueueFree();
}
  • OnVisibleOnScreenNotifier2DScreenExited() 함수는 Mob 노드가 화면 밖으로 나가면 자동 호출된다.
  • QueueFree() 함수는 노드를 게임에서 제거한다.
  • Mob 노드가 화면 밖으로 나가면 자동으로 게임에서 제거된다.

 

완성된 스크립트(C#)

using Godot;
using System;

public partial class Mob : RigidBody2D
{
    public override void _Ready()
    {
        var animatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
        var mobTypes = animatedSprite2D.SpriteFrames.GetAnimationNames();
        animatedSprite2D.Play(mobTypes[GD.Randi() % mobTypes.Length]);
    }

    public void OnVisibleOnScreenNotifier2DScreenExited()
    {
        QueueFree();
    }
}