ResGComponent.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import AssetsBundleMgr from "../../utils/AssetsBundleMgr";
  2. import FguiMgr from "../fgui/FguiMgr";
  3. const { ccclass, menu, disallowMultiple, requireComponent } = cc._decorator;
  4. /**
  5. * fguiload组件,自动管理资源的引用计数
  6. */
  7. @ccclass
  8. @disallowMultiple
  9. @requireComponent(cc.Component)
  10. export default class ResGComponent extends cc.Component {
  11. private _pkgName: string = null;
  12. LoadComp(bundleName: string, pkgName: string, resName: string, userClass: new () => fgui.GObject, onComplete: (comp: fairygui.GObject) => void) {
  13. AssetsBundleMgr.loadBundle(bundleName, (error, bundle: cc.AssetManager.Bundle) => {
  14. if (error) {
  15. return;
  16. }
  17. let pkg = fgui.UIPackage.getByName(pkgName);
  18. if (pkg) {
  19. if (this._pkgName != pkgName) {
  20. this.addDelayRelease(this._pkgName);
  21. FguiMgr.Instance.AddPkgCount(pkgName, 'ResGComponent');
  22. }
  23. this._pkgName = pkgName;
  24. let obj = pkg.createObject(resName, userClass);
  25. onComplete(obj);
  26. } else {
  27. fgui.UIPackage.loadPackage(bundle, pkgName, (error, pkg: fgui.UIPackage) => {
  28. if (error) {
  29. return;
  30. }
  31. if (this._pkgName != pkgName) {
  32. this.addDelayRelease(this._pkgName);
  33. FguiMgr.Instance.AddPkgCount(pkgName, 'ResGComponent');
  34. }
  35. this._pkgName = pkgName;
  36. let obj = pkg.createObject(resName, userClass);
  37. onComplete(obj);
  38. });
  39. }
  40. });
  41. }
  42. LoadComplete(url: string, scale: number, xFlip: boolean, yFlip: boolean) {
  43. }
  44. protected onDestroy(): void {
  45. this.resetRes();
  46. }
  47. /**
  48. * 重置资源
  49. */
  50. public resetRes(): void {
  51. if (this._pkgName) {
  52. // this.m_Asset.decRef();
  53. this.addDelayRelease(this._pkgName);
  54. this._pkgName = null;
  55. }
  56. }
  57. /** 5秒延迟释放资源 */
  58. protected addDelayRelease(pkgName: string) {
  59. setTimeout(() => {
  60. FguiMgr.Instance.DelPkgCount(pkgName, 'ResGComponent');
  61. }, 1000);
  62. }
  63. }