fix(editor): 修复右键菜单和粒子编辑器问题 (#286)

- 修复右键菜单被状态栏遮挡的问题
- 修复右键菜单边界检测,考虑标题栏和状态栏高度
- 调整右键菜单结构:新建文件夹 → 资源类型 → 工具操作
- 修复 Particle 插件默认未启用的问题(defaultEnabled 的新插件不被旧配置禁用)
- 修复 SizeOverLifetime 模块在预览中无效果的问题
- 移除 MaterialEditorModule 中的重复模板注册
This commit is contained in:
YHH
2025-12-06 11:56:25 +08:00
committed by GitHub
parent 397f79caa5
commit 3cbfa1e4cb
6 changed files with 153 additions and 53 deletions

View File

@@ -140,6 +140,28 @@ function evaluateScaleCurve(t: number, curveType: string): number {
}
}
/** 评估缩放关键帧 | Evaluate scale keys */
function evaluateScaleKeys(keys: ScaleKey[], normalizedAge: number): number {
if (keys.length === 0) return 1;
if (keys.length === 1) return keys[0].scale;
// 找到当前时间所在的两个关键帧
let startKey = keys[0];
let endKey = keys[keys.length - 1];
for (let i = 0; i < keys.length - 1; i++) {
if (normalizedAge >= keys[i].time && normalizedAge <= keys[i + 1].time) {
startKey = keys[i];
endKey = keys[i + 1];
break;
}
}
const range = endKey.time - startKey.time;
const t = range > 0 ? (normalizedAge - startKey.time) / range : 0;
return lerp(startKey.scale, endKey.scale, t);
}
/** 评估颜色渐变 | Evaluate color gradient */
function evaluateColorGradient(gradient: ColorKey[], normalizedAge: number): ColorKey {
if (gradient.length === 0) {
@@ -235,11 +257,10 @@ function useParticlePreview(
];
// 缩放曲线 | Scale curve
const scaleCurveType: string = sizeModule?.enabled && sizeModule.params?.curveType
? sizeModule.params.curveType as string
: 'linear';
const scaleStartMultiplier: number = (sizeModule?.params?.startMultiplier as number) ?? 1;
const scaleEndMultiplier: number = (sizeModule?.params?.endMultiplier as number) ?? data.endScale;
const sizeEnabled = sizeModule?.enabled ?? false;
const scaleKeys: ScaleKey[] = sizeModule?.params?.keys
? sizeModule.params.keys as ScaleKey[]
: [{ time: 0, scale: 1 }, { time: 1, scale: data.endScale }];
// 噪声参数 | Noise parameters
const noiseEnabled = noiseModule?.enabled ?? false;
@@ -532,10 +553,11 @@ function useParticlePreview(
p.alpha = p.startAlpha * color.a;
// 缩放曲线 | Scale curve
const scaleT = evaluateScaleCurve(normalizedAge, scaleCurveType);
const scaleMult = lerp(scaleStartMultiplier, scaleEndMultiplier, scaleT);
p.scaleX = p.startScaleX * scaleMult;
p.scaleY = p.startScaleY * scaleMult;
if (sizeEnabled) {
const scaleMult = evaluateScaleKeys(scaleKeys, normalizedAge);
p.scaleX = p.startScaleX * scaleMult;
p.scaleY = p.startScaleY * scaleMult;
}
// 噪声模块 | Noise module
if (noiseEnabled) {