Manual/ Ejemplos

IA: patrullar y perseguir

Un guardia con NavAgent que patrulla por puntos al azar y persigue al jugador cuando lo ve (el raycast de la malla comprueba que no haya una pared en medio). Si lo pierde, vuelve a patrullar.

Guardia.lua

local Guardia = {
    properties = {
        radioPatrulla = 12.0,
        vision = 10.0,
    }
}

function Guardia:Start()
    self.casa = self.entity.position
    self.jugador = Scene.find("Jugador")
    self.estado = "patrulla"
    self.espera = 0
end

function Guardia:veAlJugador()
    if not self.jugador then return false end
    if self.entity:distanceTo(self.jugador) > self.vision then return false end
    local libre = Navigation.raycast(self.entity.position, self.jugador.position)
    return libre
end

function Guardia:Update(dt)
    if self:veAlJugador() then
        self.estado = "persigue"
        self.entity:moveTo(self.jugador.position)
        return
    end

    if self.estado == "persigue" then
        -- Lo perdio: va al ultimo sitio donde lo vio y luego patrulla.
        if not self.entity.isMoving then self.estado = "patrulla" end
        return
    end

    -- Patrulla: un punto al azar alrededor de casa, espera y otro.
    if not self.entity.isMoving then
        self.espera = self.espera - dt
        if self.espera <= 0 then
            local punto = Navigation.randomPoint(self.casa, self.radioPatrulla)
            if punto then self.entity:moveTo(punto) end
            self.espera = Mathf.random(1, 3)
        end
    end
end

return Guardia

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