Kollisjonsdeteksjon påvirker de fleste deler av spillet ditt, fra hvordan spilleren din står på en plattform til hvordan de ødelegger fiender.

Kollisjonsdeteksjon er en av de kritiske aspektene ved spillutvikling, og påvirker spilleropplevelsen betydelig. Nøyaktig kollisjonsdeteksjon sikrer at spillkarakterer samhandler sømløst med omgivelsene sine, og skaper en følelse av fordypning og realisme.

Godot, en populær åpen kildekode-spillmotor, gir kraftige verktøy for å implementere effektiv kollisjonsdeteksjon, noe som resulterer i jevn og engasjerende spilling.

Sette opp Godot-spillet

Før du starter, lag et enkelt 2D-plattformspill i Godot 4. Start med å sette opp spillscenen med en spillerkarakter og plattformer.

Koden som brukes i denne artikkelen er tilgjengelig i denne GitHub-depot og er gratis for deg å bruke under MIT-lisensen.

Lag en ny scene og legg til en CharacterBody2D node som rotnoden. Legg til en Sprite2D node som et barn av CharacterBody2D for å visuelt representere spillerkarakteren.

instagram viewer

Neste, legge til bevegelse til spilleren tegn ved hjelp av GDScript:

extends CharacterBody2D

var speed = 300

func _physics_process(delta):
var input_dir = Vector2.ZERO

if Input.is_action_pressed("ui_left"):
input_dir.x -= 1

if Input.is_action_pressed("ui_right"):
input_dir.x += 1

if Input.is_action_pressed("ui_up"):
input_dir.y -= 1

if Input.is_action_pressed("ui_down"):
input_dir.y += 1

velocity = input_dir.normalized() * speed
move_and_collide(velocity * delta)

Til slutt, legg til plattformer til scenen ved hjelp av StaticBody2D noder for å fullføre det grunnleggende oppsettet.

Ulike kollisjonsformer

Godot gir en rekke kollisjonsformer som passer til forskjellige typer spillobjekter. Disse kollisjonsformene hjelper nøyaktig med å definere området der kollisjonsdeteksjon finner sted.

Før du dykker inn i de ulike kollisjonsformene, er det viktig å merke seg at du kan feste en direkte til spillerkarakteren for å definere kollisjonsområdet. Dette lar deg kontrollere det nøyaktige området for å oppdage kollisjon.

Sirkelkollisjonsform

En sirkelkollisjonsform er spesielt nyttig for karakterer som trenger å samhandle radialt med miljøet. Du kan bruke denne formen for tegn med en sirkulær eller sfærisk treffboks. Slik legger du til en sirkelkollisjonsform til spillerkarakteren din:

# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var circle_shape = CircleShape2D.new()
circle_shape.radius = 32
collision_shape.shape = circle_shape
add_child(collision_shape)

Rektangelkollisjonsform

Rektangulære kollisjonsformer er egnet for karakterer med en mer boksete eller rektangulær form. Slik kan du legge til en rektangelkollisjonsform:

# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var rect_shape = RectangleShape2D.new()
rect_shape.extents = Vector2(32, 64)
collision_shape.shape = rect_shape
add_child(collision_shape)

Konveks polygonkollisjonsform

Konvekse polygonkollisjonsformer gir stor fleksibilitet for tegn med uregelmessige eller ikke-rektangulære former. Du kan bruke denne formen for å matche omrisset av karakteren din. Slik legger du til en konveks polygonkollisjonsform:

# Inside the player character's script
var collision_shape = CollisionShape2D.new()
var polygon_shape = ConvexPolygonShape2D.new()
polygon_shape.set_points([Vector2(-32, -64), Vector2(32, -64), Vector2(0, 64)])
collision_shape.shape = polygon_shape
add_child(collision_shape)

Ved å velge riktig kollisjonsform og feste den til spillerkarakteren, kan du nøyaktig oppdage kollisjoner innenfor det angitte området, noe som øker nøyaktigheten av interaksjoner med spillet verden.

Oppdage kollisjoner

Å oppdage kollisjoner mellom objekter er avgjørende for å implementere interaksjoner og spillmekanikk. I Godot kan du oppnå dette ved å bruke den innebygde fysikkmotoren.

# Detecting Collisions in _physics_process
func _physics_process(delta):
var input_dir = Vector2.ZERO
#... (input handling)

velocity = input_dir.normalized() * speed
var collision = move_and_collide(velocity * delta)

if collision:
print("collided")

Nedenfor er utgangen:

Kollisjonssignaler og kollisjonsmasker

Godot gir kollisjonssignaler og kollisjonsmasker som kraftige verktøy for å legge til raffinement til spillet ditt.

Kollisjonssignaler

Kollisjonssignaler er hendelser som fysikkmotoren utløser når kollisjoner oppstår. Disse signalene gir en måte for objekter å kommunisere med hverandre og reagere på kollisjoner. I Godot kan du koble til kollisjonssignaler for å utføre tilpasset logikk når spesifikke kollisjonshendelser finner sted.

Si for eksempel at du vil spille av en lydeffekt når spillerkarakteren kolliderer med et samleobjekt. Slik kan du oppnå dette ved å bruke kollisjonssignaler:

# Inside the player character's script
func _ready():
connect("body_entered", self, "_on_body_entered")

func _on_body_entered(body: Node):
if body.is_in_group("collectible"):
# Play a sound effect
play_collectible_sound()

# Perform additional logic like collecting the item

# Remove the collectible from the scene
body.queue_free()

I dette eksemplet er body_entered signalet sendes ut når spillerkarakteren kolliderer med en annen fysikkkropp. Ved å koble dette signalet til _on_body_entered funksjon, kan du svare på kollisjonshendelsen. Hvis det kolliderende legemet er i samleobjekt gruppe, kan du spille av en opphavsrettsfri lydeffekt.

Kollisjonsmasker

Kollisjonsmasker lar deg kontrollere hvilke kollisjonslag som kan samhandle med hverandre. Hvert kollisjonslag tilsvarer en bit i en bitmaske. Ved å tilordne kollisjonslag og masker til objekter kan du finjustere hvilke objekter som kolliderer med hverandre og optimalisere ytelsen.

Tenk deg for eksempel at du har fiender og kuler i spillet ditt. Du vil at fiender skal kollidere med plattformer, men ikke med hverandre. Du vil også at kuler skal kollidere med fiender, men ikke med plattformer. Slik kan du oppnå dette ved å bruke kollisjonsmasker:

# Inside the enemy's script
func _ready():
# Disable collision with other enemies
set_collision_mask_value(2, false)

# Enable collision with platforms
set_collision_mask_value(3, true)

# Inside the bullet's script
func _ready():
# Enable collision with enemies
set_collision_mask_value(2, true)

# Disable collision with platforms
set_collision_mask_value(3, false)

Ved å selektivt aktivere eller deaktivere kollisjonsmasker, kontrollerer du hvilke objekter som kan kollidere med hverandre, noe som resulterer i nøyaktige og effektive kollisjonsinteraksjoner.

Beste praksis for kollisjonsdeteksjon

For å sikre jevn spilling og effektiv kollisjonsdeteksjon bør du vurdere disse beste fremgangsmåtene.

Bruk enkle former

Komplekse kollisjonsformer kan være ressurskrevende. Når det er mulig, bruk enkle former som sirkler og rektangler for kollisjonsdeteksjon.

Lag kollisjonsmasker

Godot lar deg definere kollisjonslag og masker. Bruk disse til å kontrollere hvilke objekter som kolliderer med hverandre, og optimaliserer ytelsen.

For eksempel, i et plattformspill, spiller kan hoppe på plattformer og skli langs vegger. Ved å sette opp kollisjonslag og masker på riktig måte, kan du oppnå distinkt atferd.

Kollisjonsgrupper

Grupper objekter med lignende kollisjonsegenskaper for enklere administrasjon og effektiv kollisjonsdeteksjon.

Avgrensende bokser

For ytelsesoptimalisering, bruk avgrensningsbokser for raskt å sjekke om objekter er i nærheten før du utfører nøyaktig kollisjonsdeteksjon.

Bruk kinematiske spørringer

Godot gir kinematiske spørringer for å utføre kollisjonskontroller uten å flytte objektet. Dette kan være nyttig for å forutsi kollisjoner før de skjer.

Gjør Godot-spill mer engasjerende med kollisjonsdeteksjon

Å inkludere effektiv kollisjonsdeteksjon i ditt Godot-spill sikrer ikke bare sømløs interaksjon mellom karakterer og miljøet, men åpner også for muligheter for kreativ spilling mekanikk.

Enten det er plattformutfordringer, problemløsning eller kampscenarier, er kollisjonsdeteksjon kjernen i spillerengasjement. Ved å legge til kollisjonsdeteksjon kan du lage et spill som fengsler spillere med sine jevne og dynamiske interaksjoner.