You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

376 lines
60 KiB

2 weeks ago
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
// @ts-ignore
const package_json_1 = __importDefault(require("../../../../package.json"));
/** 属性检查器:读取/写回节点与组件属性。 */
exports.default = {
async loadInspector() {
if (!this.selectedId) {
this.inspector = null;
return;
}
this.inspectorLoading = true;
try {
const res = await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'get-inspector', timeout: 2500, payload: { id: this.selectedId } });
this.inspector = res && res.id ? res : { error: String((res && res.error) || '获取属性失败') };
}
catch (err) {
this.inspector = { error: `获取属性失败: ${String(err)}` };
}
finally {
this.inspectorLoading = false;
}
},
async sendSet(payload) {
// 关键修复:payload 里可能混入 Vue reactive Proxy(如 vec3 属性对象),
// Editor.Message.request 经结构化克隆传参,Proxy 无法克隆会抛
// "An object could not be cloned"。发送前深拷贝为纯对象。
let plain;
try {
plain = JSON.parse(JSON.stringify(payload));
}
catch (_a) {
plain = Object.assign({}, payload);
}
try {
const res = await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'set-property', timeout: 1500, payload: plain });
if (!res || typeof res !== 'object') {
this.logs.push('[写回] 无响应:命令未到达游戏(检查桥接脚本版本)');
return;
}
if (res.error) {
this.logs.push(`[写回] 游戏返回: ${res.error}`);
return;
}
const label = res.node ? `${res.node}` : (payload.field || payload.key || '');
this.logs.push(`[写回] 已设置 ${label} = ${JSON.stringify(payload.value)}`);
// 单向语义:保留本地乐观值,不被游戏回读覆盖。
// 仅做一次静默回读用于诊断——若游戏逻辑/动画后覆盖了设定值,只记日志提示,
// 不回写 UI,避免"双向绑定"把编辑框刷成游戏当前值。
const e = this.inspector;
const localVal = this.getLocalValue(payload);
try {
const back = await Editor.Message.request(package_json_1.default.name, 'query-command', { cmd: 'get-inspector', timeout: 1500, payload: { id: this.selectedId } });
const cur = back && back.props && !back.error ? this.pickValue(back, payload) : undefined;
if (cur !== undefined && localVal !== undefined) {
const a = JSON.stringify(cur);
const b = JSON.stringify(localVal);
if (a !== b) {
this.logs.push(`[写回] 注意:回读值 ${a} 与设定值 ${b} 不同,可能被游戏逻辑/动画/物理每帧覆盖`);
}
}
}
catch (_b) {
/* 静默回读失败不影响编辑 */
}
finally {
// 恢复本地乐观值到 UI(若上面的回读请求把本地对象引用改了)
if (e && !e.error) {
this.applyLocalValue(e, payload, localVal);
}
}
}
catch (err) {
this.logs.push(`[写回] ${String(err)}`);
}
},
onNodeBool(field, val) {
if (!this.inspector) {
return;
}
this.inspector.props[field].v = val;
this.sendSet({ id: this.selectedId, field, value: val });
},
onNodeNumber(field, raw) {
if (!this.inspector) {
return;
}
const v = this.toNum(raw);
this.inspector.props[field].v = v;
this.sendSet({ id: this.selectedId, field, value: v });
},
onNodeVec(field, axis, raw) {
if (!this.inspector || !this.inspector.props || !this.inspector.props[field]) {
return;
}
const cur = this.inspector.props[field].v;
cur[axis] = this.toNum(raw);
this.sendSet({ id: this.selectedId, field, value: cur });
},
onCompScalar(compIdx, key, raw, t) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
let val = raw;
if (t === 'number') {
val = this.toNum(raw);
}
else if (t === 'bool') {
val = raw === true || raw === 'true';
}
if (prop) {
prop.v = val;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: val });
},
onCompVec(compIdx, key, axis, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
prop.v[axis] = this.toNum(raw);
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: prop.v });
},
onCompColor(compIdx, key, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
const v = this.arrToColor(raw);
if (prop) {
prop.v = v;
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: v });
}
},
onCompArrayColor(compIdx, key, index, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
const v = this.arrToColor(raw);
if (prop && prop.v[index] && prop.v[index].v) {
prop.v[index].v = v;
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: v });
}
},
onCompEnabled(compIdx, val) {
if (!this.inspector) {
return;
}
this.inspector.components[compIdx].enabled = val;
this.sendSet({ id: this.selectedId, comp: compIdx, key: '__enabled', value: val });
},
onCompEnum(compIdx, key, raw) {
if (!this.inspector) {
return;
}
const val = Number(raw);
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop) {
prop.v = val;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: val });
},
onCompArray(compIdx, key, index, raw, t) {
if (!this.inspector) {
return;
}
let val = raw;
if (t === 'number') {
val = this.toNum(raw);
}
else if (t === 'bool') {
val = raw === true || raw === 'true';
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop && prop.v[index]) {
prop.v[index].v = val;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: val });
},
onCompArrayVec(compIdx, key, index, axis, raw) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop && prop.v[index] && prop.v[index].v) {
prop.v[index].v[axis] = this.toNum(raw);
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: prop.v[index].v });
}
},
onCompNull(compIdx, key) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop) {
prop.v = null;
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: null });
},
/** 数组项置空(资产引用数组,如 materials)。 */
onCompArrayNull(compIdx, key, index) {
if (!this.inspector) {
return;
}
const prop = this.inspector.components[compIdx].props.find((p) => p.key === key);
if (prop && prop.v && prop.v[index]) {
prop.v[index] = { t: 'raw', v: null, editable: false };
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, index, value: null });
},
/** 材质参数写回:index 为数字时定位 sharedMaterials 数组项,undefined 用 customMaterial/material。 */
onCompMaterialProp(compIdx, key, index, propKey, value) {
var _a;
if (!this.inspector) {
return;
}
const comp = this.inspector.components[compIdx];
const prop = comp === null || comp === void 0 ? void 0 : comp.props.find((p) => p.key === key);
const holder = index === undefined ? prop : (_a = prop === null || prop === void 0 ? void 0 : prop.v) === null || _a === void 0 ? void 0 : _a[index];
if (holder && holder.v && Array.isArray(holder.v.props)) {
const mp = holder.v.props.find((x) => x.key === propKey);
if (mp) {
mp.v = value;
}
}
this.sendSet({ id: this.selectedId, comp: compIdx, key: '__material_prop', index, value: { propKey, value } });
},
/** Widget 专属:写回对齐模式/边距/目标(数值字段先转数字)。 */
onWidgetSet(compIdx, key, raw) {
if (!this.inspector) {
return;
}
const comp = this.inspector.components[compIdx];
if (!comp || !comp.widget) {
return;
}
let val = raw;
if (key === 'left' || key === 'right' || key === 'top' || key === 'bottom') {
val = this.toNum(raw);
}
else if (key === 'alignMode') {
val = Number(raw);
}
comp.widget[key] = val;
if (key === '__widget_target') {
comp.widget.targetName = val ? String(val) : '';
}
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: val });
},
/** Widget 专属:切换对齐标志(center 同时切水平+垂直居中;角键同时切两个边)。 */
onWidgetToggle(compIdx, key) {
if (!this.inspector) {
return;
}
const comp = this.inspector.components[compIdx];
if (!comp || !comp.widget) {
return;
}
const cornerMap = {
__top_left: ['isAlignTop', 'isAlignLeft'],
__top_right: ['isAlignTop', 'isAlignRight'],
__bottom_left: ['isAlignBottom', 'isAlignLeft'],
__bottom_right: ['isAlignBottom', 'isAlignRight'],
};
if (key === 'center') {
comp.widget.isAlignHorizontalCenter = !comp.widget.isAlignHorizontalCenter;
comp.widget.isAlignVerticalCenter = !comp.widget.isAlignVerticalCenter;
this.sendSet({ id: this.selectedId, comp: compIdx, key: 'isAlignHorizontalCenter', value: comp.widget.isAlignHorizontalCenter });
this.sendSet({ id: this.selectedId, comp: compIdx, key: 'isAlignVerticalCenter', value: comp.widget.isAlignVerticalCenter });
return;
}
const corner = cornerMap[key];
if (corner) {
for (const k of corner) {
comp.widget[k] = !comp.widget[k];
}
for (const k of corner) {
this.sendSet({ id: this.selectedId, comp: compIdx, key: k, value: comp.widget[k] });
}
return;
}
comp.widget[key] = !comp.widget[key];
this.sendSet({ id: this.selectedId, comp: compIdx, key, value: comp.widget[key] });
},
/** 兼容 ui-color 的不同输出格式,统一为 {r,g,b,a}(0-255)。 */
arrToColor(raw) {
if (Array.isArray(raw)) {
return {
r: this.toNum(raw[0]),
g: this.toNum(raw[1]),
b: this.toNum(raw[2]),
a: raw[3] !== undefined ? this.toNum(raw[3]) : 255,
};
}
if (raw && typeof raw === 'object' && 'r' in raw) {
return {
r: this.toNum(raw.r),
g: this.toNum(raw.g),
b: this.toNum(raw.b),
a: raw.a !== undefined ? this.toNum(raw.a) : 255,
};
}
return this.parseColor(raw);
},
/** ref 引用是否为节点引用(cc.Node);组件引用返回 false,用于区分 ui-node / ui-component 显示。 */
isNodeRef(p) {
return !p || !p.componentType || p.componentType === 'cc.Node';
},
/** 从当前 inspector 中取正在编辑字段的本地乐观值(写回后不该被回读覆盖)。 */
getLocalValue(payload) {
var _a, _b, _c, _d, _e, _f, _g, _h;
try {
if (payload.comp !== undefined) {
const comp = (_b = (_a = this.inspector) === null || _a === void 0 ? void 0 : _a.components) === null || _b === void 0 ? void 0 : _b[payload.comp];
const p = (_c = comp === null || comp === void 0 ? void 0 : comp.props) === null || _c === void 0 ? void 0 : _c.find((x) => x.key === payload.key);
const v = p && (payload.index === undefined ? p.v : (_e = (_d = p.v) === null || _d === void 0 ? void 0 : _d[payload.index]) === null || _e === void 0 ? void 0 : _e.v);
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
if (payload.field !== undefined) {
const v = (_h = (_g = (_f = this.inspector) === null || _f === void 0 ? void 0 : _f.props) === null || _g === void 0 ? void 0 : _g[payload.field]) === null || _h === void 0 ? void 0 : _h.v;
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
}
catch ( /* ignore */_j) { /* ignore */ }
return undefined;
},
/** 从回读结果中取同一字段实际值(对比诊断用)。 */
pickValue(back, payload) {
var _a, _b, _c, _d, _e, _f;
try {
if (payload.comp !== undefined) {
const comp = (_a = back.components) === null || _a === void 0 ? void 0 : _a[payload.comp];
const p = (_b = comp === null || comp === void 0 ? void 0 : comp.props) === null || _b === void 0 ? void 0 : _b.find((x) => x.key === payload.key);
const v = p && (payload.index === undefined ? p.v : (_d = (_c = p.v) === null || _c === void 0 ? void 0 : _c[payload.index]) === null || _d === void 0 ? void 0 : _d.v);
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
if (payload.field !== undefined) {
const v = (_f = (_e = back.props) === null || _e === void 0 ? void 0 : _e[payload.field]) === null || _f === void 0 ? void 0 : _f.v;
return v === undefined ? undefined : JSON.parse(JSON.stringify(v));
}
}
catch ( /* ignore */_g) { /* ignore */ }
return undefined;
},
/** 把 UI 中正在编辑的字段恢复成本地乐观值(回读请求不改写编辑框)。 */
applyLocalValue(insp, payload, val) {
var _a, _b, _c, _d;
if (val === undefined) {
return;
}
try {
if (payload.comp !== undefined) {
const comp = (_a = insp.components) === null || _a === void 0 ? void 0 : _a[payload.comp];
const p = (_b = comp === null || comp === void 0 ? void 0 : comp.props) === null || _b === void 0 ? void 0 : _b.find((x) => x.key === payload.key);
if (p) {
if (payload.index === undefined) {
p.v = val;
}
else if ((_c = p.v) === null || _c === void 0 ? void 0 : _c[payload.index]) {
p.v[payload.index].v = val;
}
}
}
else if (payload.field !== undefined && ((_d = insp.props) === null || _d === void 0 ? void 0 : _d[payload.field])) {
insp.props[payload.field].v = val;
}
}
catch ( /* ignore */_e) { /* ignore */ }
},
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc291cmNlL3BhbmVscy9kZWZhdWx0L21ldGhvZHMvaW5zcGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsYUFBYTtBQUNiLDRFQUFtRDtBQUVuRCwwQkFBMEI7QUFDMUIsa0JBQWU7SUFDWCxLQUFLLENBQUMsYUFBYTtRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQ3BDLHNCQUFXLENBQUMsSUFBVyxFQUN2QixlQUFzQixFQUN0QixFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFTLENBQ25GLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM3RixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pELENBQUM7Z0JBQVMsQ0FBQztZQUNQLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFL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