#text-effect #typewriter #bevy-ui #ui #bevy

bevy_ecs_typewriter

ECS typewriter system for Bevy engine

4 releases

Uses new Rust 2024

0.2.1 Mar 25, 2026
0.2.0 Feb 11, 2026
0.1.1 Feb 6, 2026
0.1.0 Nov 24, 2025

#1710 in Game dev


Used in souprune

MIT/Apache

5.5MB
285 lines

bevy_ecs_typewriter

license

bevy_ecs_typewriter — A pure text typewriter effect plugin for Bevy.

English Simplified Chinese
English 简体中文

Introduction

bevy_ecs_typewriter is a lightweight typewriter effect plugin for the Bevy game engine.
It provides pure text management without any dependency on UI components, making it flexible for various use cases.

With bevy_ecs_typewriter, you can create typewriter effects for dialogues, subtitles, or any text animations with simple component-based control.

Features

  • 🎮 Pure Text Management - No dependency on UI components, works with any rendering solution
  • Simple API - Easy to use with play, pause, resume, and stop controls
  • 🌏 Full Unicode Support - Works with any language including CJK, Arabic, Emoji, etc.
  • 🔄 Multiple Typewriters - Run multiple typewriters simultaneously
  • ⏱️ Dynamic Speed Control - Adjust typing speed in real-time
  • 📊 Progress Tracking - Get current progress and state information

Bevy Version Support

bevy bevy_ecs_typewriter
0.18 0.2.0
0.17 < 0.2.0

How to Use

  1. Add to Cargo.toml:

    [dependencies]
    bevy = "0.18"
    bevy_ecs_typewriter = "0.2.0"
    
  2. Add the plugin to your app:

    use bevy::prelude::*;
    use bevy_ecs_typewriter::{Typewriter, TypewriterPlugin};
    
    fn main() {
        App::new()
            .add_plugins(DefaultPlugins)
            .add_plugins(TypewriterPlugin)
            .add_systems(Startup, setup)
            .run();
    }
    
  3. Create a typewriter entity:

    fn setup(mut commands: Commands) {
        let mut typewriter = Typewriter::new("Hello, World!", 0.1);
        typewriter.play();
        commands.spawn(typewriter);
    }
    
  4. Access the current text:

    fn display_system(query: Query<&Typewriter, Changed<Typewriter>>) {
        for typewriter in &query {
            println!("{}", typewriter.current_text);
        }
    }
    

Examples

Run the examples to see the plugin in action:

# Basic control with keyboard input
cargo run --example basic_control

# Multiple typewriters running simultaneously
cargo run --example multiple_typewriters

# Unicode support (Chinese, Japanese, Korean, Arabic, Emoji)
cargo run --example multilingual

# Chain multiple dialogues automatically
cargo run --example chain_typewriters

# Dynamic speed control
cargo run --example dynamic_speed

Dependencies

This project uses the following crates:

Crate Version Description
bevy 0.18 Game engine

Contributing

Contributions are welcome! Whether you want to fix a bug, add a feature, or improve documentation:

  • Submit an Issue or Pull Request.
  • Share ideas and discuss design or architecture.

License

This project is licensed under either of

at your option.

Dependencies

~43MB
~760K SLoC