EntityComponent.cs 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 Jiang Yin. All rights reserved.
  4. // Homepage: https://gameframework.cn/
  5. // Feedback: mailto:ellan@gameframework.cn
  6. //------------------------------------------------------------
  7. using GameFramework;
  8. using GameFramework.Entity;
  9. using GameFramework.ObjectPool;
  10. using GameFramework.Resource;
  11. using System;
  12. using System.Collections.Generic;
  13. using UnityEngine;
  14. namespace UnityGameFramework.Runtime
  15. {
  16. /// <summary>
  17. /// 实体组件。
  18. /// </summary>
  19. [DisallowMultipleComponent]
  20. [AddComponentMenu("Game Framework/Entity")]
  21. public sealed partial class EntityComponent : GameFrameworkComponent
  22. {
  23. private const int DefaultPriority = 0;
  24. private IEntityManager m_EntityManager = null;
  25. private EventComponent m_EventComponent = null;
  26. private readonly List<IEntity> m_InternalEntityResults = new List<IEntity>();
  27. [SerializeField]
  28. private bool m_EnableShowEntityUpdateEvent = false;
  29. [SerializeField]
  30. private bool m_EnableShowEntityDependencyAssetEvent = false;
  31. [SerializeField]
  32. private Transform m_InstanceRoot = null;
  33. [SerializeField]
  34. private string m_EntityHelperTypeName = "UnityGameFramework.Runtime.DefaultEntityHelper";
  35. [SerializeField]
  36. private EntityHelperBase m_CustomEntityHelper = null;
  37. [SerializeField]
  38. private string m_EntityGroupHelperTypeName = "UnityGameFramework.Runtime.DefaultEntityGroupHelper";
  39. [SerializeField]
  40. private EntityGroupHelperBase m_CustomEntityGroupHelper = null;
  41. [SerializeField]
  42. private EntityGroup[] m_EntityGroups = null;
  43. /// <summary>
  44. /// 获取实体数量。
  45. /// </summary>
  46. public int EntityCount
  47. {
  48. get
  49. {
  50. return m_EntityManager.EntityCount;
  51. }
  52. }
  53. /// <summary>
  54. /// 获取实体组数量。
  55. /// </summary>
  56. public int EntityGroupCount
  57. {
  58. get
  59. {
  60. return m_EntityManager.EntityGroupCount;
  61. }
  62. }
  63. /// <summary>
  64. /// 游戏框架组件初始化。
  65. /// </summary>
  66. protected override void Awake()
  67. {
  68. base.Awake();
  69. m_EntityManager = GameFrameworkEntry.GetModule<IEntityManager>();
  70. if (m_EntityManager == null)
  71. {
  72. Log.Fatal("Entity manager is invalid.");
  73. return;
  74. }
  75. m_EntityManager.ShowEntitySuccess += OnShowEntitySuccess;
  76. m_EntityManager.ShowEntityFailure += OnShowEntityFailure;
  77. if (m_EnableShowEntityUpdateEvent)
  78. {
  79. m_EntityManager.ShowEntityUpdate += OnShowEntityUpdate;
  80. }
  81. if (m_EnableShowEntityDependencyAssetEvent)
  82. {
  83. m_EntityManager.ShowEntityDependencyAsset += OnShowEntityDependencyAsset;
  84. }
  85. m_EntityManager.HideEntityComplete += OnHideEntityComplete;
  86. }
  87. private void Start()
  88. {
  89. BaseComponent baseComponent = GameEntry.GetComponent<BaseComponent>();
  90. if (baseComponent == null)
  91. {
  92. Log.Fatal("Base component is invalid.");
  93. return;
  94. }
  95. m_EventComponent = GameEntry.GetComponent<EventComponent>();
  96. if (m_EventComponent == null)
  97. {
  98. Log.Fatal("Event component is invalid.");
  99. return;
  100. }
  101. if (baseComponent.EditorResourceMode)
  102. {
  103. m_EntityManager.SetResourceManager(baseComponent.EditorResourceHelper);
  104. }
  105. else
  106. {
  107. m_EntityManager.SetResourceManager(GameFrameworkEntry.GetModule<IResourceManager>());
  108. }
  109. m_EntityManager.SetObjectPoolManager(GameFrameworkEntry.GetModule<IObjectPoolManager>());
  110. EntityHelperBase entityHelper = Helper.CreateHelper(m_EntityHelperTypeName, m_CustomEntityHelper);
  111. if (entityHelper == null)
  112. {
  113. Log.Error("Can not create entity helper.");
  114. return;
  115. }
  116. entityHelper.name = "Entity Helper";
  117. Transform transform = entityHelper.transform;
  118. transform.SetParent(this.transform);
  119. transform.localScale = Vector3.one;
  120. m_EntityManager.SetEntityHelper(entityHelper);
  121. if (m_InstanceRoot == null)
  122. {
  123. m_InstanceRoot = new GameObject("Entity Instances").transform;
  124. m_InstanceRoot.SetParent(gameObject.transform);
  125. m_InstanceRoot.localScale = Vector3.one;
  126. }
  127. for (int i = 0; i < m_EntityGroups.Length; i++)
  128. {
  129. if (!AddEntityGroup(m_EntityGroups[i].Name, m_EntityGroups[i].InstanceAutoReleaseInterval, m_EntityGroups[i].InstanceCapacity, m_EntityGroups[i].InstanceExpireTime, m_EntityGroups[i].InstancePriority))
  130. {
  131. Log.Warning("Add entity group '{0}' failure.", m_EntityGroups[i].Name);
  132. continue;
  133. }
  134. }
  135. }
  136. /// <summary>
  137. /// 是否存在实体组。
  138. /// </summary>
  139. /// <param name="entityGroupName">实体组名称。</param>
  140. /// <returns>是否存在实体组。</returns>
  141. public bool HasEntityGroup(string entityGroupName)
  142. {
  143. return m_EntityManager.HasEntityGroup(entityGroupName);
  144. }
  145. /// <summary>
  146. /// 获取实体组。
  147. /// </summary>
  148. /// <param name="entityGroupName">实体组名称。</param>
  149. /// <returns>要获取的实体组。</returns>
  150. public IEntityGroup GetEntityGroup(string entityGroupName)
  151. {
  152. return m_EntityManager.GetEntityGroup(entityGroupName);
  153. }
  154. /// <summary>
  155. /// 获取所有实体组。
  156. /// </summary>
  157. /// <returns>所有实体组。</returns>
  158. public IEntityGroup[] GetAllEntityGroups()
  159. {
  160. return m_EntityManager.GetAllEntityGroups();
  161. }
  162. /// <summary>
  163. /// 获取所有实体组。
  164. /// </summary>
  165. /// <param name="results">所有实体组。</param>
  166. public void GetAllEntityGroups(List<IEntityGroup> results)
  167. {
  168. m_EntityManager.GetAllEntityGroups(results);
  169. }
  170. /// <summary>
  171. /// 增加实体组。
  172. /// </summary>
  173. /// <param name="entityGroupName">实体组名称。</param>
  174. /// <param name="instanceAutoReleaseInterval">实体实例对象池自动释放可释放对象的间隔秒数。</param>
  175. /// <param name="instanceCapacity">实体实例对象池容量。</param>
  176. /// <param name="instanceExpireTime">实体实例对象池对象过期秒数。</param>
  177. /// <param name="instancePriority">实体实例对象池的优先级。</param>
  178. /// <returns>是否增加实体组成功。</returns>
  179. public bool AddEntityGroup(string entityGroupName, float instanceAutoReleaseInterval, int instanceCapacity, float instanceExpireTime, int instancePriority)
  180. {
  181. if (m_EntityManager.HasEntityGroup(entityGroupName))
  182. {
  183. return false;
  184. }
  185. EntityGroupHelperBase entityGroupHelper = Helper.CreateHelper(m_EntityGroupHelperTypeName, m_CustomEntityGroupHelper, EntityGroupCount);
  186. if (entityGroupHelper == null)
  187. {
  188. Log.Error("Can not create entity group helper.");
  189. return false;
  190. }
  191. entityGroupHelper.name = Utility.Text.Format("Entity Group - {0}", entityGroupName);
  192. Transform transform = entityGroupHelper.transform;
  193. transform.SetParent(m_InstanceRoot);
  194. transform.localScale = Vector3.one;
  195. return m_EntityManager.AddEntityGroup(entityGroupName, instanceAutoReleaseInterval, instanceCapacity, instanceExpireTime, instancePriority, entityGroupHelper);
  196. }
  197. /// <summary>
  198. /// 是否存在实体。
  199. /// </summary>
  200. /// <param name="entityId">实体编号。</param>
  201. /// <returns>是否存在实体。</returns>
  202. public bool HasEntity(int entityId)
  203. {
  204. return m_EntityManager.HasEntity(entityId);
  205. }
  206. /// <summary>
  207. /// 是否存在实体。
  208. /// </summary>
  209. /// <param name="entityAssetName">实体资源名称。</param>
  210. /// <returns>是否存在实体。</returns>
  211. public bool HasEntity(string entityAssetName)
  212. {
  213. return m_EntityManager.HasEntity(entityAssetName);
  214. }
  215. /// <summary>
  216. /// 获取实体。
  217. /// </summary>
  218. /// <param name="entityId">实体编号。</param>
  219. /// <returns>实体。</returns>
  220. public Entity GetEntity(int entityId)
  221. {
  222. return (Entity)m_EntityManager.GetEntity(entityId);
  223. }
  224. /// <summary>
  225. /// 获取实体。
  226. /// </summary>
  227. /// <param name="entityAssetName">实体资源名称。</param>
  228. /// <returns>要获取的实体。</returns>
  229. public Entity GetEntity(string entityAssetName)
  230. {
  231. return (Entity)m_EntityManager.GetEntity(entityAssetName);
  232. }
  233. /// <summary>
  234. /// 获取实体。
  235. /// </summary>
  236. /// <param name="entityAssetName">实体资源名称。</param>
  237. /// <returns>要获取的实体。</returns>
  238. public Entity[] GetEntities(string entityAssetName)
  239. {
  240. IEntity[] entities = m_EntityManager.GetEntities(entityAssetName);
  241. Entity[] entityImpls = new Entity[entities.Length];
  242. for (int i = 0; i < entities.Length; i++)
  243. {
  244. entityImpls[i] = (Entity)entities[i];
  245. }
  246. return entityImpls;
  247. }
  248. /// <summary>
  249. /// 获取实体。
  250. /// </summary>
  251. /// <param name="entityAssetName">实体资源名称。</param>
  252. /// <param name="results">要获取的实体。</param>
  253. public void GetEntities(string entityAssetName, List<Entity> results)
  254. {
  255. if (results == null)
  256. {
  257. Log.Error("Results is invalid.");
  258. return;
  259. }
  260. results.Clear();
  261. m_EntityManager.GetEntities(entityAssetName, m_InternalEntityResults);
  262. foreach (IEntity entity in m_InternalEntityResults)
  263. {
  264. results.Add((Entity)entity);
  265. }
  266. }
  267. /// <summary>
  268. /// 获取所有已加载的实体。
  269. /// </summary>
  270. /// <returns>所有已加载的实体。</returns>
  271. public Entity[] GetAllLoadedEntities()
  272. {
  273. IEntity[] entities = m_EntityManager.GetAllLoadedEntities();
  274. Entity[] entityImpls = new Entity[entities.Length];
  275. for (int i = 0; i < entities.Length; i++)
  276. {
  277. entityImpls[i] = (Entity)entities[i];
  278. }
  279. return entityImpls;
  280. }
  281. /// <summary>
  282. /// 获取所有已加载的实体。
  283. /// </summary>
  284. /// <param name="results">所有已加载的实体。</param>
  285. public void GetAllLoadedEntities(List<Entity> results)
  286. {
  287. if (results == null)
  288. {
  289. Log.Error("Results is invalid.");
  290. return;
  291. }
  292. results.Clear();
  293. m_EntityManager.GetAllLoadedEntities(m_InternalEntityResults);
  294. foreach (IEntity entity in m_InternalEntityResults)
  295. {
  296. results.Add((Entity)entity);
  297. }
  298. }
  299. /// <summary>
  300. /// 获取所有正在加载实体的编号。
  301. /// </summary>
  302. /// <returns>所有正在加载实体的编号。</returns>
  303. public int[] GetAllLoadingEntityIds()
  304. {
  305. return m_EntityManager.GetAllLoadingEntityIds();
  306. }
  307. /// <summary>
  308. /// 获取所有正在加载实体的编号。
  309. /// </summary>
  310. /// <param name="results">所有正在加载实体的编号。</param>
  311. public void GetAllLoadingEntityIds(List<int> results)
  312. {
  313. m_EntityManager.GetAllLoadingEntityIds(results);
  314. }
  315. /// <summary>
  316. /// 是否正在加载实体。
  317. /// </summary>
  318. /// <param name="entityId">实体编号。</param>
  319. /// <returns>是否正在加载实体。</returns>
  320. public bool IsLoadingEntity(int entityId)
  321. {
  322. return m_EntityManager.IsLoadingEntity(entityId);
  323. }
  324. /// <summary>
  325. /// 是否是合法的实体。
  326. /// </summary>
  327. /// <param name="entity">实体。</param>
  328. /// <returns>实体是否合法。</returns>
  329. public bool IsValidEntity(Entity entity)
  330. {
  331. return m_EntityManager.IsValidEntity(entity);
  332. }
  333. /// <summary>
  334. /// 显示实体。
  335. /// </summary>
  336. /// <typeparam name="T">实体逻辑类型。</typeparam>
  337. /// <param name="entityId">实体编号。</param>
  338. /// <param name="entityAssetName">实体资源名称。</param>
  339. /// <param name="entityGroupName">实体组名称。</param>
  340. public void ShowEntity<T>(int entityId, string entityAssetName, string entityGroupName) where T : EntityLogic
  341. {
  342. ShowEntity(entityId, typeof(T), entityAssetName, entityGroupName, DefaultPriority, null);
  343. }
  344. /// <summary>
  345. /// 显示实体。
  346. /// </summary>
  347. /// <param name="entityId">实体编号。</param>
  348. /// <param name="entityLogicType">实体逻辑类型。</param>
  349. /// <param name="entityAssetName">实体资源名称。</param>
  350. /// <param name="entityGroupName">实体组名称。</param>
  351. public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName)
  352. {
  353. ShowEntity(entityId, entityLogicType, entityAssetName, entityGroupName, DefaultPriority, null);
  354. }
  355. /// <summary>
  356. /// 显示实体。
  357. /// </summary>
  358. /// <typeparam name="T">实体逻辑类型。</typeparam>
  359. /// <param name="entityId">实体编号。</param>
  360. /// <param name="entityAssetName">实体资源名称。</param>
  361. /// <param name="entityGroupName">实体组名称。</param>
  362. /// <param name="priority">加载实体资源的优先级。</param>
  363. public void ShowEntity<T>(int entityId, string entityAssetName, string entityGroupName, int priority) where T : EntityLogic
  364. {
  365. ShowEntity(entityId, typeof(T), entityAssetName, entityGroupName, priority, null);
  366. }
  367. /// <summary>
  368. /// 显示实体。
  369. /// </summary>
  370. /// <param name="entityId">实体编号。</param>
  371. /// <param name="entityLogicType">实体逻辑类型。</param>
  372. /// <param name="entityAssetName">实体资源名称。</param>
  373. /// <param name="entityGroupName">实体组名称。</param>
  374. /// <param name="priority">加载实体资源的优先级。</param>
  375. public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName, int priority)
  376. {
  377. ShowEntity(entityId, entityLogicType, entityAssetName, entityGroupName, priority, null);
  378. }
  379. /// <summary>
  380. /// 显示实体。
  381. /// </summary>
  382. /// <typeparam name="T">实体逻辑类型。</typeparam>
  383. /// <param name="entityId">实体编号。</param>
  384. /// <param name="entityAssetName">实体资源名称。</param>
  385. /// <param name="entityGroupName">实体组名称。</param>
  386. /// <param name="userData">用户自定义数据。</param>
  387. public void ShowEntity<T>(int entityId, string entityAssetName, string entityGroupName, object userData) where T : EntityLogic
  388. {
  389. ShowEntity(entityId, typeof(T), entityAssetName, entityGroupName, DefaultPriority, userData);
  390. }
  391. /// <summary>
  392. /// 显示实体。
  393. /// </summary>
  394. /// <param name="entityId">实体编号。</param>
  395. /// <param name="entityLogicType">实体逻辑类型。</param>
  396. /// <param name="entityAssetName">实体资源名称。</param>
  397. /// <param name="entityGroupName">实体组名称。</param>
  398. /// <param name="userData">用户自定义数据。</param>
  399. public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName, object userData)
  400. {
  401. ShowEntity(entityId, entityLogicType, entityAssetName, entityGroupName, DefaultPriority, userData);
  402. }
  403. /// <summary>
  404. /// 显示实体。
  405. /// </summary>
  406. /// <typeparam name="T">实体逻辑类型。</typeparam>
  407. /// <param name="entityId">实体编号。</param>
  408. /// <param name="entityAssetName">实体资源名称。</param>
  409. /// <param name="entityGroupName">实体组名称。</param>
  410. /// <param name="priority">加载实体资源的优先级。</param>
  411. /// <param name="userData">用户自定义数据。</param>
  412. public void ShowEntity<T>(int entityId, string entityAssetName, string entityGroupName, int priority, object userData) where T : EntityLogic
  413. {
  414. ShowEntity(entityId, typeof(T), entityAssetName, entityGroupName, priority, userData);
  415. }
  416. /// <summary>
  417. /// 显示实体。
  418. /// </summary>
  419. /// <param name="entityId">实体编号。</param>
  420. /// <param name="entityLogicType">实体逻辑类型。</param>
  421. /// <param name="entityAssetName">实体资源名称。</param>
  422. /// <param name="entityGroupName">实体组名称。</param>
  423. /// <param name="priority">加载实体资源的优先级。</param>
  424. /// <param name="userData">用户自定义数据。</param>
  425. public void ShowEntity(int entityId, Type entityLogicType, string entityAssetName, string entityGroupName, int priority, object userData)
  426. {
  427. if (entityLogicType == null)
  428. {
  429. Log.Error("Entity type is invalid.");
  430. return;
  431. }
  432. m_EntityManager.ShowEntity(entityId, entityAssetName, entityGroupName, priority, ShowEntityInfo.Create(entityLogicType, userData));
  433. }
  434. /// <summary>
  435. /// 隐藏实体。
  436. /// </summary>
  437. /// <param name="entityId">实体编号。</param>
  438. public void HideEntity(int entityId)
  439. {
  440. m_EntityManager.HideEntity(entityId);
  441. }
  442. /// <summary>
  443. /// 隐藏实体。
  444. /// </summary>
  445. /// <param name="entityId">实体编号。</param>
  446. /// <param name="userData">用户自定义数据。</param>
  447. public void HideEntity(int entityId, object userData)
  448. {
  449. m_EntityManager.HideEntity(entityId, userData);
  450. }
  451. /// <summary>
  452. /// 隐藏实体。
  453. /// </summary>
  454. /// <param name="entity">实体。</param>
  455. public void HideEntity(Entity entity)
  456. {
  457. m_EntityManager.HideEntity(entity);
  458. }
  459. /// <summary>
  460. /// 隐藏实体。
  461. /// </summary>
  462. /// <param name="entity">实体。</param>
  463. /// <param name="userData">用户自定义数据。</param>
  464. public void HideEntity(Entity entity, object userData)
  465. {
  466. m_EntityManager.HideEntity(entity, userData);
  467. }
  468. /// <summary>
  469. /// 隐藏所有已加载的实体。
  470. /// </summary>
  471. public void HideAllLoadedEntities()
  472. {
  473. m_EntityManager.HideAllLoadedEntities();
  474. }
  475. /// <summary>
  476. /// 隐藏所有已加载的实体。
  477. /// </summary>
  478. /// <param name="userData">用户自定义数据。</param>
  479. public void HideAllLoadedEntities(object userData)
  480. {
  481. m_EntityManager.HideAllLoadedEntities(userData);
  482. }
  483. /// <summary>
  484. /// 隐藏所有正在加载的实体。
  485. /// </summary>
  486. public void HideAllLoadingEntities()
  487. {
  488. m_EntityManager.HideAllLoadingEntities();
  489. }
  490. /// <summary>
  491. /// 获取父实体。
  492. /// </summary>
  493. /// <param name="childEntityId">要获取父实体的子实体的实体编号。</param>
  494. /// <returns>子实体的父实体。</returns>
  495. public Entity GetParentEntity(int childEntityId)
  496. {
  497. return (Entity)m_EntityManager.GetParentEntity(childEntityId);
  498. }
  499. /// <summary>
  500. /// 获取父实体。
  501. /// </summary>
  502. /// <param name="childEntity">要获取父实体的子实体。</param>
  503. /// <returns>子实体的父实体。</returns>
  504. public Entity GetParentEntity(Entity childEntity)
  505. {
  506. return (Entity)m_EntityManager.GetParentEntity(childEntity);
  507. }
  508. /// <summary>
  509. /// 获取子实体数量。
  510. /// </summary>
  511. /// <param name="parentEntityId">要获取子实体数量的父实体的实体编号。</param>
  512. /// <returns>子实体数量。</returns>
  513. public int GetChildEntityCount(int parentEntityId)
  514. {
  515. return m_EntityManager.GetChildEntityCount(parentEntityId);
  516. }
  517. /// <summary>
  518. /// 获取子实体。
  519. /// </summary>
  520. /// <param name="parentEntityId">要获取子实体的父实体的实体编号。</param>
  521. /// <returns>子实体。</returns>
  522. public Entity GetChildEntity(int parentEntityId)
  523. {
  524. return (Entity)m_EntityManager.GetChildEntity(parentEntityId);
  525. }
  526. /// <summary>
  527. /// 获取子实体。
  528. /// </summary>
  529. /// <param name="parentEntity">要获取子实体的父实体。</param>
  530. /// <returns>子实体。</returns>
  531. public Entity GetChildEntity(IEntity parentEntity)
  532. {
  533. return (Entity)m_EntityManager.GetChildEntity(parentEntity);
  534. }
  535. /// <summary>
  536. /// 获取所有子实体。
  537. /// </summary>
  538. /// <param name="parentEntityId">要获取所有子实体的父实体的实体编号。</param>
  539. /// <returns>所有子实体。</returns>
  540. public Entity[] GetChildEntities(int parentEntityId)
  541. {
  542. IEntity[] entities = m_EntityManager.GetChildEntities(parentEntityId);
  543. Entity[] entityImpls = new Entity[entities.Length];
  544. for (int i = 0; i < entities.Length; i++)
  545. {
  546. entityImpls[i] = (Entity)entities[i];
  547. }
  548. return entityImpls;
  549. }
  550. /// <summary>
  551. /// 获取所有子实体。
  552. /// </summary>
  553. /// <param name="parentEntityId">要获取所有子实体的父实体的实体编号。</param>
  554. /// <param name="results">所有子实体。</param>
  555. public void GetChildEntities(int parentEntityId, List<IEntity> results)
  556. {
  557. if (results == null)
  558. {
  559. Log.Error("Results is invalid.");
  560. return;
  561. }
  562. results.Clear();
  563. m_EntityManager.GetChildEntities(parentEntityId, m_InternalEntityResults);
  564. foreach (IEntity entity in m_InternalEntityResults)
  565. {
  566. results.Add((Entity)entity);
  567. }
  568. }
  569. /// <summary>
  570. /// 获取所有子实体。
  571. /// </summary>
  572. /// <param name="parentEntity">要获取所有子实体的父实体。</param>
  573. /// <returns>所有子实体。</returns>
  574. public Entity[] GetChildEntities(Entity parentEntity)
  575. {
  576. IEntity[] entities = m_EntityManager.GetChildEntities(parentEntity);
  577. Entity[] entityImpls = new Entity[entities.Length];
  578. for (int i = 0; i < entities.Length; i++)
  579. {
  580. entityImpls[i] = (Entity)entities[i];
  581. }
  582. return entityImpls;
  583. }
  584. /// <summary>
  585. /// 获取所有子实体。
  586. /// </summary>
  587. /// <param name="parentEntity">要获取所有子实体的父实体。</param>
  588. /// <param name="results">所有子实体。</param>
  589. public void GetChildEntities(IEntity parentEntity, List<IEntity> results)
  590. {
  591. if (results == null)
  592. {
  593. Log.Error("Results is invalid.");
  594. return;
  595. }
  596. results.Clear();
  597. m_EntityManager.GetChildEntities(parentEntity, m_InternalEntityResults);
  598. foreach (IEntity entity in m_InternalEntityResults)
  599. {
  600. results.Add((Entity)entity);
  601. }
  602. }
  603. /// <summary>
  604. /// 附加子实体。
  605. /// </summary>
  606. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  607. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  608. public void AttachEntity(int childEntityId, int parentEntityId)
  609. {
  610. AttachEntity(GetEntity(childEntityId), GetEntity(parentEntityId), string.Empty, null);
  611. }
  612. /// <summary>
  613. /// 附加子实体。
  614. /// </summary>
  615. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  616. /// <param name="parentEntity">被附加的父实体。</param>
  617. public void AttachEntity(int childEntityId, Entity parentEntity)
  618. {
  619. AttachEntity(GetEntity(childEntityId), parentEntity, string.Empty, null);
  620. }
  621. /// <summary>
  622. /// 附加子实体。
  623. /// </summary>
  624. /// <param name="childEntity">要附加的子实体。</param>
  625. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  626. public void AttachEntity(Entity childEntity, int parentEntityId)
  627. {
  628. AttachEntity(childEntity, GetEntity(parentEntityId), string.Empty, null);
  629. }
  630. /// <summary>
  631. /// 附加子实体。
  632. /// </summary>
  633. /// <param name="childEntity">要附加的子实体。</param>
  634. /// <param name="parentEntity">被附加的父实体。</param>
  635. public void AttachEntity(Entity childEntity, Entity parentEntity)
  636. {
  637. AttachEntity(childEntity, parentEntity, string.Empty, null);
  638. }
  639. /// <summary>
  640. /// 附加子实体。
  641. /// </summary>
  642. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  643. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  644. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  645. public void AttachEntity(int childEntityId, int parentEntityId, string parentTransformPath)
  646. {
  647. AttachEntity(GetEntity(childEntityId), GetEntity(parentEntityId), parentTransformPath, null);
  648. }
  649. /// <summary>
  650. /// 附加子实体。
  651. /// </summary>
  652. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  653. /// <param name="parentEntity">被附加的父实体。</param>
  654. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  655. public void AttachEntity(int childEntityId, Entity parentEntity, string parentTransformPath)
  656. {
  657. AttachEntity(GetEntity(childEntityId), parentEntity, parentTransformPath, null);
  658. }
  659. /// <summary>
  660. /// 附加子实体。
  661. /// </summary>
  662. /// <param name="childEntity">要附加的子实体。</param>
  663. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  664. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  665. public void AttachEntity(Entity childEntity, int parentEntityId, string parentTransformPath)
  666. {
  667. AttachEntity(childEntity, GetEntity(parentEntityId), parentTransformPath, null);
  668. }
  669. /// <summary>
  670. /// 附加子实体。
  671. /// </summary>
  672. /// <param name="childEntity">要附加的子实体。</param>
  673. /// <param name="parentEntity">被附加的父实体。</param>
  674. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  675. public void AttachEntity(Entity childEntity, Entity parentEntity, string parentTransformPath)
  676. {
  677. AttachEntity(childEntity, parentEntity, parentTransformPath, null);
  678. }
  679. /// <summary>
  680. /// 附加子实体。
  681. /// </summary>
  682. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  683. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  684. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  685. public void AttachEntity(int childEntityId, int parentEntityId, Transform parentTransform)
  686. {
  687. AttachEntity(GetEntity(childEntityId), GetEntity(parentEntityId), parentTransform, null);
  688. }
  689. /// <summary>
  690. /// 附加子实体。
  691. /// </summary>
  692. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  693. /// <param name="parentEntity">被附加的父实体。</param>
  694. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  695. public void AttachEntity(int childEntityId, Entity parentEntity, Transform parentTransform)
  696. {
  697. AttachEntity(GetEntity(childEntityId), parentEntity, parentTransform, null);
  698. }
  699. /// <summary>
  700. /// 附加子实体。
  701. /// </summary>
  702. /// <param name="childEntity">要附加的子实体。</param>
  703. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  704. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  705. public void AttachEntity(Entity childEntity, int parentEntityId, Transform parentTransform)
  706. {
  707. AttachEntity(childEntity, GetEntity(parentEntityId), parentTransform, null);
  708. }
  709. /// <summary>
  710. /// 附加子实体。
  711. /// </summary>
  712. /// <param name="childEntity">要附加的子实体。</param>
  713. /// <param name="parentEntity">被附加的父实体。</param>
  714. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  715. public void AttachEntity(Entity childEntity, Entity parentEntity, Transform parentTransform)
  716. {
  717. AttachEntity(childEntity, parentEntity, parentTransform, null);
  718. }
  719. /// <summary>
  720. /// 附加子实体。
  721. /// </summary>
  722. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  723. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  724. /// <param name="userData">用户自定义数据。</param>
  725. public void AttachEntity(int childEntityId, int parentEntityId, object userData)
  726. {
  727. AttachEntity(GetEntity(childEntityId), GetEntity(parentEntityId), string.Empty, userData);
  728. }
  729. /// <summary>
  730. /// 附加子实体。
  731. /// </summary>
  732. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  733. /// <param name="parentEntity">被附加的父实体。</param>
  734. /// <param name="userData">用户自定义数据。</param>
  735. public void AttachEntity(int childEntityId, Entity parentEntity, object userData)
  736. {
  737. AttachEntity(GetEntity(childEntityId), parentEntity, string.Empty, userData);
  738. }
  739. /// <summary>
  740. /// 附加子实体。
  741. /// </summary>
  742. /// <param name="childEntity">要附加的子实体。</param>
  743. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  744. /// <param name="userData">用户自定义数据。</param>
  745. public void AttachEntity(Entity childEntity, int parentEntityId, object userData)
  746. {
  747. AttachEntity(childEntity, GetEntity(parentEntityId), string.Empty, userData);
  748. }
  749. /// <summary>
  750. /// 附加子实体。
  751. /// </summary>
  752. /// <param name="childEntity">要附加的子实体。</param>
  753. /// <param name="parentEntity">被附加的父实体。</param>
  754. /// <param name="userData">用户自定义数据。</param>
  755. public void AttachEntity(Entity childEntity, Entity parentEntity, object userData)
  756. {
  757. AttachEntity(childEntity, parentEntity, string.Empty, userData);
  758. }
  759. /// <summary>
  760. /// 附加子实体。
  761. /// </summary>
  762. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  763. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  764. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  765. /// <param name="userData">用户自定义数据。</param>
  766. public void AttachEntity(int childEntityId, int parentEntityId, string parentTransformPath, object userData)
  767. {
  768. AttachEntity(GetEntity(childEntityId), GetEntity(parentEntityId), parentTransformPath, userData);
  769. }
  770. /// <summary>
  771. /// 附加子实体。
  772. /// </summary>
  773. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  774. /// <param name="parentEntity">被附加的父实体。</param>
  775. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  776. /// <param name="userData">用户自定义数据。</param>
  777. public void AttachEntity(int childEntityId, Entity parentEntity, string parentTransformPath, object userData)
  778. {
  779. AttachEntity(GetEntity(childEntityId), parentEntity, parentTransformPath, userData);
  780. }
  781. /// <summary>
  782. /// 附加子实体。
  783. /// </summary>
  784. /// <param name="childEntity">要附加的子实体。</param>
  785. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  786. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  787. /// <param name="userData">用户自定义数据。</param>
  788. public void AttachEntity(Entity childEntity, int parentEntityId, string parentTransformPath, object userData)
  789. {
  790. AttachEntity(childEntity, GetEntity(parentEntityId), parentTransformPath, userData);
  791. }
  792. /// <summary>
  793. /// 附加子实体。
  794. /// </summary>
  795. /// <param name="childEntity">要附加的子实体。</param>
  796. /// <param name="parentEntity">被附加的父实体。</param>
  797. /// <param name="parentTransformPath">相对于被附加父实体的位置。</param>
  798. /// <param name="userData">用户自定义数据。</param>
  799. public void AttachEntity(Entity childEntity, Entity parentEntity, string parentTransformPath, object userData)
  800. {
  801. if (childEntity == null)
  802. {
  803. Log.Warning("Child entity is invalid.");
  804. return;
  805. }
  806. if (parentEntity == null)
  807. {
  808. Log.Warning("Parent entity is invalid.");
  809. return;
  810. }
  811. Transform parentTransform = null;
  812. if (string.IsNullOrEmpty(parentTransformPath))
  813. {
  814. parentTransform = parentEntity.Logic.CachedTransform;
  815. }
  816. else
  817. {
  818. parentTransform = parentEntity.Logic.CachedTransform.Find(parentTransformPath);
  819. if (parentTransform == null)
  820. {
  821. Log.Warning("Can not find transform path '{0}' from parent entity '{1}'.", parentTransformPath, parentEntity.Logic.Name);
  822. parentTransform = parentEntity.Logic.CachedTransform;
  823. }
  824. }
  825. AttachEntity(childEntity, parentEntity, parentTransform, userData);
  826. }
  827. /// <summary>
  828. /// 附加子实体。
  829. /// </summary>
  830. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  831. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  832. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  833. /// <param name="userData">用户自定义数据。</param>
  834. public void AttachEntity(int childEntityId, int parentEntityId, Transform parentTransform, object userData)
  835. {
  836. AttachEntity(GetEntity(childEntityId), GetEntity(parentEntityId), parentTransform, userData);
  837. }
  838. /// <summary>
  839. /// 附加子实体。
  840. /// </summary>
  841. /// <param name="childEntityId">要附加的子实体的实体编号。</param>
  842. /// <param name="parentEntity">被附加的父实体。</param>
  843. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  844. /// <param name="userData">用户自定义数据。</param>
  845. public void AttachEntity(int childEntityId, Entity parentEntity, Transform parentTransform, object userData)
  846. {
  847. AttachEntity(GetEntity(childEntityId), parentEntity, parentTransform, userData);
  848. }
  849. /// <summary>
  850. /// 附加子实体。
  851. /// </summary>
  852. /// <param name="childEntity">要附加的子实体。</param>
  853. /// <param name="parentEntityId">被附加的父实体的实体编号。</param>
  854. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  855. /// <param name="userData">用户自定义数据。</param>
  856. public void AttachEntity(Entity childEntity, int parentEntityId, Transform parentTransform, object userData)
  857. {
  858. AttachEntity(childEntity, GetEntity(parentEntityId), parentTransform, userData);
  859. }
  860. /// <summary>
  861. /// 附加子实体。
  862. /// </summary>
  863. /// <param name="childEntity">要附加的子实体。</param>
  864. /// <param name="parentEntity">被附加的父实体。</param>
  865. /// <param name="parentTransform">相对于被附加父实体的位置。</param>
  866. /// <param name="userData">用户自定义数据。</param>
  867. public void AttachEntity(Entity childEntity, Entity parentEntity, Transform parentTransform, object userData)
  868. {
  869. if (childEntity == null)
  870. {
  871. Log.Warning("Child entity is invalid.");
  872. return;
  873. }
  874. if (parentEntity == null)
  875. {
  876. Log.Warning("Parent entity is invalid.");
  877. return;
  878. }
  879. if (parentTransform == null)
  880. {
  881. parentTransform = parentEntity.Logic.CachedTransform;
  882. }
  883. m_EntityManager.AttachEntity(childEntity, parentEntity, AttachEntityInfo.Create(parentTransform, userData));
  884. }
  885. /// <summary>
  886. /// 解除子实体。
  887. /// </summary>
  888. /// <param name="childEntityId">要解除的子实体的实体编号。</param>
  889. public void DetachEntity(int childEntityId)
  890. {
  891. m_EntityManager.DetachEntity(childEntityId);
  892. }
  893. /// <summary>
  894. /// 解除子实体。
  895. /// </summary>
  896. /// <param name="childEntityId">要解除的子实体的实体编号。</param>
  897. /// <param name="userData">用户自定义数据。</param>
  898. public void DetachEntity(int childEntityId, object userData)
  899. {
  900. m_EntityManager.DetachEntity(childEntityId, userData);
  901. }
  902. /// <summary>
  903. /// 解除子实体。
  904. /// </summary>
  905. /// <param name="childEntity">要解除的子实体。</param>
  906. public void DetachEntity(Entity childEntity)
  907. {
  908. m_EntityManager.DetachEntity(childEntity);
  909. }
  910. /// <summary>
  911. /// 解除子实体。
  912. /// </summary>
  913. /// <param name="childEntity">要解除的子实体。</param>
  914. /// <param name="userData">用户自定义数据。</param>
  915. public void DetachEntity(Entity childEntity, object userData)
  916. {
  917. m_EntityManager.DetachEntity(childEntity, userData);
  918. }
  919. /// <summary>
  920. /// 解除所有子实体。
  921. /// </summary>
  922. /// <param name="parentEntityId">被解除的父实体的实体编号。</param>
  923. public void DetachChildEntities(int parentEntityId)
  924. {
  925. m_EntityManager.DetachChildEntities(parentEntityId);
  926. }
  927. /// <summary>
  928. /// 解除所有子实体。
  929. /// </summary>
  930. /// <param name="parentEntityId">被解除的父实体的实体编号。</param>
  931. /// <param name="userData">用户自定义数据。</param>
  932. public void DetachChildEntities(int parentEntityId, object userData)
  933. {
  934. m_EntityManager.DetachChildEntities(parentEntityId, userData);
  935. }
  936. /// <summary>
  937. /// 解除所有子实体。
  938. /// </summary>
  939. /// <param name="parentEntity">被解除的父实体。</param>
  940. public void DetachChildEntities(Entity parentEntity)
  941. {
  942. m_EntityManager.DetachChildEntities(parentEntity);
  943. }
  944. /// <summary>
  945. /// 解除所有子实体。
  946. /// </summary>
  947. /// <param name="parentEntity">被解除的父实体。</param>
  948. /// <param name="userData">用户自定义数据。</param>
  949. public void DetachChildEntities(Entity parentEntity, object userData)
  950. {
  951. m_EntityManager.DetachChildEntities(parentEntity, userData);
  952. }
  953. /// <summary>
  954. /// 设置实体是否被加锁。
  955. /// </summary>
  956. /// <param name="entity">实体。</param>
  957. /// <param name="locked">实体是否被加锁。</param>
  958. public void SetEntityInstanceLocked(Entity entity, bool locked)
  959. {
  960. if (entity == null)
  961. {
  962. Log.Warning("Entity is invalid.");
  963. return;
  964. }
  965. IEntityGroup entityGroup = entity.EntityGroup;
  966. if (entityGroup == null)
  967. {
  968. Log.Warning("Entity group is invalid.");
  969. return;
  970. }
  971. entityGroup.SetEntityInstanceLocked(entity.gameObject, locked);
  972. }
  973. /// <summary>
  974. /// 设置实体的优先级。
  975. /// </summary>
  976. /// <param name="entity">实体。</param>
  977. /// <param name="priority">实体优先级。</param>
  978. public void SetInstancePriority(Entity entity, int priority)
  979. {
  980. if (entity == null)
  981. {
  982. Log.Warning("Entity is invalid.");
  983. return;
  984. }
  985. IEntityGroup entityGroup = entity.EntityGroup;
  986. if (entityGroup == null)
  987. {
  988. Log.Warning("Entity group is invalid.");
  989. return;
  990. }
  991. entityGroup.SetEntityInstancePriority(entity.gameObject, priority);
  992. }
  993. private void OnShowEntitySuccess(object sender, GameFramework.Entity.ShowEntitySuccessEventArgs e)
  994. {
  995. m_EventComponent.Fire(this, ShowEntitySuccessEventArgs.Create(e));
  996. }
  997. private void OnShowEntityFailure(object sender, GameFramework.Entity.ShowEntityFailureEventArgs e)
  998. {
  999. Log.Warning("Show entity failure, entity id '{0}', asset name '{1}', entity group name '{2}', error message '{3}'.", e.EntityId.ToString(), e.EntityAssetName, e.EntityGroupName, e.ErrorMessage);
  1000. m_EventComponent.Fire(this, ShowEntityFailureEventArgs.Create(e));
  1001. }
  1002. private void OnShowEntityUpdate(object sender, GameFramework.Entity.ShowEntityUpdateEventArgs e)
  1003. {
  1004. m_EventComponent.Fire(this, ShowEntityUpdateEventArgs.Create(e));
  1005. }
  1006. private void OnShowEntityDependencyAsset(object sender, GameFramework.Entity.ShowEntityDependencyAssetEventArgs e)
  1007. {
  1008. m_EventComponent.Fire(this, ShowEntityDependencyAssetEventArgs.Create(e));
  1009. }
  1010. private void OnHideEntityComplete(object sender, GameFramework.Entity.HideEntityCompleteEventArgs e)
  1011. {
  1012. m_EventComponent.Fire(this, HideEntityCompleteEventArgs.Create(e));
  1013. }
  1014. }
  1015. }