Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

CharacterBody3D

Eredita: PhysicsBody3D < CollisionObject3D < Node3D < Node < Object

Un corpo di fisica 3D specializzato per personaggi mossi da script.

Descrizione

CharacterBody3D è una classe specializzata per i corpi di fisica che sono pensati per essere controllati dall'utente. Non sono influenzati dalla fisica, ma influenzano altri corpi di fisica sul loro percorso. Sono usati principalmente per fornire API di alto livello per spostare oggetti con rilevamento di pareti e pendenze (tramite move_and_slide()) oltre al rilevamento generale delle collisioni fornito da PhysicsBody3D.move_and_collide(). Ciò lo rende utile per corpi di fisica altamente configurabili che devono muoversi in modi specifici e scontrarsi con il mondo, come spesso accade con i personaggi controllati dall'utente.

Per gli oggetti di gioco che non richiedono un movimento complesso o un rilevamento delle collisioni, come le piattaforme mobili, AnimatableBody3D è più semplice da configurare.

Tutorial

Proprietà

bool

floor_block_on_wall

true

bool

floor_constant_speed

false

float

floor_max_angle

0.7853982

float

floor_snap_length

0.1

bool

floor_stop_on_slope

true

int

max_slides

6

MotionMode

motion_mode

0

int

platform_floor_layers

4294967295

PlatformOnLeave

platform_on_leave

0

int

platform_wall_layers

0

float

safe_margin

0.001

bool

slide_on_ceiling

true

Vector3

up_direction

Vector3(0, 1, 0)

Vector3

velocity

Vector3(0, 0, 0)

float

wall_min_slide_angle

0.2617994

Metodi

void

apply_floor_snap()

float

get_floor_angle(up_direction: Vector3 = Vector3(0, 1, 0)) const

Vector3

get_floor_normal() const

Vector3

get_last_motion() const

KinematicCollision3D

get_last_slide_collision()

Vector3

get_platform_angular_velocity() const

Vector3

get_platform_velocity() const

Vector3

get_position_delta() const

Vector3

get_real_velocity() const

KinematicCollision3D

get_slide_collision(slide_idx: int)

int

get_slide_collision_count() const

Vector3

get_wall_normal() const

bool

is_on_ceiling() const

bool

is_on_ceiling_only() const

bool

is_on_floor() const

bool

is_on_floor_only() const

bool

is_on_wall() const

bool

is_on_wall_only() const

bool

move_and_slide()


Enumerazioni

enum MotionMode: 🔗

MotionMode MOTION_MODE_GROUNDED = 0

Da applicare quando sono rilevanti le nozioni di muri, soffitto e pavimento. In questa modalità il movimento del corpo reagirà alle pendenze (accelerazione/rallentamento). Questa modalità è adatta per giochi come i piattaforme.

MotionMode MOTION_MODE_FLOATING = 1

Da applicare quando non c'è nozione di pavimento o soffitto. Tutte le collisioni saranno segnalate come on_wall. In questa modalità, quando scivoli, la velocità sarà sempre costante. Questa modalità è adatta per giochi senza terreno come i giochi spaziali.


enum PlatformOnLeave: 🔗

PlatformOnLeave PLATFORM_ON_LEAVE_ADD_VELOCITY = 0

Aggiunge la velocità dell'ultima piattaforma alla velocity quando si abbandona una piattaforma in movimento.

PlatformOnLeave PLATFORM_ON_LEAVE_ADD_UPWARD_VELOCITY = 1

Aggiunge l'ultima velocità della piattaforma alla velocity quando si lascia una piattaforma in movimento, ma qualsiasi movimento verso il basso viene ignorato. È utile per mantenere l'altezza dei salti intatta anche quando la piattaforma si muove verso il basso.

PlatformOnLeave PLATFORM_ON_LEAVE_DO_NOTHING = 2

Non fare nulla quando si abbandona una piattaforma.


Descrizioni delle proprietà

bool floor_block_on_wall = true 🔗

  • void set_floor_block_on_wall_enabled(value: bool)

  • bool is_floor_block_on_wall_enabled()

Se true, il corpo potrà muoversi solo sul pavimento. Questa opzione evita di poter camminare sui muri, ma permetterà di scivolare lungo di essi.


bool floor_constant_speed = false 🔗

  • void set_floor_constant_speed_enabled(value: bool)

  • bool is_floor_constant_speed_enabled()

Se false (predefinito), il corpo si muoverà più velocemente su pendenze in discesa e più lentamente su pendenze in salita.

Se true, il corpo si muoverà sempre alla stessa velocità sul terreno, a prescindere dalla pendenza. Nota che bisogna usare floor_snap_length per rimanere lungo una pendenza in discesa a velocità costante.


float floor_max_angle = 0.7853982 🔗

  • void set_floor_max_angle(value: float)

  • float get_floor_max_angle()

Angolo massimo (in radianti) in cui una pendenza è ancora considerata un pavimento (o un soffitto), anziché un muro, quando si chiama move_and_slide(). Il valore predefinito corrisponde a 45 gradi.


float floor_snap_length = 0.1 🔗

  • void set_floor_snap_length(value: float)

  • float get_floor_snap_length()

Imposta una distanza di aggancio. Se impostato su un valore diverso da 0.0, il corpo è mantenuto attaccato alle pendenze quando si chiama move_and_slide(). Il vettore di aggancio è determinato dalla distanza fornita lungo la direzione opposta di up_direction.

Fin quando il vettore di aggancio è a contatto con il terreno e il corpo si muove contro up_direction, il corpo rimarrà attaccato alla superficie. L'aggancio non viene applicato se il corpo si muove lungo up_direction, il che significa che contiene una velocità verticale in aumento, quindi sarà in grado di staccarsi dal terreno quando salta o quando il corpo viene spinto verso l'alto da qualcosa. Se vuoi applicare un'aggancio senza tenere conto della velocità, usa apply_floor_snap().


bool floor_stop_on_slope = true 🔗

  • void set_floor_stop_on_slope_enabled(value: bool)

  • bool is_floor_stop_on_slope_enabled()

Se true, il corpo non scivolerà sulle pendenze quando si chiama move_and_slide() e quando il corpo è fermo.

Se false, il corpo scivolerà sulle pendenze sul pavimento quando velocity applica una forza verso il basso.


int max_slides = 6 🔗

  • void set_max_slides(value: int)

  • int get_max_slides()

Numero massimo di volte in cui il corpo può cambiare direzione prima di fermarsi quando move_and_slide() viene chiamato. Deve essere maggiore di zero.


MotionMode motion_mode = 0 🔗

Imposta la modalità di movimento che definisce il comportamento di move_and_slide().


int platform_floor_layers = 4294967295 🔗

  • void set_platform_floor_layers(value: int)

  • int get_platform_floor_layers()

Gli strati di collisione che saranno inclusi per rilevare i corpi di pavimento che fungeranno da piattaforme mobili da seguire dal CharacterBody3D. Per impostazione predefinita, tutti i corpi di pavimento sono rilevati e propagano la loro velocità.


PlatformOnLeave platform_on_leave = 0 🔗

Imposta il comportamento da applicare quando si lascia una piattaforma in movimento. Come predefinito, per essere fisicamente corretti, quando si lascia una piattaforma viene applicata una velocità.


int platform_wall_layers = 0 🔗

  • void set_platform_wall_layers(value: int)

  • int get_platform_wall_layers()

Gli strati di collisione che saranno inclusi per rilevare i corpi di muro che fungeranno da piattaforme mobili da seguire dal CharacterBody3D. Per impostazione predefinita, tutti i corpi di muro sono rilevati e propagano la loro velocità.


float safe_margin = 0.001 🔗

  • void set_safe_margin(value: float)

  • float get_safe_margin()

Margine aggiuntivo utilizzato per il recupero delle collisioni quando move_and_slide() viene chiamato.

Se il corpo è almeno così vicino a un altro corpo, li considererà in collisione e verrà spinto via prima di effettuare il movimento.

Un valore più alto significa che è più flessibile per rilevare le collisioni, il che aiuta a rilevare muri e pavimenti in modo consistente.

Un valore più basso forza l'algoritmo di collisione a utilizzare un rilevamento più esatto, quindi può essere utilizzato in casi che richiedono specificamente precisione, ad esempio a scale molto basse per evitare notevole scuotimento o per stabilità con una pila di corpi di personaggi.


bool slide_on_ceiling = true 🔗

  • void set_slide_on_ceiling_enabled(value: bool)

  • bool is_slide_on_ceiling_enabled()

Se true, durante un salto contro il soffitto, il corpo scivolerà, se false si fermerà e cadrà verticalmente.


Vector3 up_direction = Vector3(0, 1, 0) 🔗

Vettore che punta verso l'alto, utilizzato per determinare cosa è un muro e cosa è un pavimento (o un soffitto) quando si chiama move_and_slide(). Il valore predefinito è Vector3.UP. Poiché il vettore sarà normalizzato, non può essere uguale a Vector3.ZERO, se desideri che tutte le collisioni siano segnalate come muri, considera di utilizzare MOTION_MODE_FLOATING come motion_mode.


Vector3 velocity = Vector3(0, 0, 0) 🔗

Vettore di velocità attuale (tipicamente in metri al secondo), utilizzato e modificato durante le chiamate a move_and_slide().

Nota: Un errore comune è impostare questa proprietà sulla velocità desiderata moltiplicata per delta, il che produce un vettore di movimento (tipicamente in metri).


float wall_min_slide_angle = 0.2617994 🔗

  • void set_wall_min_slide_angle(value: float)

  • float get_wall_min_slide_angle()

Angolo minimo (in radianti) a cui il corpo è permesso di scivolare quando incontra una pendenza. Il valore predefinito corrisponde a 15 gradi. Quando motion_mode è MOTION_MODE_GROUNDED, questa proprietà influisce sul movimento solo se floor_block_on_wall è true.


Descrizioni dei metodi

void apply_floor_snap() 🔗

Consente di applicare manualmente uno scatto al pavimento a prescindere dalla velocità del corpo. Questa funzione non fa nulla quando is_on_floor() restituisce true.


float get_floor_angle(up_direction: Vector3 = Vector3(0, 1, 0)) const 🔗

Restituisce l'angolo di collisione del pavimento nell'ultimo punto di collisione in base a up_direction, che è Vector3.UP per impostazione predefinita. Questo valore è sempre positivo ed è valido solo dopo aver chiamato move_and_slide() e quando is_on_floor() restituisce true.


Vector3 get_floor_normal() const 🔗

Restituisce la normale della collisione del pavimento all'ultimo punto di collisione. È valido solo dopo aver chiamato move_and_slide() e quando is_on_floor() restituisce true.

Attenzione: La normale della collisione non è sempre la stessa della normale della superficie.


Vector3 get_last_motion() const 🔗

Restituisce l'ultimo movimento applicato al CharacterBody3D durante l'ultima chiamata a move_and_slide(). Il movimento può essere suddiviso in più movimenti quando si verifica lo scorrimento e questo metodo restituisce l'ultimo, il che è utile per recuperare la direzione attuale del movimento.


KinematicCollision3D get_last_slide_collision() 🔗

Restituisce un KinematicCollision3D se è avvenuta una collisione. Il valore restituito contiene informazioni sull'ultima collisione avvenuta durante l'ultima chiamata a move_and_slide(). Restituisce null se nessuna collisione è avvenuta. Vedi anche get_slide_collision().


Vector3 get_platform_angular_velocity() const 🔗

Restituisce la velocità angolare della piattaforma nell'ultimo punto di collisione. È valido solo dopo aver chiamato move_and_slide().


Vector3 get_platform_velocity() const 🔗

Restituisce la velocità lineare della piattaforma all'ultimo punto di collisione. È valido solo dopo aver chiamato move_and_slide().


Vector3 get_position_delta() const 🔗

Restituisce lo spostamento (delta di posizione) che si è verificato durante l'ultima chiamata a move_and_slide().


Vector3 get_real_velocity() const 🔗

Restituisce la velocità reale attuale dall'ultima chiamata a move_and_slide(). Ad esempio, quando si sale una pendenza, ci si muove in diagonale anche se la velocità è orizzontale. Questo metodo restituisce il movimento diagonale, a differenza di velocity che restituisce la velocità richiesta.


KinematicCollision3D get_slide_collision(slide_idx: int) 🔗

Returns a KinematicCollision3D, which contains information about a collision that occurred during the last call to move_and_slide(). Since the body can collide several times in a single call to move_and_slide(), you must specify the index of the collision in the range 0 to (get_slide_collision_count() - 1). See also get_last_slide_collision().


int get_slide_collision_count() const 🔗

Restituisce il numero di volte in cui il corpo è entrato in collisione e ha cambiato direzione durante l'ultima chiamata a move_and_slide().


Vector3 get_wall_normal() const 🔗

Restituisce la normale della collisione del muro all'ultimo punto di collisione. È valido solo dopo aver chiamato move_and_slide() e quando is_on_wall() restituisce true.

Attenzione: La normale della collisione non è sempre la stessa della normale di superficie.


bool is_on_ceiling() const 🔗

Restituisce true se il corpo è entrato in collisione con il soffitto durante l'ultima chiamata di move_and_slide(). Altrimenti, restituisce false. up_direction e floor_max_angle sono utilizzati per determinare se una superficie è un "soffitto" o meno.


bool is_on_ceiling_only() const 🔗

Restituisce true se il corpo è entrato in collisione soltanto con il soffitto nell'ultima chiamata di move_and_slide(). Altrimenti, restituisce false. up_direction e floor_max_angle sono utilizzati per determinare se una superficie è un "soffitto" o meno.


bool is_on_floor() const 🔗

Restituisce true se il corpo è entrato in collisione con il pavimento durante l'ultima chiamata di move_and_slide(). Altrimenti, restituisce false. up_direction e floor_max_angle sono utilizzati per determinare se una superficie è un "pavimento" o meno.


bool is_on_floor_only() const 🔗

Restituisce true se il corpo è entrato in collisione soltanto con il pavimento durante l'ultima chiamata di move_and_slide(). Altrimenti, restituisce false. up_direction e floor_max_angle sono utilizzati per determinare se una superficie è un "pavimento" o meno.


bool is_on_wall() const 🔗

Restituisce true se il corpo è entrato in collisione con un muro durante l'ultima chiamata di move_and_slide(). Altrimenti, restituisce false. up_direction e floor_max_angle sono utilizzati per determinare se una superficie è un "muro" o meno.


bool is_on_wall_only() const 🔗

Restituisce true se il corpo è entrato in collisione soltanto con un muro durante l'ultima chiamata di move_and_slide(). Altrimenti, restituisce false. up_direction e floor_max_angle sono utilizzati per determinare se una superficie è un "muro" o meno.


bool move_and_slide() 🔗

Sposta il corpo in base a velocity. Se il corpo entra in collisione con un altro, scivolerà lungo l'altro corpo (per impostazione predefinita solo sul pavimento) invece di fermarsi immediatamente. Se l'altro corpo è un CharacterBody3D o RigidBody3D, sarà anche influenzato dal movimento dell'altro corpo. È possibile usarlo per creare piattaforme mobili e rotanti o per far in modo che i nodi spingano altri nodi.

Questo metodo si dovrebbe utilizzare in Node._physics_process() (o in un metodo chiamato da Node._physics_process()), poiché utilizza automaticamente il valore delta del passaggio di fisica nei calcoli. Altrimenti, la simulazione sarà eseguita a una velocità errata.

Modifica velocity se si è verificata una collisione con scorrimento. Per ottenere l'ultima chiamata di collisione get_last_slide_collision(), per informazioni dettagliate sulle collisioni che si sono verificate, usa get_slide_collision().

Quando il corpo tocca una piattaforma in movimento, la velocità della piattaforma viene automaticamente aggiunta al movimento del corpo. Se si verifica una collisione a causa del movimento della piattaforma, sarà sempre la prima nelle collisioni con scorrimento.

Restituisce true se il corpo è entrato in collisione, altrimenti restituisce false.