EntityComponent.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  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. }