返回 table 时得到 {}

When returning a table get {}

我正在尝试使用下面列出的模块创建迷宫生成脚本。我遇到这个奇怪的问题是 grid 变量有一个值,但是当调用 return grid 时,它 returns 和空 table?这是模块脚本的代码。

local ServerStorage = game:GetService("ServerStorage")
local cellTemplate = ServerStorage:WaitForChild("Cell")

local Maze = {}
local cellObject = {}

local grid = {}

Maze.Size = 25

Maze.CellWidth = 9
Maze.CellLength = 9

Maze.Offset = Vector3.new(0,0,0)

function Maze.new(x,z) -- Create a new cell
    local newCell = {}
    
    setmetatable(newCell,{ -- Allows us to create functions for a cell easier
        __index = cellObject
    })
    
    newCell.X = math.clamp(x,1,Maze.Size)
    newCell.Z = math.clamp(z,1,Maze.Size)
    
    newCell.Visited = false
    
    newCell.Model = cellTemplate:Clone()
    newCell.Base = newCell.Model:WaitForChild("Base")
    
    newCell.Model.Name = newCell.Model.Name.. "_".. newCell.X.. "-".. newCell.Z
    
    newCell.Walls = {
        ["Forward"] = newCell.Model:WaitForChild("Forward");
        ["Backward"] = newCell.Model:WaitForChild("Backward");
        ["Left"] = newCell.Model:WaitForChild("Left");
        ["Right"] = newCell.Model:WaitForChild("Right");
    }
    
    if not grid[x] then grid[x] = {} end -- We might not have anything on that x axis yet; inserts it into the table
    
    grid[x][z] = newCell
    
    print(grid)
    
    return newCell
end

function Maze.RenderAll() -- Render every cell; exists for more readibility
    for _,cellRow in pairs(grid) do -- Loop through every cell row
        for _,cell in pairs(cellRow) do -- Loop through every cell in the row
            cell:Render() -- Render the cell
        end
    end
end

function Maze.Grid() -- Allows other scripts to get the grid but not modify it
    return grid
end

function Maze.FilterUnvisited(cells) -- Takes in a table and returns one with only the cells in the table that are unvisited
    local unvisited = {}
    
    for _,cell in pairs(cells) do -- Loop through every cell in the table passed
        if not cell.Visitied then -- The cell hasn't been visited
            table.insert(unvisited,cell)
        end
    end
    
    return unvisited
end

function Maze.GetCell(x,z)
    local cell
    
    if grid[x] and grid[x][z] then
        cell = grid[x][z]
    else
        cell = nil
    end
    
    return cell
end

function cellObject:Render() -- Render the cell
    self.Model:SetPrimaryPartCFrame(CFrame.new(Vector3.new(self.X * Maze.CellLength,0,self.Z * Maze.CellWidth) + Maze.Offset)) -- Move the cell to the correct position
    
    if self.Visited then -- We have gone through the cell
        self.Model.PrimaryPart.Color3 = Color3.new(0,1,0) -- Show that the cell has been visited; used for debugging
    end
    
    self.Model.Parent = workspace
end

function cellObject:Neighbours() -- Returns the cell's neigbours
    local neighbours = {}
    
    -- Order: Right Left Up Down
    
    if grid[self.X + 1] and grid[self.X + 1][self.Z] then -- A cell with +1 X exists
        table.insert(neighbours,grid[self.X + 1][self.Z])
    end
    
    if grid[self.X - 1] and grid[self.X - 1][self.Z] then -- A cell with -1 X exists
        table.insert(neighbours,grid[self.X - 1][self.Z])
    end
    
    if grid[self.X][self.Z + 1] then -- A cell with +1 Z exists
        table.insert(neighbours,grid[self.X][self.Z + 1])
    end

    if grid[self.X][self.Z - 1] then -- A cell with -1 Z exists
        table.insert(neighbours,grid[self.X][self.Z - 1])
    end
    
    return neighbours
end

function cellObject:RandomNeighbour()
    local neighbours = self:Neighbours() -- Gets the neigbours of the current cell
    
    if #neighbours > 0 then
        return neighbours[math.random(1,#neighbours)] -- Returns a random neigbour
    else
        return nil
    end
end

function cellObject:WallArray() -- Returns an array of the walls instead of a table
    local wallArray = {}
    
    wallArray[1] = self.Walls.Forward
    wallArray[2] = self.Walls.Right
    wallArray[3] = self.Walls.Left
    wallArray[4] = self.Walls.Backward
    
    return wallArray
end

function cellObject:Join(cell) -- Joins 2 cells together
    local wallPosition = self.Base.Position:Lerp(cell.Base.Position,.5) -- This will return the position of the wall (excluding the Y)
    
    local cell1Array = self:WallArray()
    local cell2Array = cell:WallArray()
    
    for wallIndex,wall in pairs(cell1Array) do
        if wall.Position.X == wallPosition.X and wall.Position.Z == wallPosition.Z then -- Its the right wall
            wall.Transparency = 1
            wall.CanCollide = false
            
            cell2Array[4 - (wallIndex - 1)].Transparency = 1
            cell2Array[4 - (wallIndex - 1)].CanCollide = false
            
            break -- We don't need to loop anymore, since we've already removed the walls
        end
    end
end

function cellObject:Unjoin(cell) -- Unjoins 2 cells
    local wallPosition = self.Base.Position:Lerp(cell.Base.Position,.5) -- This will return the position of the wall (excluding the Y)
    
    local cell1Array = self:WallArray()
    local cell2Array = cell:WallArray()
    
    for wallIndex,wall in pairs(cell1Array) do
        if wall.Position.X == wallPosition.X and wall.Position.Z == wallPosition.Z then -- Its the right wall
            wall.Transparency = 0
            wall.CanCollide = true
            
            cell2Array[4 - (wallIndex - 1)].Transparency = 0
            cell2Array[4 - (wallIndex - 1)].CanCollide = true
            
            break -- We don't need to loop anymore, since we've already added the walls
        end
    end
end

return Maze

下面是我遇到困难的一段代码。

function Maze.Grid() -- Allows other scripts to get the grid but not modify it
    return grid
end

我已经测试过打印网格变量,它不是 {},但是当我在下面的脚本中调用该函数时,我总是得到 {}!我不知道这是为什么。 这是 roblox 中的错误还是我愚蠢?

local ServerScriptService = game:GetService("ServerScriptService")
local Maze = require(ServerScriptService:WaitForChild("Maze"))

local latestX = 0
local latestZ = 0

function CreatePath(cell)
    local nextCell = cell:RandomNextCell(false)
    
    if nextCell then -- We have a cell next to the current one
        print("Joining cells:",cell,nextCell)
        
        cell:Join(nextCell)
        cell.Visited = true
        
        cell:Render()
        
        wait(.01)
        CreatePath(nextCell)
    else -- It must be the end of the maze
        print("Path generated!")
        print("Maze end: ".. cell.Model.Name)
        
        cell.Base.Color = Color3.new(1,0,0)
    end
end

function GenerateMaze()
    local cell = Maze.new(latestX + 1,latestZ + 1) -- Create a new cell
    
    cell:Render() -- Render it
    
    print("Created cell")
    
    latestZ += 1
    
    if latestZ > Maze.Size then -- It has exceeded the max size, move on to a new row
        latestX += 1
        latestZ = 0
    end
    
    if #Maze.Grid() < Maze.Size ^ 2 then
        wait(.01)
        GenerateMaze()
    else
        print("Grid completed, generating path...")
        
        CreatePath(Maze.GetCell(1,1))
    end
end

GenerateMaze()

您正在返回一个缓存值,或者我没有找到其他原因。

您可以这样做(并且不可编辑):

function Maze.Grid(i, l)
    local passed = 1
    local response = {}
    for index, v in pairs(grid) do
        response[index] = i and passed >= i and l and passed <= l and v or not (i or l) and v
        -- basically get more than `i` if it, and minor than `l` if it passed
        i = i + 1
    end
    return response
end

应该可以,抱歉我没有测试。