import { _decorator, Component, Label, Node, Size, UITransform } from "cc"; import Tools from "../../utils/tools"; const { ccclass, property } = _decorator; @ccclass("DialogBubble") export class DialogBubble extends Component { @property(UITransform) bg: UITransform = null; @property(Label) content: Label = null; @property(UITransform) contentT: UITransform = null; updateBubbleContent(str: string, callback?: (actualHeight: number) => void) { // 设置文本内容 this.content.string = str; // 计算最大宽度(估算) const lines = str.split("\n"); let maxWidth = 0; for (const line of lines) { let lineWidth = 0; if (Tools.IsChinese(line)) { lineWidth = 35 * line.length; } else { lineWidth = 21 * line.length; } maxWidth = Math.max(maxWidth, lineWidth); } // 限制最大宽度 const contentWidth = Math.min(maxWidth, 950); // 设置内容区域宽度,让Label自动计算高度 this.contentT.setContentSize(new Size(contentWidth, 0)); this.bg.setContentSize(new Size(contentWidth + 20, 0)); // 强制更新Label的渲染数据以获取正确的高度 this.content.updateRenderData(true); // 等待一帧后获取Label的实际高度 this.scheduleOnce(() => { const actualHeight = this.content.node.getComponent(UITransform).contentSize.height; // 更新内容区域的实际大小 this.contentT.setContentSize(new Size(contentWidth, actualHeight)); // 根据内容大小调整背景大小,添加适当的内边距 const bgHeight = actualHeight + 20; this.bg.setContentSize(new Size(contentWidth + 50, bgHeight)); // 回调通知实际高度 if (callback) { callback(bgHeight); } }, 0); // 返回预估的背景高度(用于同步计算) const estimatedHeight = Math.max(lines.length * 35 + 20, 60); // 最小高度60 return estimatedHeight; } }