什么是Raven引擎
Raven 是一款基于 Rust 语言开发的现代化视觉小说/文字冒险游戏引擎,专注于为开发者提供简洁高效的叙事工具链。凭借 Rust 的内存安全性与高性能特性,Raven 能够流畅运行于多平台,同时通过声明式脚本语法和模块化设计,大幅降低视觉小说的开发门槛。
这个文档是什么?
这份文档不是面对开发者的开发教程,而是源码编译手册,想研究和深度改造引擎的开发者可以阅读此文档 得到引擎改造思路和详尽的编译方法,同时可以了解引擎的架构
开源地址
https://github.com/e72uj/Raven联络我们
🐧群:818497392
稳定性警告
⚠️ 注意:当前项目处于早期开发阶段,API 会有重大变更,不建议在生产环境中使用。
或者:
Raven 引擎目前处于 Alpha 阶段,核心功能仍在开发中,存在不稳定因素。
系统要求
下面为作者的设备 配置为真实的调试和运行机器 芯片: M4 pro 内存: 24G 硬盘: 512G
开发环境配置
下面演示一下Raven开发环境配置的流程:
安装Rust
编译和运行Raven引擎需要使用rust,请访问官方进行数据
https://www.rust-lang.org/zh-CN/
拉取最新代码
使用GitKraken 或者是 GitHub Desktop 工具进行代码拉取。地址如下:
https://github.com/E72UJ/Raven.git
创建 crates 目录
drwxr-xr-x@ 13 furau staff 416 6 10 11:42 assets
-rw-r--r--@ 1 furau staff 126301 5 18 18:29 Cargo.lock
-rw-r--r--@ 1 furau staff 995 5 18 18:04 Cargo.toml
drwxr-xr-x@ 7 furau staff 224 5 27 19:59 cli
drwxr-xr-x@ 8 furau staff 256 5 18 16:53 crates
-rw-r--r--@ 1 furau staff 1713670585 5 28 00:04 crates.zip
drwxr-xr-x@ 6 furau staff 192 6 2 05:39 demo
drwxr-xr-x@ 8 furau staff 256 6 11 17:59 docs
drwxr-xr-x@ 9 furau staff 288 6 7 08:54 examples
-rw-r--r--@ 1 furau staff 10172 5 14 14:02 LICENSE-APACHE.txt
-rw-r--r--@ 1 furau staff 1151 6 2 05:43 README.md
drwxr-xr-x@ 3 furau staff 96 5 15 08:19 src
drwxr-xr-x@ 8 furau staff 256 5 14 06:10 target
编译程序
编译依赖包
为方便国内开发者编译引擎,我们准备了一个 引擎所用依赖 的国内镜像版本。 其中包含许多编译中间文件。请选择性使用 压缩包基础需求结构如下。
bevy
bevy_flash
flash_runtime
swf_animation-main
swf_macro
地址
[https://www.123865.com/s/ADdHjv-Oxsd3](https://www.123912.com/s/bGVovd-Ewwtd?pwd=Rb1V# 提取码:Rb1V)
Windows 编译手册
Macos 编译手册
常用词汇表
基本概念
引擎架构
graph LR A[创作工具] -->|生成| B[YAML配置文件] C[资源文件] -->|路径引用| B B -->|输入| D[Rust渲染引擎] D -->|输出| E[视觉小说画面]
工作流程
目录结构
Rust 项目目录结构分析
Cargo.toml - Rust 项目的配置文件,定义了项目元数据、依赖关系和构建设置
Cargo.lock - 锁定文件,记录了精确的依赖版本,确保构建的可重现性
src/ - 主要的源代码目录,包含项目的核心代码
target/ - Cargo 构建输出目录,包含编译后的二进制文件、库文件等
项目组织结构
crates/ - 包含多个子 crate(Rust 包),表明这是一个工作空间(workspace)项目
crates.zip - crates 目录的压缩备份
cli/ - 命令行界面相关代码,独立的 CLI 工具模块
文档和示例
README.md - 项目说明文档
docs/ - 详细的项目文档
examples/ - 使用示例和演示代码
demo/ - 演示相关文件
资源文件
assets/ - 项目资源文件,如配置文件、数据文件等
images/ - 图片资源
许可证文件
LICENSE 和 LICENSE-APACHE.txt - 项目许可证文件,采用了 Apache 许可证
资产文件结构
const EMBEDDED_FONT_FIRA_MONO: &[u8] = include_bytes!("../../crates/assets/fonts/FiraMono-Medium.ttf");
const EMBEDDED_FONT_GENSEN_MARU: &[u8] = include_bytes!("../../crates/assets/fonts/GenSenMaruGothicTW-Bold.ttf");
const EMBEDDED_FONT_SOURCE_HAN: &[u8] = include_bytes!("../../crates/assets/fonts/SourceHanSansSC-Medium.otf");
const EMBEDDED_RAVEN_EXE: &[u8] = include_bytes!("../../crates/assets/Raven");
const EMBEDDED_PORTRAIT_ALICE: &[u8] = include_bytes!("../../crates/assets/portraits/alice.png");
const EMBEDDED_PORTRAIT_BOB: &[u8] = include_bytes!("../../crates/assets/portraits/bob.png");
const EMBEDDED_PORTRAIT_NARRATOR: &[u8] = include_bytes!("../../crates/assets/portraits/narrator.png");
const EMBEDDED_SVG_SCIHUB: &[u8] = include_bytes!("../../crates/assets/portraits/SciHub.svg");
const EMBEDDED_MAIN_YAML: &[u8] = include_bytes!("../../crates/assets/main.yaml");
const EMBEDDED_DIALOGUES_YAML: &[u8] = include_bytes!("../../crates/assets/dialogues.yaml");
const EMBEDDED_CHAR_HEROINE_DEFAULT: &[u8] = include_bytes!("../../crates/assets/characters/heroine/default.png");
const EMBEDDED_CHAR_PROTAGONIST_DEFAULT: &[u8] = include_bytes!("../../crates/assets/characters/protagonist/default.png");
const EMBEDDED_CHAR_VILLAIN_DEFAULT: &[u8] = include_bytes!("../../crates/assets/characters/villain/default.png");
const EMBEDDED_SVG_LONG: &[u8] = include_bytes!("../../crates/assets/characters/svg/long.svg");
const EMBEDDED_SWF_66: &[u8] = include_bytes!("../../crates/assets/swf/66.swf"); // 新增SWF资源
| 文件/文件夹 | 描述 |
|---|---|
assets | 存放项目所需的资源文件,如图片、字体等 |
Cargo.toml | Rust 项目的配置文件,定义了项目的名称、版本、依赖等信息 |
Cargo.lock | 记录了项目依赖的确切版本,确保项目在不同环境下都使用相同的依赖版本 |
cli | 命令行工具相关的源代码 |
crates | 存放项目发布到 crates.io 的压缩包 |
crates.zip | 项目的发布压缩包 |
demo | 项目的示例代码 |
docs | 项目的文档 |
examples | 存放项目的示例代码 |
LICENSE-APACHE.txt | 项目的 Apache 2.0 许可证 |
README.md | 项目的自述文件 |
src | 项目的源代码文件夹 |
target | Rust 编译器生成的目标文件存放目录 |
DSL 设计
最后更新 2025/11/04 作者 furau
分层系统
默认层级结构
#![allow(unused)] fn main() { show alice happy # 显示在 master 层 show alice happy at left # 在指定位置显示 show bg school # 背景层 show overlay ui_element # UI层 }
多对象
每个层可以有多个对象,用标签区分
#![allow(unused)] fn main() { show alice happy as alice_main show alice sad as alice_memory # 同一角色的不同实例 }
替换机制
#![allow(unused)] fn main() { show alice happy # Alice 显示为开心 show alice sad # Alice 自动从开心切换到伤心(替换,不是叠加) hide alice # Alice 完全消失 show bg room # 显示房间背景 show bg school # 背景自动从房间切换到学校 }
对象遮蔽
#![allow(unused)] fn main() { character Alice { name = "爱丽丝"; sprite = "characters/protagonist/default.png"; } character Alice { name = "摩西"; sprite = "characters/protagonist/sad.png"; } }
执行策略
核心分段策略
#![allow(unused)] fn main() { scene 场景1 { // 连续执行的指令 show character Alice show background Hello play_music "intro.mp3" // 自动暂停点 - 对话 narrator "欢迎来到这个神奇的世界!" // 自动暂停点 - 角色对话 dialog Alice "你好,我是Alice!" dialog Alice "很高兴见到你!" // 连续执行的场景切换 hide background Hello show background School set Alice emotion happy // 又一个暂停点 dialog Alice "我们现在在学校了!" // 选择菜单 - 暂停点 choice { option "探索学校" -> { dialog Alice "好的,让我们一起探索!" jump scene 探索场景 } option "回家" -> { dialog Alice "那么再见了!" end_scene } } } }; }
常用命令
安装 rust
# Linux/macOS
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Windows (PowerShell)
$env:RUSTUP_DIST_SERVER = "https://mirrors.ustc.edu.cn/rust-static"
$env:RUSTUP_UPDATE_ROOT = "https://mirrors.ustc.edu.cn/rust-static/rustup"
irm https://sh.rustup.rs -UseBasicParsing | iex
优化编译
cargo build --release
执行案例程序
cargo run --example goto
常用cargo 指令
| `cargo clean` | 清理项目的构建成果 |
| `cargo update` | 更新项目的依赖项 |
| `cargo add` | 添加新的依赖项 |
| `cargo remove` | 移除项目的依赖项 |
常用资源代码关键词
样式资源
stylesheet: Res<UiStyleSheet>,
交互区域
click_area
颜色值设定
BackgroundColor(Color::NONE)
函数
载入页面布局函数
setup_about_scene()
卸载关于页面函数
cleanup_all_about()
载入帮助页面函数
setup_help_scene()
常量值表
常用按钮组颜色
const NORMAL_BUTTON: Color = Color::srgba(0.1, 0.1, 0.1, 0.8);
const HOVERED_BUTTON: Color = Color::srgb(0.25, 0.25, 0.25);
const PRESSED_BUTTON: Color = Color::srgb(0.35, 0.75, 0.35);
参考资料
bevy 案例
https://bevy.org/examples/
bevy github 案例
https://github.com/bevyengine/bevy/tree/main/examples
bevy-flash
https://github.com/aojiaoxiaolinlin/bevy_flash
核心系统
Script Engine(脚本引擎) - 解析和执行游戏脚本的核心系统,负责处理对话、选择分支和游戏逻辑。
Dialogue System(对话系统) - 管理角色对话显示、文本渲染和语音播放的系统。
Save/Load System(存档系统) - 处理游戏进度保存和读取,包括变量状态、剧情进度和用户选择记录。
Choice System(选择系统) - 处理玩家选择分支,影响剧情走向和角色好感度的系统。
资源管理
Asset Pipeline(资源管道) - 将原始素材(图片、音频、文本)转换为游戏可用格式的工具链。
Texture Atlas(纹理图集) - 将多个小图片合并到一张大图中,优化内存使用和渲染性能。
Localization System(本地化系统) - 支持多语言文本、音频和图片资源的管理系统。
Resource Manager(资源管理器) - 统一管理游戏资源的加载、缓存和释放。
视觉效果
Live2D Integration(Live2D集成) - 支持2D角色动画的技术,让角色立绘具有动态表情和动作。
Transition Effects(转场效果) - 场景切换、立绘变化时的视觉过渡效果,如淡入淡出、滑动等。
Layer System(图层系统) - 管理背景、角色立绘、UI元素等不同层次的渲染顺序。
Sprite Animation(精灵动画) - 处理2D图像的帧动画和补间动画。
音频系统
Audio Mixing(音频混合) - 同时播放多个音频轨道(BGM、音效、语音)的技术。
Lip Sync(唇语同步) - 让角色口型动画与语音对白同步的技术。
Dynamic Music(动态音乐) - 根据剧情情绪或玩家选择自动切换背景音乐。
脚本和数据
Markup Language(标记语言) - 用于编写游戏脚本的特殊语法,如Ren'Py的脚本语言。
Flag System(标志系统) - 记录游戏状态和玩家选择的布尔变量系统。
Variable Management(变量管理) - 处理数值型游戏数据,如好感度、金钱、属性值等。
Event Trigger(事件触发器) - 根据特定条件自动执行剧情事件的机制。
用户界面
UI Framework(UI框架) - 构建游戏界面的基础架构,包括按钮、菜单、对话框等。
Auto Mode(自动模式) - 自动播放对话和剧情,无需玩家手动点击的功能。
Skip Function(跳过功能) - 快速跳过已读内容或整段剧情的机制。
Backlog System(回顾系统) - 让玩家查看之前对话内容的历史记录功能。
高级功能
Gallery System(画廊系统) - 解锁和查看CG图片、音乐、角色资料的收藏功能。
Achievement System(成就系统) - 记录玩家完成特定目标的奖励机制。
Route Management(路线管理) - 处理多条剧情线和多结局的分支管理系统。
Memory Optimization(内存优化) - 针对大量图片和音频资源的内存使用优化技术。