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

Bevy中带动画重复实体创建及多实例动画失效问题排查

在Bevy中复制动画并创建带动画的重复实体

问题根源分析

你的代码存在两个关键问题导致多鱼实体动画失效:

  1. 语法错误:insert_resource语句缺少闭合括号,导致动画资源注册失败。
  2. Added<AnimationPlayer>查询无法稳定捕获所有场景加载完成后新增的组件——批量生成场景时,部分AnimationPlayer的添加帧可能与系统运行帧不匹配,导致动画设置逻辑遗漏。

修复步骤

1. 修复语法错误

在setup_fish系统中补全insert_resource的闭合括号:

commands.insert_resource(Animations(vec![
    asset_server.load("models/Fish_anim.gltf#Animation0"),
])); // 补全此处的闭合括号

2. 改用SceneSpawned事件监听场景加载

放弃依赖Added<AnimationPlayer>,改用SceneSpawned事件确保每个场景加载完成后都能触发动画设置:

use bevy::scene::SceneSpawned;

fn setup_scene_once_loaded(
    animations: Res<Animations>,
    mut players: Query<&mut AnimationPlayer>,
    mut scene_spawned_events: EventReader<SceneSpawned>,
) {
    for event in scene_spawned_events.iter() {
        // 遍历当前加载完成的场景内所有实体
        for entity in event.entities.iter() {
            // 为带有AnimationPlayer的实体设置循环播放动画
            if let Ok(mut player) = players.get_mut(*entity) {
                player.play(animations.0[0].clone_weak()).repeat();
            }
        }
    }
}

3. 正确注册系统

确保setup_scene_once_loaded在Update阶段运行,能接收场景加载事件:

App::new()
    // ... 其他插件、资源注册
    .add_startup_system(setup_fish)
    .add_system(setup_scene_once_loaded)
    // ...

核心逻辑说明

  • 动画复用:Bevy中的AnimationClip是全局资源,无需复制实体,通过clone_weak()创建弱引用,让多个AnimationPlayer共享同一个动画资源,既节省内存又保证动画一致性。
  • 重复实体创建:循环生成父实体时,使用scene.clone()生成场景句柄副本,每个副本会加载独立的场景实例,每个实例自带独立的AnimationPlayer组件,通过SceneSpawned事件统一绑定动画播放逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:24:19