From 5714ae08bbdbfcb44029be223c44186057573f9c Mon Sep 17 00:00:00 2001 From: xlj <543978819@qq.com> Date: Wed, 15 Oct 2025 18:55:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=8A=E5=A4=A9=E8=AE=B0=E5=BD=95=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/Scripts/chat18x/core/ChatController.ts | 40 ++++-- assets/Scripts/chat18x/data/DialogData.ts | 50 +++++-- .../Scripts/chat18x/manager/DialogManager.ts | 51 +++++-- .../ui/components/ChatContentsLayout.ts | 86 ++++++++--- assets/Scripts/chat18x/ui/panels/ChatPanel.ts | 27 ++++ assets/Scripts/chat18x/ui/panels/ShowPanel.ts | 2 +- assets/bundles/Chat18x/ChatPanel.prefab | 32 +++-- .../bundles/Chat18x/PastGirlListPanel.prefab | 134 +++++++++--------- 8 files changed, 285 insertions(+), 137 deletions(-) diff --git a/assets/Scripts/chat18x/core/ChatController.ts b/assets/Scripts/chat18x/core/ChatController.ts index 33eccd0f..a79110d5 100644 --- a/assets/Scripts/chat18x/core/ChatController.ts +++ b/assets/Scripts/chat18x/core/ChatController.ts @@ -138,11 +138,11 @@ export class ChatController { if (roleId && roleId > 0) { ChatAIService.Instance.setCurrentRole(roleId); - // 从ChatHistoryManager加载对话记录到ChatModel中 - this.loadDialogsFromHistory(roleId); + // 从ChatHistoryManager加载最近10条对话记录到ChatModel中 + this.loadDialogsFromHistory(roleId, 10); - // 同步到DialogManager - //this.syncDialogData(); + // 同步对话数据到DialogManager和UI + this.syncDialogData(); logger.log(`ChatController initialized with role ${roleId}`); } else { @@ -165,15 +165,15 @@ export class ChatController { return false; } - + // 更新AI服务的当前角色 ChatAIService.Instance.setCurrentRole(roleId); - // 从ChatHistoryManager加载对话记录到ChatModel中 - this.loadDialogsFromHistory(roleId); + // 从ChatHistoryManager加载最近10条对话记录到ChatModel中 + this.loadDialogsFromHistory(roleId, 10); - // 同步对话数据到DialogManager - //this.syncDialogData(); + // 同步对话数据到DialogManager和UI + this.syncDialogData(); logger.log(`ChatController switched to role ${roleId}`); return true; @@ -371,8 +371,9 @@ export class ChatController { /** * 从ChatHistoryManager加载对话记录到ChatModel中 * @param roleId 角色ID,不传则使用当前角色 + * @param limit 加载消息数量限制,默认10条(0表示加载全部) */ - public loadDialogsFromHistory(roleId?: number): void { + public loadDialogsFromHistory(roleId?: number, limit: number = 10): void { const targetRoleId = roleId || this.chatModel.getCurrentRoleId(); if (!targetRoleId) { logger.warn("Cannot load dialogs: no active role"); @@ -380,7 +381,15 @@ export class ChatController { } // 从ChatHistoryManager加载聊天记录 - const chatHistory = ChatHistoryManager.Instance.loadHistory(targetRoleId); + let chatHistory = ChatHistoryManager.Instance.loadHistory(targetRoleId); + + // 如果设置了限制,只取最近的N条消息 + if (limit > 0 && chatHistory.length > limit) { + chatHistory = chatHistory.slice(-limit); + logger.log( + `Limited chat history to recent ${limit} messages for role ${targetRoleId}` + ); + } // 清空ChatModel中的对话记录 this.chatModel.clearDialogs(targetRoleId); @@ -398,8 +407,8 @@ export class ChatController { } /** - * 同步ChatModel的对话数据到DialogManager - * 用于确保DialogManager和ChatModel的数据一致性 + * 同步ChatModel的对话数据到DialogManager和UI + * 用于确保DialogManager和ChatModel的数据一致性,并更新UI显示 */ public syncDialogData(): void { if (!this.dialogManager || !this.chatModel.validate()) { @@ -410,7 +419,10 @@ export class ChatController { } const dialogs = this.chatModel.getDialogs(); - this.dialogManager.syncFromChatModel(dialogs); + + // 使用loadHistoryDialogs方法加载历史对话到DialogManager + this.dialogManager.loadHistoryDialogs(dialogs); + logger.log( `Synced ${dialogs.length} dialogs from ChatModel to DialogManager` ); diff --git a/assets/Scripts/chat18x/data/DialogData.ts b/assets/Scripts/chat18x/data/DialogData.ts index dd6f5f48..6937b5c2 100644 --- a/assets/Scripts/chat18x/data/DialogData.ts +++ b/assets/Scripts/chat18x/data/DialogData.ts @@ -4,12 +4,11 @@ export interface Dialog { } export class DiaLogData { - public playerDialog: Dialog = null; - public aiDialogs: Dialog[] = []; + // 统一的对话数组,保存所有历史对话 + private dialogs: Dialog[] = []; public cleanDialog() { - this.playerDialog = null; - this.aiDialogs = []; + this.dialogs = []; } public pushDialog( @@ -17,17 +16,42 @@ export class DiaLogData { str: string, isLoading: boolean = false ) { - if (isPlayer) { - this.playerDialog = { isPlayer: true, content: str }; - } else { - this.aiDialogs.push({ isPlayer: false, content: str }); - } + // 追加新对话到数组末尾 + this.dialogs.push({ isPlayer, content: str }); } - public GetPlayerDialog() { - return this.playerDialog; + /** + * 获取最后一条玩家对话(兼容旧接口) + */ + public GetPlayerDialog(): Dialog | null { + // 从后往前查找最后一条玩家消息 + for (let i = this.dialogs.length - 1; i >= 0; i--) { + if (this.dialogs[i].isPlayer) { + return this.dialogs[i]; + } + } + return null; } - public GetAIDialog() { - return this.aiDialogs; + + /** + * 获取所有AI对话(兼容旧接口) + */ + public GetAIDialog(): Dialog[] { + // 返回所有AI消息 + return this.dialogs.filter(dialog => !dialog.isPlayer); + } + + /** + * 获取所有对话记录 + */ + public getAllDialogs(): Dialog[] { + return [...this.dialogs]; + } + + /** + * 批量设置对话记录(用于加载历史) + */ + public setDialogs(dialogs: Dialog[]): void { + this.dialogs = [...dialogs]; } } diff --git a/assets/Scripts/chat18x/manager/DialogManager.ts b/assets/Scripts/chat18x/manager/DialogManager.ts index ef009a74..d21811c5 100644 --- a/assets/Scripts/chat18x/manager/DialogManager.ts +++ b/assets/Scripts/chat18x/manager/DialogManager.ts @@ -44,16 +44,14 @@ export class DialogManager { * * @param {boolean} isPlayer - 是否为玩家消息 * @param {string} str - 消息内容 - * @param {boolean} fromPlayer - 是否来自玩家输入(用于清理对话) + * @param {boolean} fromPlayer - 是否来自玩家输入(已废弃,保留参数兼容性) */ public updateDialog( isPlayer: boolean, str: string, fromPlayer: boolean = false ): void { - if (fromPlayer) { - this.dialogData.cleanDialog(); - } + // 移除清空逻辑,改为追加模式以支持历史记录显示 this.dialogData.pushDialog(isPlayer, str); } @@ -62,16 +60,14 @@ export class DialogManager { * * @param {boolean} isPlayer - 是否为玩家消息 * @param {string} str - 消息内容 - * @param {boolean} fromPlayer - 是否来自玩家输入(用于清理对话) + * @param {boolean} fromPlayer - 是否来自玩家输入(已废弃,保留参数兼容性) */ public updateDialogWithSegments( isPlayer: boolean, str: string, fromPlayer: boolean = false ): void { - if (fromPlayer) { - this.dialogData.cleanDialog(); - } + // 移除清空逻辑,改为追加模式以支持历史记录显示 // 如果是玩家消息,直接添加单个气泡 if (isPlayer) { @@ -182,4 +178,43 @@ export class DialogManager { logger.log("DialogManager: Synced dialogs from ChatModel"); } + /** + * 加载历史对话记录(用于初始化显示) + * @param dialogs 历史对话数组 + */ + public loadHistoryDialogs(dialogs: Dialog[]): void { + // 清空当前对话 + this.dialogData.cleanDialog(); + + // 遍历历史对话,对AI消息进行分段处理 + let totalSegments = 0; + dialogs.forEach((dialog) => { + if (dialog.isPlayer) { + // 玩家消息直接添加 + this.dialogData.pushDialog(dialog.isPlayer, dialog.content); + totalSegments++; + } else { + // AI消息进行分段处理 + const segments = this.splitMessageIntoSegments(dialog.content); + if (segments.length <= 1) { + // 单段消息直接添加 + this.dialogData.pushDialog(dialog.isPlayer, dialog.content); + totalSegments++; + } else { + // 多段消息,每段作为独立气泡 + segments.forEach((segment) => { + this.dialogData.pushDialog(dialog.isPlayer, segment); + totalSegments++; + }); + } + } + }); + + logger.log( + `DialogManager: Loaded ${dialogs.length} history dialogs (expanded to ${totalSegments} segments)` + ); + // 通知UI更新 + Utils.sendInnerMsg(InnerMsgCode.Chat_DialogRefresh); + } + } diff --git a/assets/Scripts/chat18x/ui/components/ChatContentsLayout.ts b/assets/Scripts/chat18x/ui/components/ChatContentsLayout.ts index 17ec20cc..eaa60662 100644 --- a/assets/Scripts/chat18x/ui/components/ChatContentsLayout.ts +++ b/assets/Scripts/chat18x/ui/components/ChatContentsLayout.ts @@ -43,13 +43,16 @@ export class ChatContentsLayout extends Component { private isPressing: boolean = false; // 长按计时器 private longPressTimer: number = null; + // 已显示的AI对话数量(用于避免重复显示) + private displayedAIDialogCount: number = 0; fixMaxWidth: number; protected start(): void { this.lBubble.node.active = false; this.rBubble.node.active = false; - this.fixMaxWidth = 534.4; + // 设置气泡最大宽度为屏幕宽度的70% + this.fixMaxWidth = view.getVisibleSize().width * 0.7; // 获取或添加UIOpacity组件到content节点 this.contentOpacity = @@ -77,37 +80,44 @@ export class ChatContentsLayout extends Component { } /** - * 更新玩家输入的对话 + * 更新玩家输入的对话(追加模式,不清空历史) * @param dialog 玩家输入的对话数据 */ updatePlayerDialog(dialog: Dialog): void { - // 清理所有现有气泡到缓存池 - this.clearAllBubbles(); + if (!dialog) return; - // 清理所有延时任务 - this.clearDelayedTasks(); + // 不再清空气泡,改为追加模式以支持历史记录 - // 创建玩家气泡(插入到首位,Layout会让它显示在最下面) + // 创建玩家气泡 const playerBubble = this.createOrGetBubble(true); playerBubble.node.active = true; playerBubble.updateBubbleContent(dialog.content, true); this.bubbles.push(playerBubble); + + // 滚动到底部 + this.scheduleOnce(() => { + this.scrollView.scrollToBottom(); + }, 0); } /** - * 更新AI回复的对话 + * 更新AI回复的对话(智能追加,避免重复显示) * @param dialogs AI回复的对话数据数组 */ updateAIDialogs(dialogs: Dialog[]): void { - // 清除等待回复气泡 - // if (this.waitingBubble) { - // this.removeWaitingBubble(); - // } + if (!dialogs || dialogs.length === 0) return; // 清理之前的延时任务 this.clearDelayedTasks(); - // 逐个添加AI对话,带延时 - this.addAIDialogsWithDelay(dialogs, 0); + // 只添加新的AI对话(避免重复显示历史记录) + const newDialogs = dialogs.slice(this.displayedAIDialogCount); + if (newDialogs.length > 0) { + // 更新已显示数量 + this.displayedAIDialogCount = dialogs.length; + + // 逐个添加新的AI对话,带延时 + this.addAIDialogsWithDelay(newDialogs, 0); + } this.node.position = Vec3.ZERO; // 滚动到底部(等待下一帧Layout更新完成) @@ -117,9 +127,9 @@ export class ChatContentsLayout extends Component { } /** - * 清理所有气泡到缓存池 + * 清理所有气泡到缓存池(改为public,供外部调用) */ - private clearAllBubbles(): void { + public clearAllBubbles(): void { for (const bubble of this.bubbles) { if (bubble && bubble.node) { bubble.node.active = false; @@ -129,10 +139,48 @@ export class ChatContentsLayout extends Component { this.bubbles = []; //this.waitingBubble = null; + // 重置AI对话计数器 + this.displayedAIDialogCount = 0; + // 清理多余的缓存气泡 this.cleanupExcessCachedBubbles(); } + /** + * 加载所有历史对话(用于初始化) + * @param dialogs 所有对话记录 + */ + public loadAllDialogs(dialogs: Dialog[]): void { + if (!dialogs || dialogs.length === 0) return; + + // 清空现有气泡 + this.clearAllBubbles(); + this.clearDelayedTasks(); + + // 倒序遍历对话,从最后一个开始插入(保持正确的显示顺序) + for (let i = dialogs.length - 1; i >= 0; i--) { + const dialog = dialogs[i]; + const bubble = this.createOrGetBubble(dialog.isPlayer); + bubble.node.active = true; + bubble.updateBubbleContent(dialog.content, dialog.isPlayer); + // 每个气泡插入到首位,确保旧消息在上面,新消息在下面 + bubble.node.setSiblingIndex(0); + this.bubbles.push(bubble); + + // 统计AI对话数量 + if (!dialog.isPlayer) { + this.displayedAIDialogCount++; + } + } + + // 滚动到底部 + this.scheduleOnce(() => { + this.scrollView.scrollToBottom(); + }, 0.1); + + console.log(`ChatContentsLayout: Loaded ${dialogs.length} history dialogs`); + } + /** * 从缓存池获取或创建新的气泡 * @param isPlayer 是否为玩家气泡 @@ -198,12 +246,12 @@ export class ChatContentsLayout extends Component { const aiBubble = this.createOrGetBubble(false); aiBubble.node.active = true; aiBubble.updateBubbleContent(dialog.content, false); - // AI消息插入到首位,显示在最上面 - aiBubble.node.setSiblingIndex(0); + // AI消息自然追加到末尾,显示在最下面(与玩家消息保持一致) + this.bubbles.push(aiBubble); + this.scheduleOnce(() => { this.scrollView.scrollToBottom(); }, 0); - this.bubbles.push(aiBubble); // 递归处理下一条对话 this.addAIDialogsWithDelay(dialogs, index + 1); diff --git a/assets/Scripts/chat18x/ui/panels/ChatPanel.ts b/assets/Scripts/chat18x/ui/panels/ChatPanel.ts index 4fd657c3..f6895a08 100644 --- a/assets/Scripts/chat18x/ui/panels/ChatPanel.ts +++ b/assets/Scripts/chat18x/ui/panels/ChatPanel.ts @@ -129,6 +129,12 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback { this, this.onChatCountChange ); + + Utils.addInnerEL( + InnerMsgCode.Chat_DialogRefresh, + this, + this.onDialogRefresh + ); } onDestroy(): void { @@ -147,6 +153,11 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback { this, this.onEmotionInitialized ); + Utils.removeInnerEL( + InnerMsgCode.Chat_DialogRefresh, + this, + this.onDialogRefresh + ); // 停止视频播放,释放资源 if (this.videoLayer) { @@ -402,6 +413,22 @@ export class ChatPanel extends li_BaseView implements IChatPanelCallback { } } } + + /** + * 对话刷新事件处理(用于加载历史记录) + */ + private onDialogRefresh = (): void => { + if (!this.layout) return; + + // 获取所有对话记录 + const dialogManager = DialogManager.getInstance(); + const allDialogs = dialogManager["dialogData"].getAllDialogs(); + + logger.log(`ChatPanel: Loading ${allDialogs.length} history dialogs to UI`); + + // 加载所有对话到UI + this.layout.loadAllDialogs(allDialogs); + }; protected onEnable(): void { if (!this.manager) this.manager = DialogManager.getInstance(); diff --git a/assets/Scripts/chat18x/ui/panels/ShowPanel.ts b/assets/Scripts/chat18x/ui/panels/ShowPanel.ts index 4ef8c80b..7db23978 100644 --- a/assets/Scripts/chat18x/ui/panels/ShowPanel.ts +++ b/assets/Scripts/chat18x/ui/panels/ShowPanel.ts @@ -98,7 +98,7 @@ export class ShowPanel extends li_BaseView { // 阻止事件冒泡 event.propagationStopped = true; // 阻止浏览器默认行为(如拖动、滚动) - event.preventDefault(); + //event.preventDefault(); } protected onClose() { diff --git a/assets/bundles/Chat18x/ChatPanel.prefab b/assets/bundles/Chat18x/ChatPanel.prefab index a1510619..6d1be7df 100644 --- a/assets/bundles/Chat18x/ChatPanel.prefab +++ b/assets/bundles/Chat18x/ChatPanel.prefab @@ -1336,8 +1336,8 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 13.099999999999966, - "y": -158.57699999999997, + "x": 0, + "y": -158.577, "z": 0 }, "_lrot": { @@ -1386,7 +1386,7 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -28.972000000000037, + "x": -42.072, "y": -303.6575, "z": 0 }, @@ -1620,7 +1620,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 1080, + "width": 697.6, "height": 45 }, "_anchorPoint": { @@ -1660,7 +1660,7 @@ "_paddingBottom": 30, "_spacingX": 0, "_spacingY": 15, - "_verticalDirection": 0, + "_verticalDirection": 1, "_horizontalDirection": 0, "_constraint": 0, "_constraintNum": 2, @@ -1759,8 +1759,8 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": -81.42899999999997, - "y": -303.626, + "x": -257.913, + "y": -345.697, "z": 0 }, "_lrot": { @@ -2548,8 +2548,8 @@ }, "_alignFlags": 40, "_target": null, - "_left": 293.571, - "_right": 259.16599999999994, + "_left": 117.08700000000002, + "_right": 435.65, "_top": 0, "_bottom": 0, "_horizontalCenter": 0, @@ -2649,8 +2649,8 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 69.286, - "y": -33.625999999999976, + "x": 248.123, + "y": -470.697, "z": 0 }, "_lrot": { @@ -3617,7 +3617,7 @@ "_alignFlags": 32, "_target": null, "_left": 0, - "_right": 305.714, + "_right": 126.87700000000001, "_top": 0, "_bottom": 0, "_horizontalCenter": 0, @@ -3732,7 +3732,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 723.8, + "width": 697.6, "height": 684.24 }, "_anchorPoint": { @@ -3877,7 +3877,7 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 723.8, + "width": 697.6, "height": 684.24 }, "_anchorPoint": { @@ -3948,7 +3948,7 @@ "_alignFlags": 45, "_target": null, "_left": 26.2, - "_right": 0, + "_right": 26.2, "_top": 0.38528562499999996, "_bottom": 299.303, "_horizontalCenter": 0, @@ -3978,6 +3978,8 @@ "__id__": 0 }, "fileId": "41O8NIf/BNzbi1iBa0OJzt", + "instance": null, + "targetOverrides": null, "nestedPrefabInstanceRoots": null }, { diff --git a/assets/bundles/Chat18x/PastGirlListPanel.prefab b/assets/bundles/Chat18x/PastGirlListPanel.prefab index e7f8b14b..e1e0683d 100644 --- a/assets/bundles/Chat18x/PastGirlListPanel.prefab +++ b/assets/bundles/Chat18x/PastGirlListPanel.prefab @@ -2522,7 +2522,7 @@ }, { "__type__": "cc.Node", - "_name": "chatBtn", + "_name": "detailBtn", "_objFlags": 0, "__editorExtras__": {}, "_parent": { @@ -2546,8 +2546,8 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 240.08799999999997, - "y": -2.285999999999831, + "x": 0, + "y": 0, "z": 0 }, "_lrot": { @@ -2587,8 +2587,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 100, - "height": 100 + "width": 690, + "height": 180 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -2599,10 +2599,10 @@ }, { "__type__": "cc.CompPrefabInfo", - "fileId": "4cMlYtnbBO064yZXRA1GwL" + "fileId": "85MUsweIVK5L3FFtT0TEZ1" }, { - "__type__": "cc.Sprite", + "__type__": "cc.Widget", "_name": "", "_objFlags": 0, "__editorExtras__": {}, @@ -2613,38 +2613,29 @@ "__prefab": { "__id__": 105 }, - "_customMaterial": null, - "_srcBlendFactor": 2, - "_dstBlendFactor": 4, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_spriteFrame": { - "__uuid__": "1b0f18ce-5d14-4a6d-861e-d640f173e9fb@f9941", - "__expectedType__": "cc.SpriteFrame" - }, - "_type": 0, - "_fillType": 0, - "_sizeMode": 1, - "_fillCenter": { - "__type__": "cc.Vec2", - "x": 0, - "y": 0 - }, - "_fillStart": 0, - "_fillRange": 0, - "_isTrimmedMode": true, - "_useGrayscale": false, - "_atlas": null, + "_alignFlags": 45, + "_target": null, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_horizontalCenter": 0, + "_verticalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 100, + "_originalHeight": 100, + "_alignMode": 2, + "_lockFlags": 0, "_id": "" }, { "__type__": "cc.CompPrefabInfo", - "fileId": "15bvwd0d5HmalSCKDMfaNx" + "fileId": "535aLc925HuqW9jtjkssz2" }, { "__type__": "cc.Button", @@ -2700,7 +2691,7 @@ }, { "__type__": "cc.CompPrefabInfo", - "fileId": "06nslvNYNH65cg9n7c0mLT" + "fileId": "f0kGWHBNdKv4Bh/VqTRN1V" }, { "__type__": "cc.PrefabInfo", @@ -2710,14 +2701,14 @@ "asset": { "__id__": 0 }, - "fileId": "39vAqfB6tIHqiwsIvtkXGg", + "fileId": "c3K4m/IMJG94t8ShUriO9C", "instance": null, "targetOverrides": null, "nestedPrefabInstanceRoots": null }, { "__type__": "cc.Node", - "_name": "detailBtn", + "_name": "chatBtn", "_objFlags": 0, "__editorExtras__": {}, "_parent": { @@ -2741,8 +2732,8 @@ }, "_lpos": { "__type__": "cc.Vec3", - "x": 0, - "y": 0, + "x": 240.08799999999997, + "y": -2.285999999999831, "z": 0 }, "_lrot": { @@ -2782,8 +2773,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 690, - "height": 180 + "width": 100, + "height": 100 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -2794,10 +2785,10 @@ }, { "__type__": "cc.CompPrefabInfo", - "fileId": "85MUsweIVK5L3FFtT0TEZ1" + "fileId": "4cMlYtnbBO064yZXRA1GwL" }, { - "__type__": "cc.Widget", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "__editorExtras__": {}, @@ -2808,29 +2799,38 @@ "__prefab": { "__id__": 113 }, - "_alignFlags": 45, - "_target": null, - "_left": 0, - "_right": 0, - "_top": 0, - "_bottom": 0, - "_horizontalCenter": 0, - "_verticalCenter": 0, - "_isAbsLeft": true, - "_isAbsRight": true, - "_isAbsTop": true, - "_isAbsBottom": true, - "_isAbsHorizontalCenter": true, - "_isAbsVerticalCenter": true, - "_originalWidth": 100, - "_originalHeight": 100, - "_alignMode": 2, - "_lockFlags": 0, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_spriteFrame": { + "__uuid__": "1b0f18ce-5d14-4a6d-861e-d640f173e9fb@f9941", + "__expectedType__": "cc.SpriteFrame" + }, + "_type": 0, + "_fillType": 0, + "_sizeMode": 1, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_useGrayscale": false, + "_atlas": null, "_id": "" }, { "__type__": "cc.CompPrefabInfo", - "fileId": "535aLc925HuqW9jtjkssz2" + "fileId": "15bvwd0d5HmalSCKDMfaNx" }, { "__type__": "cc.Button", @@ -2886,7 +2886,7 @@ }, { "__type__": "cc.CompPrefabInfo", - "fileId": "f0kGWHBNdKv4Bh/VqTRN1V" + "fileId": "06nslvNYNH65cg9n7c0mLT" }, { "__type__": "cc.PrefabInfo", @@ -2896,7 +2896,7 @@ "asset": { "__id__": 0 }, - "fileId": "c3K4m/IMJG94t8ShUriO9C", + "fileId": "39vAqfB6tIHqiwsIvtkXGg", "instance": null, "targetOverrides": null, "nestedPrefabInstanceRoots": null @@ -3157,10 +3157,10 @@ "__id__": 65 }, "chatBtn": { - "__id__": 101 + "__id__": 109 }, "detailBtn": { - "__id__": 109 + "__id__": 101 }, "_id": "" },