Jak napisać prosty skrypt AI, który goni gracza w 2D dla Godot Engine

in polish •  4 days ago 

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

  1. Utwórz nowy projekt w Godot Engine.
  2. 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 go Game.
  3. Dodaj gracza:
    • Dodaj nowy węzeł KinematicBody2D i nazwij go Player.
    • Dodaj do niego dzieci:
      • Sprite2D – do wyświetlenia grafiki gracza.
      • CollisionShape2D – do obsługi kolizji (ustaw np. prostokąt).
  4. Dodaj przeciwnika:
    • Dodaj nowy węzeł KinematicBody2D i nazwij go Enemy.
    • Dodaj do niego dzieci:
      • Sprite2D – do wyświetlenia grafiki przeciwnika.
      • CollisionShape2D – do obsługi kolizji.

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

  1. Przejdź do „Project Settings” > „Input Map”.
  2. Dodaj akcje: ui_up, ui_down, ui_left, ui_right i przypisz do nich odpowiednie klawisze (np. strzałki lub WASD).

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:

  1. Dodaj węzeł StaticBody2D i nazwij go Obstacle.
  2. 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:

  1. W drzewie węzłów kliknij prawym przyciskiem myszy na Enemy i dodaj Area2D.
  2. 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

  1. Dodaj węzeł AnimationPlayer do Enemy i stwórz animacje (np. bieganie).
  2. 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.

Published using WordPress Blurt Publisher from https://godot.com.pl.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!