#coroutine #bevy #gamedev #async #game

bevy_coroutine

一个用于在Bevy中运行协程的简单库

3个版本

0.1.2 2024年7月15日
0.1.1 2024年7月6日
0.1.0 2024年7月2日

游戏开发类别中排名第394

Download history 130/week @ 2024-06-28 132/week @ 2024-07-05 108/week @ 2024-07-12 12/week @ 2024-07-19 7/week @ 2024-07-26

每月下载量266

MIT许可证

34KB
317 代码行

Bevy Coroutine

Docs Crates.io Downloads license

一个简单的Bevy库,用于运行类似于Unity的协程的协程。
Bevy Coroutine非常实验性,新版本可能包含破坏性更改!

使用方法

Bevy Coroutine背后的主要动机是允许您将系统的执行分散到多个帧。它还有助于按时间顺序管理和运行系统。

use bevy::prelude::*;
use bevy_coroutine::prelude::*;

fn startup_system(mut commands: Commands) {
	// Launch the coroutine from a system
	commands.add(Coroutine::new(my_coroutine));
}

fn my_coroutine(

) -> CoResult {
	let mut res = co_break();
	// Print number from 0 to 3, printing a single number every second
	for i in 0..=3 {
		res.add_subroutines((
			wait(std::time::Duration::from_secs(1)),
			with_input(i, print_number),
		));
	}
	res
}

fn print_number(
	In(i): In<u32>,
) -> CoResult {
	println!("{i}");
	co_break()
}

协程是系统。它们可以访问任何系统参数,如QueryRes
协程不使用'yield'语句,而是返回一个CoResult。The CoResult表示协程应该'中断'并停止其执行,还是'继续'并在下一次更新时再次执行。此外,协程可以运行其他协程,并通过将它们作为子程序添加到CoResult中等待它们的完成。

执行状态可以使用Local作为参数在帧之间存储。

use bevy::prelude::*;
use bevy_coroutine::prelude::*;

fn my_coroutine(
	mut i: Local<u32>,
) -> CoResult {
	if *i <= 3
	{
		println!("{}", *i);
		*i += 1;
		return co_continue(); // Rerun the system next frame
	}
	co_break()
}

性能

每个协程都在一个专用的系统中运行。它们不会与其他协程或其他Bevy系统并行运行。
对于CPU密集型任务,请考虑使用bevy_tasksbevy_defer

版本

bevy bevy_coroutine
0.14 0.1.2
0.14 0.1.1
0.14.0-rc.4 0.1.0

依赖项

~23MB
~411K SLoC