feat(engine): 添加编辑器模式标志控制编辑器UI显示 (#274)

* feat(engine): 添加编辑器模式标志控制编辑器UI显示

- 在 Rust 引擎中添加 isEditor 标志,控制网格、gizmos、坐标轴指示器的显示
- 运行时模式下自动隐藏所有编辑器专用 UI
- 编辑器预览和浏览器运行时通过 setEditorMode(false) 禁用编辑器 UI
- 添加 Scene.isEditorMode 延迟组件生命周期回调,直到 begin() 调用
- 修复用户组件注册到 Core ComponentRegistry 以支持序列化
- 修复 Run in Browser 时用户组件加载问题

* fix: 复制引擎模块的类型定义文件到 dist/engine

* fix: 修复用户项目 tsconfig paths 类型定义路径

- 从 module.json 读取实际包名而不是使用目录名
- 修复 .d.ts 文件复制逻辑,支持 .mjs 扩展名
This commit is contained in:
YHH
2025-12-04 22:43:26 +08:00
committed by GitHub
parent 0d9bab910e
commit d7454e3ca4
16 changed files with 393 additions and 40 deletions

View File

@@ -62,6 +62,10 @@ export class SceneManagerService implements IService {
throw new Error('No active scene');
}
// 确保编辑器模式下设置 isEditorMode延迟组件生命周期回调
// Ensure isEditorMode is set in editor to defer component lifecycle callbacks
scene.isEditorMode = true;
// 只移除实体,保留系统(系统由模块管理)
// Only remove entities, preserve systems (systems managed by modules)
scene.entities.removeAllEntities();
@@ -117,6 +121,11 @@ export class SceneManagerService implements IService {
if (!scene) {
throw new Error('No active scene');
}
// 确保编辑器模式下设置 isEditorMode延迟组件生命周期回调
// Ensure isEditorMode is set in editor to defer component lifecycle callbacks
scene.isEditorMode = true;
scene.deserialize(jsonData, {
strategy: 'replace'
});

View File

@@ -7,7 +7,7 @@
*/
import type { IService } from '@esengine/ecs-framework';
import { Injectable, createLogger, PlatformDetector } from '@esengine/ecs-framework';
import { Injectable, createLogger, PlatformDetector, ComponentRegistry as CoreComponentRegistry } from '@esengine/ecs-framework';
import type {
IUserCodeService,
UserScriptInfo,
@@ -333,9 +333,23 @@ export class UserCodeService implements IService, IUserCodeService {
if (this._isComponentClass(exported)) {
logger.debug(`Found component: ${name} | 发现组件: ${name}`);
// Register with ComponentRegistry if provided | 如果提供了 ComponentRegistry 则注册
// ComponentRegistry expects ComponentTypeInfo object, not the class directly
// ComponentRegistry 期望 ComponentTypeInfo 对象,而不是直接传入类
// Register with Core ComponentRegistry for serialization/deserialization
// 注册到核心 ComponentRegistry 用于序列化/反序列化
try {
CoreComponentRegistry.register(exported);
// Debug: verify registration
const registeredType = CoreComponentRegistry.getComponentType(name);
if (registeredType) {
logger.info(`Component ${name} registered to core registry successfully`);
} else {
logger.warn(`Component ${name} registered but not found by name lookup`);
}
} catch (err) {
logger.warn(`Failed to register component ${name} to core registry | 注册组件 ${name} 到核心注册表失败:`, err);
}
// Register with Editor ComponentRegistry for UI display
// 注册到编辑器 ComponentRegistry 用于 UI 显示
if (componentRegistry && typeof componentRegistry.register === 'function') {
try {
componentRegistry.register({
@@ -345,7 +359,7 @@ export class UserCodeService implements IService, IUserCodeService {
description: `User component: ${name}`
});
} catch (err) {
logger.warn(`Failed to register component ${name} | 注册组件 ${name} 失败:`, err);
logger.warn(`Failed to register component ${name} to editor registry | 注册组件 ${name} 到编辑器注册表失败:`, err);
}
}