8dcd717cb24889340f8223e7c83f4b7510309921.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. System.register(["__unresolved_0", "cc", "__unresolved_1", "__unresolved_2"], function (_export, _context) {
  2. "use strict";
  3. var _reporterNs, _cclegacy, ECSMask, ECSModel, ECSEntity, _crd;
  4. //#region 辅助方法
  5. /**
  6. * 实体身上组件有增删操作,广播通知对应的观察者
  7. * @param entity 实体对象
  8. * @param componentTypeId 组件类型id
  9. */
  10. /**
  11. * 创建组件对象
  12. * @param ctor
  13. */
  14. /**
  15. * 销毁实体
  16. *
  17. * 缓存销毁的实体,下次新建实体时会优先从缓存中拿
  18. * @param entity
  19. */
  20. function broadcastCompAddOrRemove(entity, componentTypeId) {
  21. var events = (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  22. error: Error()
  23. }), ECSModel) : ECSModel).compAddOrRemove.get(componentTypeId);
  24. for (var i = events.length - 1; i >= 0; i--) {
  25. events[i](entity);
  26. } // 判断是不是删了单例组件
  27. if ((_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  28. error: Error()
  29. }), ECSModel) : ECSModel).tid2comp.has(componentTypeId)) {
  30. (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  31. error: Error()
  32. }), ECSModel) : ECSModel).tid2comp.delete(componentTypeId);
  33. }
  34. }
  35. function createComp(ctor) {
  36. var cct = (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  37. error: Error()
  38. }), ECSModel) : ECSModel).compCtors[ctor.tid];
  39. if (!cct) {
  40. throw Error("\u6CA1\u6709\u627E\u5230\u8BE5\u7EC4\u4EF6\u7684\u6784\u9020\u51FD\u6570\uFF0C\u68C0\u67E5" + ctor.compName + "\u662F\u5426\u4E3A\u4E0D\u53EF\u6784\u9020\u7684\u7EC4\u4EF6");
  41. }
  42. var comps = (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  43. error: Error()
  44. }), ECSModel) : ECSModel).compPools.get(ctor.tid);
  45. var component = comps.pop() || new cct();
  46. return component;
  47. }
  48. function destroyEntity(entity) {
  49. if ((_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  50. error: Error()
  51. }), ECSModel) : ECSModel).eid2Entity.has(entity.eid)) {
  52. var entitys = (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  53. error: Error()
  54. }), ECSModel) : ECSModel).entityPool.get(entity.name);
  55. if (entitys == null) {
  56. entitys = [];
  57. (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  58. error: Error()
  59. }), ECSModel) : ECSModel).entityPool.set(entity.name, entitys);
  60. }
  61. entitys.push(entity);
  62. (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  63. error: Error()
  64. }), ECSModel) : ECSModel).eid2Entity.delete(entity.eid);
  65. } else {
  66. console.warn('试图销毁不存在的实体');
  67. }
  68. } //#endregion
  69. /** ECS实体对象 */
  70. function _reportPossibleCrUseOfecs(extras) {
  71. _reporterNs.report("ecs", "./ECS", _context.meta, extras);
  72. }
  73. function _reportPossibleCrUseOfECSMask(extras) {
  74. _reporterNs.report("ECSMask", "./ECSMask", _context.meta, extras);
  75. }
  76. function _reportPossibleCrUseOfCompCtor(extras) {
  77. _reporterNs.report("CompCtor", "./ECSModel", _context.meta, extras);
  78. }
  79. function _reportPossibleCrUseOfCompType(extras) {
  80. _reporterNs.report("CompType", "./ECSModel", _context.meta, extras);
  81. }
  82. function _reportPossibleCrUseOfECSModel(extras) {
  83. _reporterNs.report("ECSModel", "./ECSModel", _context.meta, extras);
  84. }
  85. _export("ECSEntity", void 0);
  86. return {
  87. setters: [function (_unresolved_) {
  88. _reporterNs = _unresolved_;
  89. }, function (_cc) {
  90. _cclegacy = _cc.cclegacy;
  91. }, function (_unresolved_2) {
  92. ECSMask = _unresolved_2.ECSMask;
  93. }, function (_unresolved_3) {
  94. ECSModel = _unresolved_3.ECSModel;
  95. }],
  96. execute: function () {
  97. _crd = true;
  98. _cclegacy._RF.push({}, "1fb62WC3PZPvLhjoZQfrREJ", "ECSEntity", undefined);
  99. _export("ECSEntity", ECSEntity = class ECSEntity {
  100. constructor() {
  101. /** 实体唯一标识,不要手动修改 */
  102. this.eid = -1;
  103. /** 实体对象名 */
  104. this.name = "";
  105. /** 实体是否有效 */
  106. this.isValid = true;
  107. /** 组件过滤数据 */
  108. this.mask = new (_crd && ECSMask === void 0 ? (_reportPossibleCrUseOfECSMask({
  109. error: Error()
  110. }), ECSMask) : ECSMask)();
  111. /** 当前实体身上附加的组件构造函数 */
  112. this.compTid2Ctor = new Map();
  113. /** 配合 entity.remove(Comp, false), 记录组件实例上的缓存数据,在添加时恢复原数据 */
  114. this.compTid2Obj = new Map();
  115. this._parent = null;
  116. this._children = null;
  117. }
  118. /** 父实体 */
  119. get parent() {
  120. return this._parent;
  121. }
  122. set parent(value) {
  123. this._parent = value;
  124. }
  125. /** 子实体集合 */
  126. get children() {
  127. if (this._children == null) {
  128. this._children = new Map();
  129. }
  130. return this._children;
  131. }
  132. /**
  133. * 添加子实体
  134. * @param entity 被添加的实体对象
  135. */
  136. addChild(entity) {
  137. entity._parent = this;
  138. this.children.set(entity.eid, entity);
  139. }
  140. /**
  141. * 移除子实体
  142. * @param entity 被移除的实体对象
  143. * @param isDestroy 被移除的实体是否释放,默认为释放
  144. * @returns
  145. */
  146. removeChild(entity, isDestroy) {
  147. if (isDestroy === void 0) {
  148. isDestroy = true;
  149. }
  150. if (this.children == null) return;
  151. entity.parent = null;
  152. this.children.delete(entity.eid);
  153. if (isDestroy) entity.destroy();
  154. }
  155. /**
  156. * 根据组件类动态创建组件,并通知关心的系统。如果实体存在了这个组件,那么会先删除之前的组件然后添加新的
  157. *
  158. * 注意:不要直接new Component,new来的Component不会从Component的缓存池拿缓存的数据
  159. * @param componentTypeId 组件类
  160. * @param isReAdd true-表示用户指定这个实体可能已经存在了该组件,那么再次add组件的时候会先移除该组件然后再添加一遍。false-表示不重复添加组件
  161. */
  162. add(ctor, isReAdd) {
  163. if (isReAdd === void 0) {
  164. isReAdd = false;
  165. }
  166. if (typeof ctor === 'function') {
  167. var compTid = ctor.tid;
  168. if (ctor.tid === -1) {
  169. throw Error("\u3010" + this.name + "\u3011\u5B9E\u4F53\u3010" + ctor.compName + "\u3011\u7EC4\u4EF6\u672A\u6CE8\u518C");
  170. }
  171. if (this.compTid2Ctor.has(compTid)) {
  172. // 判断是否有该组件,如果有则先移除
  173. if (isReAdd) {
  174. this.remove(ctor);
  175. } else {
  176. console.log("\u3010" + this.name + "\u3011\u5B9E\u4F53\u3010" + ctor.compName + "\u3011\u7EC4\u4EF6\u5DF2\u5B58\u5728"); // @ts-ignore
  177. return this[ctor.compName];
  178. }
  179. }
  180. this.mask.set(compTid);
  181. var comp;
  182. if (this.compTid2Obj.has(compTid)) {
  183. comp = this.compTid2Obj.get(compTid);
  184. this.compTid2Obj.delete(compTid);
  185. } else {
  186. // 创建组件对象
  187. comp = createComp(ctor);
  188. } // 将组件对象直接附加到实体对象身上,方便直接获取
  189. // @ts-ignore
  190. this[ctor.compName] = comp;
  191. this.compTid2Ctor.set(compTid, ctor);
  192. comp.ent = this; // 广播实体添加组件的消息
  193. broadcastCompAddOrRemove(this, compTid);
  194. return comp;
  195. } else {
  196. var tmpCtor = ctor.constructor;
  197. var _compTid = tmpCtor.tid; // console.assert(compTid !== -1 || !compTid, '组件未注册!');
  198. // console.assert(this.compTid2Ctor.has(compTid), '已存在该组件!');
  199. if (_compTid === -1 || _compTid == null) throw Error("\u3010" + this.name + "\u3011\u5B9E\u4F53\u3010" + tmpCtor.name + "\u3011\u7EC4\u4EF6\u672A\u6CE8\u518C");
  200. if (this.compTid2Ctor.has(_compTid)) throw Error("\u3010" + this.name + "\u3011\u5B9E\u4F53\u3010" + tmpCtor.name + "\u3011\u7EC4\u4EF6\u5DF2\u7ECF\u5B58\u5728");
  201. this.mask.set(_compTid); //@ts-ignore
  202. this[tmpCtor.compName] = ctor;
  203. this.compTid2Ctor.set(_compTid, tmpCtor); //@ts-ignore
  204. ctor.ent = this; //@ts-ignore
  205. ctor.canRecycle = false;
  206. broadcastCompAddOrRemove(this, _compTid);
  207. return this;
  208. }
  209. }
  210. /**
  211. * 批量添加组件
  212. * @param ctors 组件类
  213. * @returns
  214. */
  215. addComponents() {
  216. for (var _len = arguments.length, ctors = new Array(_len), _key = 0; _key < _len; _key++) {
  217. ctors[_key] = arguments[_key];
  218. }
  219. for (var _ctor of ctors) {
  220. this.add(_ctor);
  221. }
  222. return this;
  223. }
  224. /**
  225. * 获取一个组件实例
  226. * @param ctor 组件类
  227. */
  228. get(ctor) {
  229. // @ts-ignore
  230. return this[ctor.compName];
  231. }
  232. /**
  233. * 组件是否在实体存在内
  234. * @param ctor 组件类
  235. */
  236. has(ctor) {
  237. if (typeof ctor == "number") {
  238. return this.mask.has(ctor);
  239. } else {
  240. return this.compTid2Ctor.has(ctor.tid);
  241. }
  242. }
  243. /**
  244. * 从实体上删除指定组件
  245. * @param ctor 组件构造函数或者组件Tag
  246. * @param isRecycle 是否回收该组件对象。对于有些组件上有大量数据,当要描述移除组件但是不想清除组件上的数据是可以
  247. * 设置该参数为false,这样该组件对象会缓存在实体身上,下次重新添加组件时会将该组件对象添加回来,不会重新从组件缓存
  248. * 池中拿一个组件来用。
  249. */
  250. remove(ctor, isRecycle) {
  251. if (isRecycle === void 0) {
  252. isRecycle = true;
  253. }
  254. var hasComp = false; //@ts-ignore
  255. var componentTypeId = ctor.tid; //@ts-ignore
  256. var compName = ctor.compName;
  257. if (this.mask.has(componentTypeId)) {
  258. hasComp = true; //@ts-ignore
  259. var comp = this[ctor.compName]; //@ts-ignore
  260. comp.ent = null;
  261. if (isRecycle) {
  262. comp.reset(); // 回收组件到指定缓存池中
  263. if (comp.canRecycle) {
  264. var compPoolsType = (_crd && ECSModel === void 0 ? (_reportPossibleCrUseOfECSModel({
  265. error: Error()
  266. }), ECSModel) : ECSModel).compPools.get(componentTypeId);
  267. compPoolsType.push(comp);
  268. }
  269. } else {
  270. this.compTid2Obj.set(componentTypeId, comp); // 用于缓存显示对象组件
  271. }
  272. } // 删除实体上的组件逻辑
  273. if (hasComp) {
  274. //@ts-ignore
  275. this[compName] = null;
  276. this.mask.delete(componentTypeId);
  277. this.compTid2Ctor.delete(componentTypeId);
  278. broadcastCompAddOrRemove(this, componentTypeId);
  279. }
  280. }
  281. /** 销毁实体,实体会被回收到实体缓存池中 */
  282. destroy() {
  283. this.isValid = false; // 如果有父模块,则移除父模块上记录的子模块
  284. if (this._parent) {
  285. this._parent.removeChild(this, false);
  286. this._parent = null;
  287. } // 移除模块上所有子模块
  288. if (this._children) {
  289. this._children.forEach(e => {
  290. this.removeChild(e);
  291. });
  292. this._children = null;
  293. } // 移除实体上所有组件
  294. this.compTid2Ctor.forEach(this._remove, this);
  295. destroyEntity(this);
  296. this.compTid2Obj.clear();
  297. }
  298. _remove(comp) {
  299. this.remove(comp, true);
  300. }
  301. });
  302. _cclegacy._RF.pop();
  303. _crd = false;
  304. }
  305. };
  306. });
  307. //# sourceMappingURL=8dcd717cb24889340f8223e7c83f4b7510309921.js.map