You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Roblox塔防游戏脚本故障:无法放置塔,存在end/then语句匹配错误

Roblox塔防脚本问题排查与修复

问题描述

  • 修改脚本实现放置塔后需重新点击按钮才能放置下一座塔,同时开发了有效/无效放置区域功能
  • 测试时出现then与end语句匹配错误,调整后错误红标消失,但放置按钮失效且无任何报错
  • 改回原脚本后,又出现end语句红标错误,报错信息:

Players.ASWXDYC2.PlayerGui.ScreenGui.GameController:143: Expected 'end' (to close 'function' at line 48), got ; did you forget to close 'then' at line 85?

错误根源与修复

你的脚本核心问题是函数ColorPlaceholderTower缺少闭合的end,导致整个脚本的语法结构混乱,引发后续一系列问题:

原错误函数代码:

local function ColorPlaceholderTower(color)

    for i, object in ipairs(towerToSpawn:GetDescendants()) do
        if object:IsA("BasePart") then
            object.Color = color
        end
end

这里for循环和函数本身都缺少对应的end,正确写法:

local function ColorPlaceholderTower(color)
    for i, object in ipairs(towerToSpawn:GetDescendants()) do
        if object:IsA("BasePart") then
            object.Color = color
        end
    end -- 闭合for循环
end -- 闭合函数

额外优化建议

  • 你的代码中RemovePlaceholderTower函数已经在放置后重置towerToSpawn为nil,符合“需重新点击按钮放塔”的需求,无需额外修改
  • 可以给TowerArea区域添加CollectionService标签,用标签判断有效区域比依赖父对象名称更可靠,避免因重命名导致功能失效
  • 在RenderStepped中处理塔位置时,建议增加towerToSpawn.PrimaryPart的空值判断,防止空引用报错

修复后的完整脚本

local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local camera = workspace.CurrentCamera
local towerToSpawn = nil
local gui = script.Parent
local replicatedstorage = game:GetService("ReplicatedStorage")
local towers = replicatedstorage:WaitForChild("Towers")
local events = replicatedstorage:WaitForChild("Events")
local spawnTowerEvent = events:WaitForChild("SpawnTower")
local canPlace = false

local function MouseRaycast(blacklist)
    local mousePosition = UserInputService:GetMouseLocation()
    local mouseRay = camera:ViewportPointToRay(mousePosition.X, mousePosition.Y)
    local raycastParams = RaycastParams.new()
    
    raycastParams.FilterType = Enum.RaycastFilterType.Blacklist
    raycastParams.FilterDescendantsInstances = blacklist
    
    local raycastResult = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 1000, raycastParams)
    return raycastResult
end

local function RemovePlaceholderTower()
    if towerToSpawn then
        towerToSpawn:Destroy()
        towerToSpawn = nil
    end
end

local function AddPlaceHolderTower(name)
    local towerExists = towers:FindFirstChild(name)
    if towerExists then
        RemovePlaceholderTower()
        towerToSpawn = towerExists:Clone()
        towerToSpawn.Parent = workspace.Towers
    end
end

local function ColorPlaceholderTower(color)
    for i, object in ipairs(towerToSpawn:GetDescendants()) do
        if object:IsA("BasePart") then
            object.Color = color
        end
    end
end

gui.Gunslinger.Activated:Connect(function()
    AddPlaceHolderTower("Gunslinger")
end)

UserInputService.InputBegan:Connect(function(input, processed)
    if processed then return end
    
    if towerToSpawn and input.UserInputType == Enum.UserInputType.MouseButton1 then
        if canPlace then
            spawnTowerEvent:FireServer(towerToSpawn.Name, towerToSpawn.PrimaryPart.CFrame)
            RemovePlaceholderTower()
        end
    end
end)

RunService.RenderStepped:Connect(function()
    if not towerToSpawn then return end
    
    local result = MouseRaycast({towerToSpawn})
    if result and result.Instance then
        canPlace = result.Instance.Parent.Name == "TowerArea"
        ColorPlaceholderTower(canPlace and Color3.new(0,1,0) or Color3.new(1,0,0))
        
        local pos = result.Position
        local yOffset = towerToSpawn.Humanoid.HipHeight + (towerToSpawn.PrimaryPart.Size.Y * 2)
        local cframe = CFrame.new(pos.X, pos.Y + yOffset, pos.Z)
        towerToSpawn:SetPrimaryPartCFrame(cframe)
    end
end)

内容的提问来源于stack exchange,提问作者Twebs Playz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:17:48