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.