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.
- extends KinematicBody
- export var velocita = 10
- onready var camera = $"../puntoDiOsservazione/Camera"
- onready var navigazione = $"../navigazione"
- var statodellospazio = PhysicsDirectSpaceState
- var percorso = []
- var percorsoidx = 0
- var statoanim = 0 # 0 => idle ; 1 => camminata
- func _ready():
- statodellospazio = get_world().direct_space_state
- func _input(event):
- var eventomouse = event as InputEventMouseButton
- if not eventomouse:
- return
- if eventomouse.pressed and eventomouse.button_index == 1:
- var da = camera.project_ray_origin(eventomouse.position)
- var a = da + camera.project_ray_normal(eventomouse.position) * 200
- var ris = statodellospazio.intersect_ray(da, a)
- if not ris.empty():
- percorso = navigazione.get_simple_path(global_transform.origin, ris.position)
- # Resettare l'indice
- percorsoidx = 0
- # Iniziare la camminata
- $"protagonista/AnimationPlayer".play("cammina", 0.5)
- statoanim = 1 # cammina
- func _physics_process(delta):
- if percorsoidx < percorso.size():
- var direz = percorso[percorsoidx] - global_transform.origin
- if direz.length() < 1:
- percorsoidx += 1
- else:
- move_and_slide(direz.normalized() * velocita)
- func _process(delta):
- # Voltare il personaggio
- if percorsoidx < percorso.size():
- var nuovaT = global_transform.looking_at(percorso[percorsoidx], Vector3.UP)
- global_transform = global_transform.interpolate_with(nuovaT, 1.0 * delta)
- # Finire la camminata quando il personaggio
- # non ha piu' un percorso da seguire.
- if statoanim == 1 and percorsoidx < percorso.size():
- var distanza = global_transform.origin.distance_to(percorso[percorso.size()-1])
- if distanza < 1.5:
- statoanim = 0
- $"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".
2022
21 feb
21 feb