import { _decorator, Component, Sprite, UITransform, Size, isValid, Node, } from "cc"; const { ccclass } = _decorator; /** * 父物体自适应调整组件 * 功能:使精灵保持原始宽高比并覆盖整个父物体区域 * 触发时机:GameObject 激活时、父物体尺寸变化时 */ @ccclass("ParentResize") export class ParentResize extends Component { private sprite: Sprite = null; private uiTransform: UITransform = null; private parentTransform: UITransform = null; private lastParentSize: Size = new Size(); onLoad() { // 获取必要组件 this.sprite = this.getComponent(Sprite); this.uiTransform = this.getComponent(UITransform); if (!this.sprite) { console.warn("ParentResize: 未找到 Sprite 组件"); return; } if (!this.uiTransform) { console.warn("ParentResize: 未找到 UITransform 组件"); return; } // 获取父物体的 UITransform if (this.node.parent) { this.parentTransform = this.node.parent.getComponent(UITransform); if (!this.parentTransform) { console.warn("ParentResize: 父物体未找到 UITransform 组件"); return; } } else { console.warn("ParentResize: 未找到父物体"); return; } } onEnable() { // 激活时立即调整尺寸 this.adjustToParent(); } /** * 调整精灵尺寸以覆盖整个父物体区域 * 保持原始宽高比,使用 cover 策略 */ private adjustToParent() { if ( !isValid(this.sprite) || !isValid(this.uiTransform) || !isValid(this.parentTransform) ) { return; } const spriteFrame = this.sprite.spriteFrame; if (!spriteFrame) { return; } // 获取父物体尺寸 const parentSize = this.parentTransform.contentSize; // 获取精灵原始尺寸 const originalSize = spriteFrame.originalSize; if (!originalSize || originalSize.width <= 0 || originalSize.height <= 0) { return; } // 如果父物体尺寸无效,则不进行调整 if (parentSize.width <= 0 || parentSize.height <= 0) { return; } // 计算缩放比例(使用较大值以确保覆盖整个父物体区域) const scaleX = parentSize.width / originalSize.width; const scaleY = parentSize.height / originalSize.height; const scale = Math.max(scaleX, scaleY); // 计算新的尺寸 const newWidth = originalSize.width * scale; const newHeight = originalSize.height * scale; // 应用新尺寸 this.uiTransform.setContentSize(newWidth, newHeight); } /** * 手动触发尺寸调整 * 可在外部调用,例如当 SpriteFrame 改变时或父物体尺寸手动改变时 */ public forceResize() { this.adjustToParent(); } /** * 设置新的父物体 * 当需要动态改变参考父物体时调用 */ public setParent(parentNode: Node) { if (parentNode) { this.parentTransform = parentNode.getComponent(UITransform); if (this.parentTransform) { this.lastParentSize.set(0, 0); // 重置上次记录的尺寸 this.adjustToParent(); } else { console.warn("ParentResize: 新父物体未找到 UITransform 组件"); } } } }