Bevy 0.10.1启动系统排序失效,如何在two函数中访问MyResource?
问题解决:Bevy链式启动系统中无法访问后续资源
问题根源
Bevy的Commands是延迟执行的——所有通过Commands提交的操作(比如insert_resource),不会立即修改World状态,要等当前批次的系统全部执行完毕后,才会统一处理这些命令。哪怕用.chain()保证了one→between→two的执行顺序,one里的资源插入操作也要等到三个系统都跑完才会生效,所以two执行时自然拿不到MyResource。
两种解决方案
方案1:直接操作World(立即生效)
把one的参数从Commands换成&mut World,直接调用world.insert_resource(),资源会立刻被添加到World中,后续系统可以直接访问:
fn one(mut world: &mut World) { info!("before | inserting Resource ..."); world.insert_resource(MyResource(6.9)); }
方案2:插入apply_deferred强制执行延迟命令
在between和two之间加入apply_deferred系统,它会立刻执行所有之前堆积的延迟命令,确保two执行时资源已经存在:
fn main() { App::new() .add_startup_systems( (one, between, apply_deferred, two).chain() ) .run() }
选择建议
- 如果只是单纯插入资源,方案1更简洁直接;
- 如果你的场景中必须使用
Commands(比如还要执行其他延迟操作),方案2更适配原有逻辑。
内容的提问来源于stack exchange,提问作者reyop
相关产品推荐
相关产品推荐

