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

CRIT Billboard GUI无法运行,报错'attempt to index nil with Character'如何修复?

修复CRIT Billboard GUI的"attempt to index nil with 'Character'"错误

错误根源

你的脚本放置在Workspace.Knife中,属于服务器脚本,但代码里使用了game.Players.LocalPlayer——这个API仅在客户端脚本(如StarterPlayerScripts、StarterPack内的脚本)中有效,服务器环境下调用会返回nil。当player变量为nil时,尝试访问player.Character自然会触发attempt to index nil with 'Character'的报错。

修复方案

根据代码最后hit.Parent.Humanoid:TakeDamage()的逻辑,推测这是刀的攻击检测脚本,需要区分攻击玩家和被攻击目标,以下是修正后的完整代码:

local knife = script.Parent
local hitboxActivated = false -- 假设此变量为攻击状态开关,需提前定义

-- 绑定刀的触碰事件
knife.Touched:Connect(function(hit)
    -- 攻击冷却/开关判断
    if hitboxActivated then return end
    hitboxActivated = true

    -- 获取被攻击目标的角色与Humanoid
    local targetChar = hit.Parent
    local targetHum = targetChar:FindFirstChildOfClass("Humanoid")
    -- 安全校验:目标必须有存活的Humanoid
    if not targetHum or targetHum.Health <= 0 then
        hitboxActivated = false
        return
    end

    -- 通过刀的父级(玩家角色)获取攻击玩家
    local player = game.Players:GetPlayerFromCharacter(knife.Parent)
    -- 安全校验:确保刀属于合法玩家
    if not player then
        hitboxActivated = false
        return
    end

    -- 创建暴击提示GUI
    local gui = Instance.new("BillboardGui")
    gui.Parent = targetChar.Head -- 挂载到被攻击目标头上,若需显示在攻击者头上则改为player.Character.Head
    gui.Adornee = targetChar.Head
    gui.Size = UDim2.new(0, 200, 0, 50)
    gui.StudsOffset = Vector3.new(0, 2, 0)

    local text = Instance.new("TextLabel")
    text.Parent = gui
    text.Size = UDim2.new(1, 0, 1, 0)
    text.BackgroundTransparency = 1
    text.TextColor3 = Color3.fromRGB(223, 204, 0)
    text.TextScaled = true
    text.Text = "1.75x"

    wait(1)
    gui:Destroy()

    -- 施加暴击伤害
    targetHum:TakeDamage(8 * 1.75)
    hitboxActivated = false
end)

关键改动说明

  1. 移除LocalPlayer依赖:服务器脚本通过game.Players:GetPlayerFromCharacter(knife.Parent)从刀的所属角色获取玩家对象,避免了服务器环境下LocalPlayer为nil的问题。
  2. 增加安全校验:在创建GUI和施加伤害前,检查目标Humanoid是否存在且存活、攻击玩家是否合法,避免后续代码因nil值触发新报错。
  3. 明确角色对象:区分攻击玩家与被攻击目标,确保GUI挂载到正确的角色头上(可根据需求调整为攻击者角色)。

额外注意

如果你的脚本原本是客户端脚本,需将其移动到StarterPlayerScripts或StarterPack中,同时修改角色获取逻辑以等待角色加载完成:

local player = game.Players.LocalPlayer
-- 等待角色加载完成(避免角色未初始化时Character为nil)
local character = player.Character or player.CharacterAdded:Wait()
local hum = character:FindFirstChildOfClass("Humanoid")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:41:30