Tworzenie przeciwników, którzy gonią gracza, to jedna z podstawowych mechanik w grach. W tym poradniku pokażę Ci, jak zaimplementować prosty system AI w Godot Engine 4 w środowisku 2D. Omówimy krok po kroku, jak przeciwnik będzie poruszał się w kierunku gracza, unikając przeszkód.
1. Przygotowanie projektu
Tworzenie sceny
- Utwórz nowy projekt w Godot Engine.
- Dodaj węzeł główny sceny:
- Kliknij prawym przyciskiem myszy w drzewie sceny i wybierz „Dodaj węzeł”.
- Wpisz
Node2D
i dodaj go jako główny węzeł. Nazwij goGame
.
- Dodaj gracza:
- Dodaj nowy węzeł
KinematicBody2D
i nazwij goPlayer
. - Dodaj do niego dzieci:
Sprite2D
– do wyświetlenia grafiki gracza.CollisionShape2D
– do obsługi kolizji (ustaw np. prostokąt).
- Dodaj nowy węzeł
- Dodaj przeciwnika:
- Dodaj nowy węzeł
KinematicBody2D
i nazwij goEnemy
. - Dodaj do niego dzieci:
Sprite2D
– do wyświetlenia grafiki przeciwnika.CollisionShape2D
– do obsługi kolizji.
- Dodaj nowy węzeł
Twoje drzewo sceny powinno wyglądać tak:
Game
├── Player
│ ├── Sprite2D
│ └── CollisionShape2D
└── Enemy
├── Sprite2D
└── CollisionShape2D
2. Ruch gracza
Dodaj skrypt do węzła Player
. Kliknij prawym przyciskiem myszy na węzeł Player
i wybierz „Dodaj Skrypt”. Wprowadź poniższy kod:
extends KinematicBody2D
@export var speed = 200 # Prędkość poruszania się gracza
var velocity = Vector2.ZERO
func _physics_process(delta):
velocity = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
velocity.x += 1
if Input.is_action_pressed("ui_left"):
velocity.x -= 1
if Input.is_action_pressed("ui_down"):
velocity.y += 1
if Input.is_action_pressed("ui_up"):
velocity.y -= 1
velocity = velocity.normalized() * speed
move_and_slide(velocity)
Konfiguracja wejścia
- Przejdź do „Project Settings” > „Input Map”.
- Dodaj akcje:
ui_up
,ui_down
,ui_left
,ui_right
i przypisz do nich odpowiednie klawisze (np. strzałki lubWASD
).
3. AI przeciwnika
Dodaj skrypt do węzła Enemy
. Kliknij prawym przyciskiem myszy na węzeł Enemy
i wybierz „Dodaj Skrypt”. Następnie wklej poniższy kod:
extends KinematicBody2D
@export var speed = 150 # Prędkość przeciwnika
var target = null # Obiekt, który przeciwnik będzie gonić
func _ready():
# Ustawienie celu na obiekt gracza
target = get_parent().get_node("Player")
func _physics_process(delta):
if target:
# Obliczenie kierunku w stronę gracza
var direction = (target.global_position - global_position).normalized()
var velocity = direction * speed
# Ruch przeciwnika w stronę gracza
move_and_slide(velocity)
4. Dodanie przeszkód
Aby przeciwnik i gracz reagowali na przeszkody, dodaj je do sceny:
- Dodaj węzeł
StaticBody2D
i nazwij goObstacle
. - Dodaj do niego dziecko:
CollisionShape2D
– ustaw kształt przeszkody (np. prostokąt).
5. Testowanie AI
Uruchom grę, aby zobaczyć, jak przeciwnik goni gracza. Przeciwnik powinien poruszać się w stronę gracza i zatrzymać się na przeszkodach dzięki obsłudze kolizji.
6. Rozszerzenie funkcjonalności
Dodanie zasięgu wykrywania
Aby przeciwnik gonił gracza tylko w określonym zasięgu, dodaj węzeł Area2D
jako dziecko Enemy
:
- W drzewie węzłów kliknij prawym przyciskiem myszy na
Enemy
i dodajArea2D
. - Dodaj dziecko:
CollisionShape2D
– ustaw zasięg (np. okrąg).
Zaktualizuj skrypt przeciwnika:
@export var detection_range = 200 # Zasięg wykrywania gracza
func _physics_process(delta):
if target and global_position.distance_to(target.global_position) <= detection_range:
var direction = (target.global_position - global_position).normalized()
var velocity = direction * speed
move_and_slide(velocity)
Dodanie animacji
- Dodaj węzeł
AnimationPlayer
doEnemy
i stwórz animacje (np. bieganie). - W skrypcie przeciwnika dodaj odtwarzanie animacji podczas ruchu:
func _physics_process(delta):
if target:
var direction = (target.global_position - global_position).normalized()
var velocity = direction * speed
move_and_slide(velocity)
if velocity.length() > 0:
$AnimationPlayer.play("run")
else:
$AnimationPlayer.play("idle")
Podsumowanie
W tym poradniku stworzyliśmy prosty system AI, który pozwala przeciwnikowi gonić gracza w grze 2D. Rozszerzając ten system, możesz dodać różne mechaniki, takie jak unikanie przeszkód, atakowanie gracza czy zmiana zachowania w zależności od sytuacji.