ResSprite.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { _decorator, Component, Sprite, SpriteAtlas, SpriteFrame } from "cc";
  2. import Res from "./Res";
  3. const { ccclass, menu, disallowMultiple, requireComponent } = _decorator;
  4. /**
  5. * 精灵组件,自动管理资源的引用计数
  6. */
  7. @ccclass
  8. @disallowMultiple
  9. @requireComponent(Sprite)
  10. @menu("Framework/UI组件/ResSprite")
  11. export default class ResSprite extends Component {
  12. // 动态加载的资源
  13. private _asset: SpriteFrame | SpriteAtlas = null;
  14. private _sprite: Sprite = null;
  15. private get sprite(): Sprite {
  16. if (!this._sprite) {
  17. this._sprite = this.getComponent(Sprite);
  18. }
  19. return this._sprite;
  20. }
  21. public get spriteFrame(): SpriteFrame {
  22. return this.sprite.spriteFrame;
  23. }
  24. protected onDestroy(): void {
  25. this._asset?.decRef();
  26. }
  27. /**
  28. * 设置spriteFrame
  29. * @param url
  30. * @param key 如果需要加载的url为图集时,需传入图集的key
  31. */
  32. public async setSpriteFrame(url: string, key: string = ""): Promise<void> {
  33. let type = key ? SpriteAtlas : SpriteFrame;
  34. let result = Res.get(url, type) || await Res.load(url, type);
  35. if (result instanceof type) {
  36. result.addRef();
  37. this._asset?.decRef();
  38. this._asset = result;
  39. this.sprite.spriteFrame = result instanceof SpriteAtlas ? result.getSpriteFrame(key) : result;
  40. }
  41. }
  42. }