#osc #bevy #bevy-plugin #send-receive #rosc

bevy_rosc

在bevy中发送和接收OSC消息

7个版本 (破坏性更新)

0.7.0 2024年5月11日
0.6.0 2023年3月7日
0.5.0 2022年11月17日
0.4.0 2022年10月16日
0.1.0 2022年5月29日

#588 in 网络编程

Download history 208/week @ 2024-05-11 9/week @ 2024-05-18 1/week @ 2024-05-25 4/week @ 2024-06-08 1/week @ 2024-06-15 60/week @ 2024-07-27

每月60次下载

MIT/Apache

33KB
255

bevy_rosc

Bevy tracking crates.io docs.rs

使用rosc在bevy中发送和接收OSC 1.0消息。

用法

要快速开始,只需将插件添加到您的应用程序中

use bevy::prelude::*;

use bevy_rosc::OscMethod;
use bevy_rosc::{BevyRoscPlugin, SingleAddressOscMethod};

fn main() {
    App::new()
        // Minimal Bevy plugins
        .add_plugins(MinimalPlugins)
        // Add the bevy_rosc plugin and have it listen on port 31337
        .add_plugins(BevyRoscPlugin::new("0.0.0.0:31337").unwrap())
        .run();
}

现在您可以将SingleAddressOscMethodMultiAddressOscMethod添加到您的实体中。

OSC方法是具有一个或多个OSC地址的组件,可以接收具有匹配地址模式的OSC消息。

fn spawn_entity(mut commands: Commands) {
    commands.
        spawn(
            SingleAddressOscMethod::new(vec!["/some/osc/address".into()]).unwrap()
        );
}

然后您可以从组件中开始检索OSC消息!

/// System that listens for any `SingleAddressOscMethod` that has changed and prints received message
fn print_received_osc_packets(
    mut query: Query<&mut SingleAddressOscMethod, Changed<SingleAddressOscMethod>>,
) {
    for mut osc_receiver in query.iter_mut() {
        let new_msg = osc_receiver.get_message(); // Gets the oldest received message, or `None` if there are no more left
        if let Some(msg) = new_msg { println!("Method {:?} received: {:?}", osc_receiver.get_addresses(), msg) }
    }
}

有关完整示例,请参阅examples/plugin.rs

如果您想将OSC消息直接接收至自定义组件,请参阅examples/custom_osc_method.rs

数据流

graph TD;
    server1[UDP Server 1] --> dispatcher
    server2[UDP Server 2] --> dispatcher
    serverdot[...] --> dispatcher
    server3[Any other source] --> dispatcher
    dispatcher -- Write --> OscDispatchEvent{{OscDispatchEvent}}
    OscDispatchEvent -. Read .-> system1["method_dispatcher_system::&ltSingleAddressOscMethod&gt"]
    OscDispatchEvent -. Read ..-> system2["method_dispatcher_system::&ltMultiAddressOscMethod&gt"]
    OscDispatchEvent -. Read ...-> system3["method_dispatcher_system::&ltMyOscMethod&gt"]
    system1 -- Match & Receive --> comp1[(SingleAddressOscMethod)]
    system2 -- Match & Receive --> comp2[(MultiAddressOscMethod)]
    system3 -- Match & Receive --> comp3[(MyOscMethod)]

任何通过任何方式(通常是通过UDP服务器)接收到的OSC数据包都会发送到调度器。它解包OSC数据包,从中检索所有消息,并写入包含它们的OscDispatchEvent。从那里,方法调度器系统(每个OscMethod-组件一个)读取事件并遍历所有OSC方法组件。如果组件的地址与消息的地址模式匹配,则消息会被组件接收。

默认的OSC方法SingleAddressOscMethodMultiAddressOscMethod会将接收到的消息存储在向量中,您必须从中检索它们才能对其进行操作。但是,您的自定义OSC组件可以直接对接收到的消息进行操作。

Bevy兼容性

bevy bevy_rosc
0.13 0.7
0.10 0.6
0.9 0.5
0.8 0.4
0.7 0.1

依赖项

~20–47MB
~744K SLoC