Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions packages/webgal/src/Core/util/syncWithEditor/webSocketFunc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import { nextSentence } from '@/Core/controller/gamePlay/nextSentence';
import { resetStage } from '@/Core/controller/stage/resetStage';
import { logger } from '@/Core/util/logger';
import { syncWithOrigine } from './syncWithOrigine';
import { stageActions } from '@/store/stageReducer';
import { baseTransform, IEffect } from '@/store/stageInterface';

export const webSocketFunc = () => {
const loc: string = window.location.hostname;
Expand Down Expand Up @@ -101,6 +103,29 @@ export const webSocketFunc = () => {
const command = message.message;
webgalStore.dispatch(setFontOptimization(command === 'true'));
}
if (message.command === DebugCommand.SET_EFFECT) {
try {
const effect = JSON.parse(message.message) as IEffect;
const targetEffect = webgalStore.getState().stage.effects.find((e) => e.target === effect.target);
const targetTransform = targetEffect?.transform ? targetEffect.transform : baseTransform;
const newTransform = {
...targetTransform,
...(effect.transform ?? {}),
position: {
...targetTransform.position,
...(effect.transform?.position ?? {}),
},
scale: {
...targetTransform.scale,
...(effect.transform?.scale ?? {}),
},
};
webgalStore.dispatch(stageActions.updateEffect({ target: effect.target, transform: newTransform }));
Comment on lines +108 to +123

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

这部分代码有两点可以改进,以提高代码的健壮性和可读性:

  1. 增加数据校验JSON.parse(message.message) as IEffect 是一个类型断言,它假设了 message.message 的内容总是符合 IEffect 接口。如果收到的 JSON 字符串虽然合法但缺少 target 属性,后续代码(如 effect.target)可能会因为 undefined而出错。建议在解析后增加一个简单的校验,确保 effect 对象和它的 target 属性存在且类型正确。

  2. 优化变换合并逻辑:当前合并 transform 的方式有些冗余。...(effect.transform ?? {}) 会展开 positionscale 属性,但它们随后又被显式地重写了。我们可以使用对象解构来分离出嵌套的 positionscale 对象,使代码更简洁,意图也更清晰。

我已经将这两点改进合并到了下面的代码建议中。

        const parsedEffect = JSON.parse(message.message);
        if (!parsedEffect || typeof parsedEffect.target !== 'string') {
          logger.error(`Invalid effect object received: ${message.message}`);
          return;
        }
        const effect = parsedEffect as IEffect;

        const targetEffect = webgalStore.getState().stage.effects.find((e) => e.target === effect.target);
        const targetTransform = targetEffect?.transform ?? baseTransform;

        const { position: newPosition, scale: newScale, ...restOfTransform } = effect.transform ?? {};
        const newTransform = {
          ...targetTransform,
          ...restOfTransform,
          position: {
            ...targetTransform.position,
            ...newPosition,
          },
          scale: {
            ...targetTransform.scale,
            ...newScale,
          },
        };
        webgalStore.dispatch(stageActions.updateEffect({ target: effect.target, transform: newTransform }));

} catch (e) {
logger.error(`无法设置效果 ${message.message}, ${e}`);
return;
}
}
};
socket.onerror = () => {
logger.info('当前没有连接到 Terre 编辑器');
Expand Down
2 changes: 2 additions & 0 deletions packages/webgal/src/types/debugProtocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ export enum DebugCommand {
TEMP_SCENE,
// 字体优化
FONT_OPTIMIZATION,
// 直接设置效果
SET_EFFECT,
}

export interface IDebugMessage {
Expand Down