Roblox自定义动画设Action优先级仍被默认动画覆盖如何解决
问题核心原因
- 你调用的
Humanoid:LoadAnimation()是Roblox已经标记废弃的遗留API,这个接口加载动画时不会读取动画资源本身配置的优先级参数,运行时会默认把动画优先级拉到低层级,自然会被默认角色动画覆盖。 - 代码仅在脚本启动时获取一次角色实例,没有处理角色重生逻辑,角色死亡重生后旧的Humanoid引用失效,新生成角色的动画播放逻辑完全不受你之前的代码控制。
- 仅在动画编辑器里设置优先级不可靠,旧API加载链路不会同步这个配置,必须在加载出AnimationTrack实例后显式赋值优先级。
- Roblox默认角色的Idle、Walk、跑跳动画本身就占用Action优先级,如果你只设置到Action层级,同优先级下默认动画权重更高,会出现重叠覆盖的情况。
修复方案
直接替换为新版Animator加载接口,显式指定更高的Action优先级,补全角色重生监听逻辑,修复后的可直接运行代码如下:
local ContentProvider = game:GetService("ContentProvider") local UserInputService = game:GetService("UserInputService") local Players = game:GetService("Players") local player = Players.LocalPlayer local activeTracks = {} -- 预加载动画资源 local animFolder = script:WaitForChild("Animations") local animAssets = animFolder:GetChildren() warn("assetsLoading") ContentProvider:PreloadAsync(animAssets) warn("assetsLoaded") local anim1 = animFolder:WaitForChild("Animation") local anim2 = animFolder:WaitForChild("Animation2") local function initCharacter(character) -- 清理旧动画引用 for _, track in activeTracks do track:Destroy() end table.clear(activeTracks) local humanoid = character:WaitForChild("Humanoid") -- 必须从Humanoid下的Animator实例加载动画,这是当前版本的正式API local animator = humanoid:WaitForChild("Animator") -- 加载动画后显式设置优先级为Action4,比默认动画用的Action高3个层级,完全不会被覆盖 local track1 = animator:LoadAnimation(anim1) track1.Priority = Enum.AnimationPriority.Action4 local track2 = animator:LoadAnimation(anim2) track2.Priority = Enum.AnimationPriority.Action4 table.insert(activeTracks, track1) table.insert(activeTracks, track2) -- 绑定输入逻辑 local inputConn inputConn = UserInputService.InputBegan:Connect(function(input, isTyping) if isTyping then return end if input.KeyCode == Enum.KeyCode.N then track1:Play() task.wait(1) track1:Stop() track2:Play() end end) -- 角色移除时断开连接避免内存泄漏 character.AncestryChanged:Connect(function() if not character:IsDescendantOf(workspace) then inputConn:Disconnect() end end) end -- 首次进入、角色重生都重新初始化逻辑 if player.Character then initCharacter(player.Character) end player.CharacterAdded:Connect(initCharacter)
额外排查项
- 如果调整后仍有动画重叠,按F9打开开发者控制台,查看当前客户端播放的所有动画轨道的优先级,确认是否有其他脚本在播放同骨骼的冲突动画。
- 非循环动画不要勾选Looped属性,否则同优先级下两个循环动画会出现权重均分的模型抖动、动画重叠问题。
- 如果需要动画完全覆盖默认上半身/下半身动画,可以在播放自定义动画时调用
track:AdjustWeight(1, 0)把动画权重直接拉满,跳过默认的权重融合过程。
内容的提问来源于stack exchange,提问作者hayden jackson
相关产品推荐
相关产品推荐

