FOPENP

Godot: camminare e voltarsi

Questo è un esempio di come ho implementato su Godot 3.4.2 (stable) un sistema per far camminare e voltare un personaggio.

  1. extends KinematicBody
  2. export var velocita 10
  3. onready var camera $"../puntoDiOsservazione/Camera"
  4. onready var navigazione $"../navigazione"
  5. var statodellospazio PhysicsDirectSpaceState
  6. var percorso = []
  7. var percorsoidx 0
  8. var statoanim 0   # 0 => idle ; 1 => camminata
  9. func _ready():
  10.     statodellospazio get_world().direct_space_state
  11. func _input(event):
  12.     var eventomouse event as InputEventMouseButton
  13.     if not eventomouse:
  14.         return
  15.     
  16.     if eventomouse.pressed and eventomouse.button_index == 1:
  17.         var da camera.project_ray_origin(eventomouse.position)
  18.         var da camera.project_ray_normal(eventomouse.position) * 200
  19.         var ris statodellospazio.intersect_ray(daa)
  20.         if not ris.empty():
  21.             percorso navigazione.get_simple_path(global_transform.originris.position)
  22.             # Resettare l'indice
  23.             percorsoidx 0
  24.             # Iniziare la camminata
  25.             $"protagonista/AnimationPlayer".play("cammina"0.5)
  26.             statoanim 1  # cammina
  27. func _physics_process(delta):
  28.     if percorsoidx percorso.size():
  29.         var direz percorso[percorsoidx] - global_transform.origin
  30.         if direz.length() < 1:
  31.             percorsoidx += 1
  32.         else:
  33.             move_and_slide(direz.normalized() * velocita)
  34. func _process(delta):
  35.     # Voltare il personaggio
  36.     if percorsoidx percorso.size():
  37.         var nuovaT global_transform.looking_at(percorso[percorsoidx], Vector3.UP)
  38.         global_transform global_transform.interpolate_with(nuovaT1.0 delta)
  39.     
  40.     # Finire la camminata quando il personaggio
  41.     # non ha piu' un percorso da seguire.
  42.     if statoanim == and percorsoidx percorso.size():
  43.         var distanza global_transform.origin.distance_to(percorso[percorso.size()-1])
  44.         if distanza 1.5:
  45.             statoanim 0
  46.             $"protagonista/AnimationPlayer".play("idle"0.5)

Questo è un KinematicBody che come figlio ha il "protagonista". Il protagonista segue un percorso, e la fine del percorso è la destinazione. Tramite looking_at() e interpolate_with() il protagonista si volterà progressivamente verso il punto di destinazione. Viene anche prevista l'inizio e la fine dell'animazione "camminata".
esempio

2022
21 feb