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

如何编写代码实现玩家相机抖动(不使用CameraShakeModule)

不使用CameraShakeModule实现相机抖动的正确方法

问题根源

你的代码在服务器端修改相机相关属性(包括Humanoid.CameraOffset),但Roblox中相机是客户端专属对象,服务器无法直接操控客户端相机——这就是你尝试的方法无效的核心原因。所有相机相关逻辑必须放在客户端脚本(LocalScript)中执行。

修正方案

核心思路

拆分逻辑:服务器负责技能的实体生成、物理效果等核心游戏逻辑,当需要触发相机抖动时,通过RemoteEvent通知对应客户端;客户端监听信号后,执行相机偏移逻辑实现抖动。

完整代码示例

服务器脚本(放在ServerScriptService中)

local ts = game:GetService("TweenService")
local replicated = game.ReplicatedStorage
local powers = replicated.Powers
local Info = TweenInfo.new(2, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut)
local ss = game:GetService("ServerStorage")
local FireWind = ss.FireWind:Clone()

-- 新增RemoteEvent用于通知客户端触发相机抖动
local triggerCamShake = Instance.new("RemoteEvent")
triggerCamShake.Name = "TriggerCamShake"
triggerCamShake.Parent = powers

powers.GiantFire.OnServerEvent:Connect(function(Player, Hit)
    local char = Player.Character or Player.CharacterAdded:Wait()
    local SuperFireSphere = Instance.new("Part")
    local hrpp = char.PrimaryPart
    
    -- 技能实体初始化逻辑
    SuperFireSphere.Shape = Enum.PartType.Ball
    SuperFireSphere.Material = Enum.Material.Neon
    SuperFireSphere.BrickColor = BrickColor.new("New Yeller")
    SuperFireSphere.Anchored = true
    SuperFireSphere.CanCollide = false
    
    task.wait(.2)
    local bv = Instance.new("BodyVelocity")
    bv.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
    bv.Velocity = CFrame.lookAt(hrpp.CFrame.Position, Hit.Position).LookVector * 150
    
    hrpp.Position += Vector3.new(0, 50 , 0)
    hrpp.Anchored = true
    SuperFireSphere.Parent = workspace
    FireWind:SetPrimaryPartCFrame(hrpp.CFrame)
    FireWind.Parent = workspace
    SuperFireSphere.Position = char.PrimaryPart.Position + Vector3.new(0,15,0)
    
    -- 火球放大逻辑
    for i = 1, 15 do
        task.wait(.1)
        SuperFireSphere.Size += Vector3.new(2,2,2)
    end
    
    -- 特效渐隐逻辑
    for i, parts in pairs(FireWind:GetDescendants()) do
        if parts:IsA("MeshPart") then
            local tween = ts:Create(parts, Info, {Transparency = 1})
            tween:Play()
        end
    end

    -- 通知当前玩家的客户端触发相机抖动
    triggerCamShake:FireClient(Player)

    -- 火球发射逻辑
    local FireParticle = ss.Fire:Clone()
    FireParticle.Parent = SuperFireSphere
    SuperFireSphere.Anchored = false
    bv.Parent = SuperFireSphere
    
    task.wait(2)
    hrpp.Anchored = false
    FireWind.Parent = ss
    
    -- 重置特效透明度
    for i, parts in pairs(FireWind:GetDescendants()) do
        if parts:IsA("MeshPart") then
            parts.Transparency = 0
        end
    end
    
    task.wait(5)
    SuperFireSphere:Destroy()
end)

客户端脚本(放在StarterPlayerScripts中)

local replicated = game.ReplicatedStorage
local powers = replicated.Powers
local triggerCamShake = powers.TriggerCamShake

local function cameraShake()
    local humanoid = game.Players.LocalPlayer.Character:WaitForChild("Humanoid")
    -- 可调整的抖动参数
    local shakeIntensity = 0.3   -- 抖动幅度,数值越大抖得越厉害
    local shakeFrequency = 0.05  -- 抖动间隔,数值越小频率越高
    local shakeDuration = 3      -- 抖动持续时间(秒)

    local startTime = tick()
    while tick() - startTime < shakeDuration do
        -- 生成随机偏移量
        local x = math.random(-100, 100)/100 * shakeIntensity
        local y = math.random(-100, 100)/100 * shakeIntensity
        local z = math.random(-100, 100)/100 * shakeIntensity
        humanoid.CameraOffset = Vector3.new(x, y, z)
        task.wait(shakeFrequency)
    end
    -- 抖动结束后重置相机偏移,避免相机一直错位
    humanoid.CameraOffset = Vector3.new(0,0,0)
end

-- 监听服务器发来的抖动触发信号
triggerCamShake.OnClientEvent:Connect(cameraShake)

关键优化说明

  • 相机逻辑移至客户端:利用Humanoid.CameraOffset实现偏移抖动,这是Roblox官方推荐的客户端相机偏移方案,能确保效果正常生效。
  • 精准触发:通过RemoteEvent仅通知释放技能的玩家客户端,避免影响其他玩家的相机体验。
  • 参数可定制:调整shakeIntensity、shakeFrequency、shakeDuration三个参数,就能得到不同强度和节奏的抖动效果。
  • 重置偏移:抖动结束后强制把CameraOffset归零,防止相机长期处于偏移状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:17:03