no message

This commit is contained in:
2026-07-06 09:43:46 +08:00
parent 4564ac5f47
commit ff1542c24f
22 changed files with 8771 additions and 309 deletions

View File

@@ -70,8 +70,7 @@ exports.template = `
<ui-button id="btn-next">下一关</ui-button>
<ui-button id="btn-load">加载</ui-button>
<ui-button id="btn-new">新建</ui-button>
<ui-button id="btn-save" type="primary">保存 JSON</ui-button>
<ui-button id="btn-bake">烘焙预制体</ui-button>
<ui-button id="btn-save" type="primary">保存地图</ui-button>
<ui-button id="btn-import-prefab">从预制体同步</ui-button>
<ui-button id="btn-open-prefab">打开 Level 预制体</ui-button>
<ui-button id="btn-scene-snap">场景选中吸附</ui-button>
@@ -118,7 +117,7 @@ exports.template = `
<div class="lme-canvas-wrap">
<canvas id="lme-canvas" width="720" height="520"></canvas>
</div>
<div class="lme-status" id="status">地图/出生点编辑 · 自动保存 JSON 并烘焙 · 60×60 网格 · 滚轮缩放 · 长按右键拖动</div>
<div class="lme-status" id="status">地图/出生点编辑 · 绘制后自动暂存 · 点「保存地图」写入 JSON 并烘焙预制体 · 滚轮缩放 · 长按右键拖动</div>
</div>
<div class="lme-palette">
<h4 id="palette-title">平铺调色板</h4>
@@ -135,7 +134,6 @@ exports.$ = {
btnLoad: '#btn-load',
btnNew: '#btn-new',
btnSave: '#btn-save',
btnBake: '#btn-bake',
btnImportPrefab: '#btn-import-prefab',
btnOpenPrefab: '#btn-open-prefab',
btnSceneSnap: '#btn-scene-snap',
@@ -561,11 +559,12 @@ exports.ready = function () {
persistMapChanges({ quiet: true, skipBake: true });
try {
bakeIgnore.markBakePending(state.levelId);
const outDir = prefabSync.resolvePrefabDirRel(projectPath());
execSync(
`python3 tools/bake_cocos_level_prefabs.py --db ${DB_REL} --out-dir assets/resources/level-prefabs --level-id ${state.levelId} --theme ${state.theme}`,
`python3 tools/bake_cocos_level_prefabs.py --db ${DB_REL} --out-dir ${outDir} --level-id ${state.levelId} --theme ${state.theme}`,
{ cwd: projectPath(), stdio: 'pipe' },
);
const prefabUrl = `db://assets/resources/level-prefabs/Level${state.levelId}.prefab`;
const prefabUrl = prefabSync.prefabDbUrl(state.levelId, projectPath());
try {
Editor.Message.request('asset-db', 'refresh-asset', prefabUrl);
} catch (e) {
@@ -574,7 +573,8 @@ exports.ready = function () {
if (options.auto) {
setStatus(`关卡 ${state.levelId} 已自动保存并烘焙 → Level${state.levelId}.prefab`);
} else {
setStatus(`关卡 ${state.levelId} 已烘焙(主题 ${state.theme})→ level-prefabs/Level${state.levelId}.prefab`);
const outDir = prefabSync.resolvePrefabDirRel(projectPath());
setStatus(`关卡 ${state.levelId} 已保存地图 → JSON + ${outDir}/Level${state.levelId}.prefab`);
}
console.log(`[level-map-editor] baked Level${state.levelId}.prefab`);
} catch (e) {
@@ -587,25 +587,25 @@ exports.ready = function () {
}
};
const saveLevel = () => {
/** 保存 JSON + 烘焙预制体(运行时分包 bundle-level-prefabs */
const saveMapLevel = () => {
cancelAutoBake();
persistMapChanges({ quiet: true, skipBake: true });
setStatus(`已保存关卡 ${state.levelId}(主题 ${state.theme}`);
if (!state.config || !state.db) {
setStatus('请先加载或新建关卡');
return;
}
if (!persistMapChanges({ quiet: true, skipBake: true })) return;
runBake.call(this, { auto: false });
};
/** 每次改地图立即写 JSON */
/** 绘制时暂存 JSON延迟自动烘焙 */
const scheduleMapPersist = () => {
persistMapChanges();
};
const bakeLevel = () => {
cancelAutoBake();
runBake.call(this, { auto: false });
};
const openLevelPrefab = async () => {
const id = state.levelId;
const uuid = await Editor.Message.request('asset-db', 'query-uuid', `db://assets/resources/level-prefabs/Level${id}.prefab`);
const uuid = await Editor.Message.request('asset-db', 'query-uuid', prefabSync.prefabDbUrl(id, projectPath()));
if (uuid) {
await Editor.Message.request('asset-db', 'open-asset', uuid);
setStatus(`已打开 Level${id}.prefabGround / Border 子节点,贴图主题 ${state.theme}`);
@@ -952,8 +952,7 @@ exports.ready = function () {
}
});
bindOnce(this.$.btnNew, 'click', () => createNewLevel.call(this));
bindOnce(this.$.btnSave, 'click', () => saveLevel.call(this));
bindOnce(this.$.btnBake, 'click', () => bakeLevel.call(this));
bindOnce(this.$.btnSave, 'click', () => saveMapLevel.call(this));
bindOnce(this.$.btnImportPrefab, 'click', () => importFromPrefab.call(this));
bindOnce(this.$.btnOpenPrefab, 'click', () => openLevelPrefab.call(this));
@@ -991,7 +990,7 @@ exports.ready = function () {
const prefabUuid = await Editor.Message.request(
'asset-db',
'query-uuid',
`db://assets/resources/level-prefabs/Level${state.levelId}.prefab`,
prefabSync.prefabDbUrl(state.levelId, projectPath()),
);
if (prefabUuid) uuids = [prefabUuid];
}

View File

@@ -6,7 +6,10 @@ const levelIdUtil = require('./level-id');
const LEVEL_MAP_TYPE = 'd4e5fanuMlNDh8qO0xdbn+K';
const DB_REL = 'assets/level-data/levels-database.json';
const PREFAB_DIR_REL = 'assets/resources/level-prefabs';
const PREFAB_BUNDLE_REL = 'assets/bundle-level-prefabs/level-prefabs';
const PREFAB_LEGACY_REL = 'assets/resources/level-prefabs';
/** @deprecated 使用 resolvePrefabDirRel */
const PREFAB_DIR_REL = PREFAB_LEGACY_REL;
const PREFAB_NAME_RE = /^Level(\d+)\.prefab$/i;
const TILE_NODE_RE = /^([gb])_(-?\d+)_(-?\d+)$/;
@@ -20,8 +23,18 @@ function dbPath(projectPath) {
return path.join(projectRoot(projectPath), DB_REL);
}
function resolvePrefabDirRel(projectPath) {
const root = projectRoot(projectPath);
if (fs.existsSync(path.join(root, PREFAB_BUNDLE_REL))) return PREFAB_BUNDLE_REL;
return PREFAB_LEGACY_REL;
}
function prefabDir(projectPath) {
return path.join(projectRoot(projectPath), PREFAB_DIR_REL);
return path.join(projectRoot(projectPath), resolvePrefabDirRel(projectPath));
}
function prefabDbUrl(levelId, projectPath) {
return `db://${resolvePrefabDirRel(projectPath)}/Level${levelId}.prefab`;
}
function prefabPath(levelId, projectPath) {
@@ -258,6 +271,10 @@ function extractLevelIdFromFilename(name) {
module.exports = {
DB_REL,
PREFAB_DIR_REL,
PREFAB_BUNDLE_REL,
PREFAB_LEGACY_REL,
resolvePrefabDirRel,
prefabDbUrl,
prefabPath,
dbPath,
parsePrefabFile,

View File

@@ -1,7 +1,7 @@
{
"package_version": 2,
"name": "level-map-editor",
"version": "1.7.1",
"version": "1.7.2",
"description": "关卡地图编辑(对齐 Unity Tile Palette中间关卡、右侧地图模块",
"author": "tfrh",
"editor": ">=3.8.0",