Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

2D 이동 개요

소개

모든 초심자는 이런 적이 있습니다: "내 캐릭터를 움직이려면 어떻게 해야 하나요?" 만들고 있는 게임의 유형에 따라 특별한 요구 사항이 있을 수 있겠지만 일반적으로 대부분 2D 게임에서 움직임은 적은 수의 디자인을 기반으로 합니다.

우리는 이번 예제에 KinematicBody2D 를 사용할 겁니다. 하지만 원리는 다른 노드 유형(Area2D, RiqidBody2D)에도 적용할 수 있습니다.

설정

Each example below uses the same scene setup. Start with a CharacterBody2D with two children: Sprite2D and CollisionShape2D. You can use the Godot icon (icon.svg) for the Sprite2D's texture or use any other 2D image you have.

프로젝트 -> 프로젝트 설정 을 열고 "입력 설정" 탭을 선택합니다. 다음의 입력 액션들을 추가하세요 (see InputEvent for details):

../../_images/movement_inputs.webp

8 방향 이동

이 시나리오에서는 사용자가 4 방향의 키들(위/왼쪽/아래/오른쪽 또는 W/A/S/D)을 누르고 선택된 방향으로 움직였으면 합니다. "8 방향 이동" 명칭은 동시에 두 키를 눌러서 플레이어가 대각선으로 움직이게 되는 것에서 유래합니다.

kinematic body에 스크립트를 추가하고 다음과 같은 코드를 추가합니다:

extends CharacterBody2D

@export var speed = 400

func get_input():
    var input_direction = Input.get_vector("left", "right", "up", "down")
    velocity = input_direction * speed

func _physics_process(delta):
    get_input()
    move_and_slide()

get_input() 함수에서는 Input ``get_vector()``를 사용하여 4개의 주요 이벤트를 확인하고 방향 벡터를 합산하여 반환합니다.

그런 다음 길이가 ``1``인 방향 벡터에 원하는 속도를 곱하여 속도를 설정할 수 있습니다.

벡터 수학을 사용해 본 적이 없거나 재교육이 필요한 경우 벡터 수학 에서 Godot 내 벡터 사용에 대한 설명을 볼 수 있습니다.

참고

키를 눌렀을 때 위의 코드가 아무 작업도 수행하지 않으면 이 튜토리얼의 설정 부분에 설명된 대로 입력 작업을 올바르게 설정했는지 다시 확인하세요.

회전 + 이동

이러한 이동의 유형은 때때로 "Asteroids-style"이라 불립니다. 왜냐하면 고전 아케이드 게임 Asteroids 작동 방식과 닮았기 때문입니다. 왼쪽 또는 오른쪽을 누르면 캐릭터가 회전합니다. 반면에 위 또는 아래를 누르면 보고 있는 방향에 대햐여 전진 하거나 후진합니다.

extends CharacterBody2D

@export var speed = 400
@export var rotation_speed = 1.5

var rotation_direction = 0

func get_input():
    rotation_direction = Input.get_axis("left", "right")
    velocity = transform.x * Input.get_axis("down", "up") * speed

func _physics_process(delta):
    get_input()
    rotation += rotation_direction * rotation_speed * delta
    move_and_slide()

여기에 회전 방향과 속도를 추적하기 위한 새로운 변수 두 개를 추가했습니다. 다시 두 키를 동시에 누르면 취소되고 회전하지 않습니다. 이 회전은 바디의 rotation 속성에 직접 적용됩니다.

속도를 설정하기 위해 신체의 "전진" 방향을 가리키는 벡터인 신체의 ``transform.x``를 사용하고 여기에 속도를 곱합니다.

회전 + 이동 (마우스)

이번 동작 방식은 이전 동작의 변형입니다. 이번에는 키보드 대신 마우스 위치에 의해 방향이 정해집니다. 캐릭터는 항상 마우스 포인터를 봅니다("look at"). 그러나 전방/후진 입력은 동일하게 유지됩니다.

extends CharacterBody2D

@export var speed = 400

func get_input():
    look_at(get_global_mouse_position())
    velocity = transform.x * Input.get_axis("down", "up") * speed

func _physics_process(delta):
    get_input()
    move_and_slide()

여기서 우리는 플레이어를 주어진 포지션으로 향하도록 하기 위해 Node2Dlook_at() 메서드를 사용하고 있습니다. 이 함수가 없으면 각도를 다음과 같이 설정하여 동일한 효과를 얻을 수 있습니다:

rotation = get_global_mouse_position().angle_to_point(position)

클릭과 이동

이번 마지막 예제는 마우스만 사용하여 캐릭터를 제어합니다. 화면을 클릭하면 플레이어는 지정 위치로 움직입니다.

extends CharacterBody2D

@export var speed = 400

var target = position

func _input(event):
    # Use is_action_pressed to only accept single taps as input instead of mouse drags.
    if event.is_action_pressed(&"click"):
        target = get_global_mouse_position()

func _physics_process(delta):
    velocity = position.direction_to(target) * speed
    # look_at(target)
    if position.distance_to(target) > 10:
        move_and_slide()

이동 하기 전에 length() 로 확인하는 것을 유의하세요. 이 테스트가 없으면 위치를 약간 지나쳐서 되돌아가려 할 때 지정 위치에 도달하고 "덜덜 떨 것입니다", only to move too far and repeat.

원한다면 rotation 줄의 주석 처리를 제거해서 움직이는 방향으로 몸을 돌리게 할 수 있습니다.

이 기술은 "다음" 문자의 기초로 사용될 수도 있습니다. target 위치는 이동하려는 모든 개체의 위치가 될 수 있습니다.

요약

당신은 이 코드 샘플들이 자신의 프로젝트 시작점으로서 유용하다는 것을 알게 될 것입니다. 자유롭게 그것들을 사용해서 무엇을 만들 수 있을 지 실험해보세요.

이 샘플 프로젝트는 여기에서 다운로드할 수 있습니다: 2d_movement_starter.zip