* feat(behavior-tree): 完全 ECS 化的行为树系统 * feat(editor-app): 添加行为树可视化编辑器 * chore: 移除 Cocos Creator 扩展目录 * feat(editor-app): 行为树编辑器功能增强 * fix(editor-app): 修复 TypeScript 类型错误 * feat(editor-app): 使用 FlexLayout 重构面板系统并优化资产浏览器 * feat(editor-app): 改进编辑器UI样式并修复行为树执行顺序 * feat(behavior-tree,editor-app): 添加装饰器系统并优化编辑器性能 * feat(behavior-tree,editor-app): 添加属性绑定系统 * feat(editor-app,behavior-tree): 优化编辑器UI并改进行为树功能 * feat(editor-app,behavior-tree): 添加全局黑板系统并增强资产浏览器功能 * feat(behavior-tree,editor-app): 添加运行时资产导出系统 * feat(behavior-tree,editor-app): 添加SubTree系统和资产选择器 * feat(behavior-tree,editor-app): 优化系统架构并改进编辑器文件管理 * fix(behavior-tree,editor-app): 修复SubTree节点错误显示空节点警告 * fix(editor-app): 修复局部黑板类型定义文件扩展名错误
129 lines
3.5 KiB
Rust
129 lines
3.5 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use std::sync::Arc;
|
|
use tokio::sync::Mutex;
|
|
use crate::profiler_ws::ProfilerServer;
|
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
pub struct ProjectInfo {
|
|
pub name: String,
|
|
pub path: String,
|
|
pub version: String,
|
|
}
|
|
|
|
#[derive(Debug, Serialize, Deserialize)]
|
|
pub struct EditorConfig {
|
|
pub theme: String,
|
|
pub auto_save: bool,
|
|
pub recent_projects: Vec<String>,
|
|
}
|
|
|
|
impl Default for EditorConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
theme: "dark".to_string(),
|
|
auto_save: true,
|
|
recent_projects: Vec::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct ProfilerState {
|
|
pub server: Arc<Mutex<Option<Arc<ProfilerServer>>>>,
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn start_profiler_server(
|
|
port: u16,
|
|
state: tauri::State<'_, ProfilerState>,
|
|
) -> Result<String, String> {
|
|
let mut server_lock = state.server.lock().await;
|
|
|
|
if server_lock.is_some() {
|
|
return Err("Profiler server is already running".to_string());
|
|
}
|
|
|
|
let server = Arc::new(ProfilerServer::new(port));
|
|
|
|
match server.start().await {
|
|
Ok(_) => {
|
|
*server_lock = Some(server);
|
|
Ok(format!("Profiler server started on port {}", port))
|
|
}
|
|
Err(e) => Err(format!("Failed to start profiler server: {}", e)),
|
|
}
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn stop_profiler_server(
|
|
state: tauri::State<'_, ProfilerState>,
|
|
) -> Result<String, String> {
|
|
let mut server_lock = state.server.lock().await;
|
|
|
|
if server_lock.is_none() {
|
|
return Err("Profiler server is not running".to_string());
|
|
}
|
|
|
|
*server_lock = None;
|
|
Ok("Profiler server stopped".to_string())
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn get_profiler_status(
|
|
state: tauri::State<'_, ProfilerState>,
|
|
) -> Result<bool, String> {
|
|
let server_lock = state.server.lock().await;
|
|
Ok(server_lock.is_some())
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn read_behavior_tree_file(file_path: String) -> Result<String, String> {
|
|
use std::fs;
|
|
|
|
// 使用 Rust 标准库直接读取文件,绕过 Tauri 的 scope 限制
|
|
fs::read_to_string(&file_path)
|
|
.map_err(|e| format!("Failed to read file {}: {}", file_path, e))
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn write_behavior_tree_file(file_path: String, content: String) -> Result<(), String> {
|
|
use std::fs;
|
|
|
|
// 使用 Rust 标准库直接写入文件
|
|
fs::write(&file_path, content)
|
|
.map_err(|e| format!("Failed to write file {}: {}", file_path, e))
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn read_global_blackboard(project_path: String) -> Result<String, String> {
|
|
use std::fs;
|
|
use std::path::Path;
|
|
|
|
let config_path = Path::new(&project_path).join(".ecs").join("global-blackboard.json");
|
|
|
|
if !config_path.exists() {
|
|
return Ok(String::from(r#"{"version":"1.0","variables":[]}"#));
|
|
}
|
|
|
|
fs::read_to_string(&config_path)
|
|
.map_err(|e| format!("Failed to read global blackboard: {}", e))
|
|
}
|
|
|
|
#[tauri::command]
|
|
pub async fn write_global_blackboard(project_path: String, content: String) -> Result<(), String> {
|
|
use std::fs;
|
|
use std::path::Path;
|
|
|
|
let ecs_dir = Path::new(&project_path).join(".ecs");
|
|
let config_path = ecs_dir.join("global-blackboard.json");
|
|
|
|
// 创建 .ecs 目录(如果不存在)
|
|
if !ecs_dir.exists() {
|
|
fs::create_dir_all(&ecs_dir)
|
|
.map_err(|e| format!("Failed to create .ecs directory: {}", e))?;
|
|
}
|
|
|
|
fs::write(&config_path, content)
|
|
.map_err(|e| format!("Failed to write global blackboard: {}", e))
|
|
}
|
|
|