Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why path finding AI is not really avoiding the obstacles?

Asked by 9 years ago

I have a script were my AI character moves to point a to point b using path finding. Though my AI doesn't really avoid the obstacles. He turns for a little bit when the Path is written but a second later he moves directly to the direction to the target point. Please help?

**NOTE: **The path finding part is in the MoveToSpawnPoint() function (Lines 112-128).

-------------
--Variables--
-------------

local TC = nil
TC = script.Parent.Configuration.TeamColor.Value
local pointModel = Instance.new("Model",game.Workspace)
local hum = script.Parent.Humanoid

-------------
--Functions--
-------------

--Finds the closest Enemy
function findClosestEnemy()
    --Variables
    local p = game.Players:GetChildren()
    local closestEnemy = nil
    local maxDistance = 50
    --Add NPCS to the players table
    for _, v in pairs (script.Parent.Parent:GetChildren()) do
        if v.Name == "Noob" or v.Name == "Guest" then
            table.insert(p,v)
        end
    end
    for _,player in pairs (p) do
        --If "player" classname is a player then
        if player.ClassName == "Player" then

            if player.TeamColor ~= TC then
                local char = player.Character
                if char ~= nil then
                    local humanoid = char:findFirstChild("Humanoid")
                    if humanoid and humanoid.Health>0 then
                        if closestEnemy == nil  and (char.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            closestEnemy = char
                        elseif (char.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            local NCEMag = (char.Torso.Position - script.Parent.Torso.Position).magnitude
                            local CEMag = (closestEnemy.Torso.Position - script.Parent.Torso.Position).magnitude
                            if NCEMag<CEMag then
                                closestEnemy = char
                            end
                        end
                    end
                end
            end
        --If "player" classname is not a player then
        else
            if player ~= nil and player ~= script.Parent then
                if player.Configuration.TeamColor.Value ~= TC then
                    local humanoid = player:findFirstChild("Humanoid")
                    if humanoid and humanoid.Health>0 then
                        if closestEnemy == nil  and (player.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            closestEnemy = player
                        elseif (player.Torso.Position - script.Parent.Torso.Position).magnitude<maxDistance then
                            local NCEMag = (player.Torso.Position - script.Parent.Torso.Position).magnitude
                            local CEMag = (closestEnemy.Torso.Position - script.Parent.Torso.Position).magnitude
                            if NCEMag<CEMag then
                                closestEnemy = player
                            end
                        end
                    end
                end
            end
        end
    end
    return closestEnemy
end

--Finds the closest Enemy SpawnPoint
function findClosestEnemySpawnpoint()
    local SpawnsContainer = script.Parent.Parent:GetChildren()
    local closestSpawnPoint = nil
    for _, spawn in pairs (SpawnsContainer) do
        if spawn.ClassName == "SpawnLocation" then
            if spawn.TeamColor ~= TC then
                if closestSpawnPoint == nil then
                    closestSpawnPoint = spawn
                else
                    local NSPMag = (spawn.Position - script.Parent.Torso.Position).magnitude
                    local CSPMag = (closestSpawnPoint.Position - script.Parent.Torso.Position).magnitude
                    if NSPMag < CSPMag then
                        closestSpawnPoint = spawn
                    end
                end
            end
        end
    end
    return closestSpawnPoint
end

--Visualizes the path (only for testing)
function visualizePath(path)
    -- clear old path visualization
    for _, point in pairs(pointModel:GetChildren()) do
        point:Destroy()
    end

    -- calculate new visualization  
    for _, point in pairs(path) do
        local part = Instance.new("Part")
        part.Parent = pointModel
        part.FormFactor = Enum.FormFactor.Custom
        part.Size = Vector3.new(1,1,1)
        part.Position = point
        part.Anchored = true
        part.CanCollide = false
    end
end

--Move to SpawnPoint
function MoveToSpawnPoint(s)
    local PF = game:GetService("PathfindingService"):ComputeRawPathAsync(script.Parent.Torso.Position,s.Position,512)
    local points = PF:GetPointCoordinates()
    local closestPoint = nil

    visualizePath(points)   

    for i = 1,#points do
        wait(0)
        if points[i] ~= nil then
            hum:MoveTo(points[i])
        end
        if (script.Parent.Torso.Position-s.Position).magnitude <3 then
            hum:MoveTo(s.Position,s)
        end
    end
end

--Move to Enemy
function MoveToEnemy(e)
    local PF = game:GetService("PathfindingService"):ComputeRawPathAsync(script.Parent.Torso.Position,e.Torso.Position,512)
    local points = PF:GetPointCoordinates()
    local closestPoint = nil

    --visualizePath(points) 

    for i = 1,#points do
        wait(0)
        if (script.Parent.Torso.Position-e.Torso.Position).magnitude > 3 and points[i*2] ~= nil then
            hum:MoveTo(points[i])
        else
            hum:MoveTo(e.Torso.Position,e.Torso)
        end
    end
end

-------------
--Task Area--
-------------

while wait(0) do
    --Finds if there is any enemy close
    local Enemy = findClosestEnemy()
    if Enemy~= nil then
        MoveToEnemy(Enemy)
    --If theres not any enemy close, then go to the spawn points
    else
        local Spawn = findClosestEnemySpawnpoint()

        if spawn ~= nil then
            MoveToSpawnPoint(Spawn)
        end
    end
end

Answer this question