¿Como hacer un FPS con RigidBody en 3D?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Nitsuga

Soy nuevo en todo lo que se refiere al 3D. Logre hacer un personaje que pueda correr, saltar y agacharse con un KinematicBody en 3D, pero mi juego necesita un RigidBody.
Busque como hacer uno pero no entendí como hacerlo ¿Me pueden ayudar?

:bust_in_silhouette: Reply From: Bernard Cloutier

(Eso es el mejor que puedo redactar en español :slight_smile: )
Un RigidBody no se puede mover comó á un KinematicBody. Un KinematicBody se mueve en el code, peró á un RigidBody lo aplicas fuerzas: add_force pará una aceleratión o apply_impulse para una impulción (ex: una esploción). Empleá la función _integrate_forces para calcular las fuerzas que quieres aplicar.

El empleo de un RigidBody necesita más conocimientos de física que un KinematicBody. Porque necesita usted á un RigidBody? Que es lo que no puede realizar con un KinematicBody?

(Tiendra mas respuestas con una pregunta en inglés. El documentó de RigidBody no es traducido desgraciadamente: RigidBody — Godot Engine (3.2) documentation in English)

Gracias por la respuesta.

Necesito un RigidBody para que mi jugador sea afectado por explosiones, para poder hacer un gancho y para crear fricción.

Estuve intentando mover un RigidBody con addforce y applyimpulse, pero mi personaje no avanza solo cae hacia el piso.

Nitsuga | 2020-02-05 17:40

Necesito un RigidBody para que mi jugador sea afectado por explosiones, para poder hacer un gancho y para crear fricción.

Se lo puede hacer en un KinematicBody, solo necesita poner una función como register_hit sobre el jugador. Ex:

extends KinematicBody

var velocity := Vector3()

func register_hit(damage: int, source: Spatial, force: float) -> void:
    apply_damage(damage)
    var push_direction : Vector3 = (self.get_translation() - source.get_translation()).normalized()
    velocity += push_direction * force
 

Algo así. En el script de la esploción:

extends ???

var damage = 50
var force = 120

...

func apply_explosion() -> void:
    # En mi ejemplo $Area es una Node del tipo de Area con una formá esférica
    for body in $Area.get_overlapping_bodies(): 
        if body.has_method("register_hit"):
            body.register_hit(damage, self, force)

Para el gancho con un KinematicBody: https://www.youtube.com/watch?v=mturL8WaHjY (si entiende al inglés)

Para la fricciòn, puede poner en el jugador un RayCast haciá el suelo. Tendria que tomar la fricción del Material del objeto y ponerla manualmente a su velocidad.

Manejar á un jugador es más facil con un KinematicBody, aún que se necesita codigar unos casos como estos a mano.

Bernard Cloutier | 2020-02-05 18:12