Manual/ Ejemplos

Jugador con física

Movimiento con WASD y salto con Espacio sobre un Rigidbody con CapsuleCollider. Detecta el suelo con un raycast y fija la velocidad horizontal para que el control sea preciso.

Jugador.lua

local Jugador = {
    properties = {
        velocidad = 6.0,
        correr = 1.6,        -- multiplicador con Shift
        salto = 5.5,         -- m/s hacia arriba
        altura = 1.0,        -- del centro a los pies
    }
}

function Jugador:enSuelo()
    -- El rayo empieza justo fuera de la cápsula para no detectarla
    local pies = self.entity.position + Vec3.down * (self.altura + 0.02)
    return Physics.raycast(pies, Vec3.down, 0.15) ~= nil
end

function Jugador:Update(dt)
    -- Dirección de entrada en el plano (W = hacia -Z, el "forward" del motor)
    local entrada = Vec3(Input.getAxis("Horizontal"), 0, -Input.getAxis("Vertical"))
    if entrada:length() > 1 then entrada = entrada:normalized() end

    local rapidez = self.velocidad
    if Input.getKey("shift") then rapidez = rapidez * self.correr end

    local v = self.entity.velocity
    v.x = entrada.x * rapidez
    v.z = entrada.z * rapidez

    if Input.getKeyDown("space") and self:enSuelo() then
        v.y = self.salto
        Audio.playOneShot("Audio/salto.wav")
    end
    self.entity.velocity = v

    -- Mirar hacia donde camina
    if entrada:length() > 0.1 then
        self.entity:lookAt(self.entity.position + entrada)
    end
end

return Jugador

¿Algo no queda claro o falta algo? Pregunta en el Discord.