CombatHeroEntity.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Animancer;
  4. using Common.Utility.CombatEvent;
  5. using Core.Utility;
  6. using Fort23.Common;
  7. using Fort23.Core;
  8. using Fort23.UTool;
  9. using GameLogic.Combat.Buff;
  10. using GameLogic.Combat.CombatTool;
  11. using GameLogic.Combat.CombatTool.CombatReport;
  12. using GameLogic.Combat.Hero;
  13. using GameLogic.Combat.Hero.HeroGPU;
  14. using GameLogic.Player;
  15. using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
  16. using UnityEngine;
  17. using UnityEngine.AI;
  18. using UnityEngine.Rendering;
  19. using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;
  20. public class CombatHeroEntity : ShowBaiscEntity, ITimeLineAnimtion, ITimeLineGetAttSpeed,
  21. IHero
  22. {
  23. /// <summary>
  24. /// 死亡时的节点ID
  25. /// </summary>
  26. public int heroDieNodeId;
  27. public bool isPlayer;
  28. public bool isCreateHeroHp;
  29. public string guidName
  30. {
  31. get { return CurrCombatHeroInfo.modelName; }
  32. }
  33. public bool isFollowState;
  34. private float _injuriedShowTime;
  35. private bool _isAddinjuriedShow;
  36. private float _addInjuiedValue = (1.0f / 0.2f) * 0.3f;
  37. private bool _isDis;
  38. public float DisTime;
  39. public MagicWeaponControl heroMagicWeaponControl;
  40. public float HpBl
  41. {
  42. get { return CurrCombatHeroInfo.hp.Value * 100f / MaxCombatHeroInfo.hp.Value; }
  43. }
  44. public Vector3 dotPos
  45. {
  46. get { return combatHeroGameObject.position; }
  47. }
  48. public T GetThis<T>() where T : IHero
  49. {
  50. return (T)(object)this;
  51. }
  52. public GameObject GameObject
  53. {
  54. get { return combatHeroGameObject.transform.gameObject; }
  55. }
  56. public Vector3 faceDir
  57. {
  58. get { return combatHeroGameObject.transform.forward; }
  59. }
  60. public async CTask<CombatHeroEntity> InitForObject(GameObjectPool poolInterface, CombatAIBasic combatAIBasic,
  61. CombatHeroInfo combatHeroInfo,
  62. Vector3 pos,
  63. System.Action<CombatHeroEntity> callBack = null, bool isPlayer = false)
  64. {
  65. //后面记到检查战斗里面不要出现异步加载,也不要出现同步IO加载
  66. this.isPlayer = isPlayer;
  67. string modelName = combatHeroInfo.modelName;
  68. if (combatHeroInfo.isGpu)
  69. {
  70. modelName += "_gpu";
  71. }
  72. CurrCombatHeroInfo = combatHeroInfo.Copy();
  73. MaxCombatHeroInfo = combatHeroInfo.Copy();
  74. poolInterface.own.transform.position = pos;
  75. // if (!IsEnemy)
  76. // {
  77. // GameObjectPool fx_hero_quan =
  78. // await GObjectPool.Instance.FetchAsync<GameObjectPool>("fx_hero_quan.prefab", null);
  79. // fx_hero_quan.own.transform.SetParent(poolInterface.own.transform);
  80. // fx_hero_quan.own.transform.localPosition = Vector3.zero;
  81. // }
  82. // poolInterface.own.SetActive(false);
  83. heroMagicWeaponControl = new MagicWeaponControl();
  84. combatHeroTimeLineControl = new CombatHeroTimeLineControl();
  85. combatHeroTimeLineControl.Init(this);
  86. AssetHandle assetHandle =
  87. await AssetBundleLoadManager.Instance.LoadAssetAsyncTask<TextAsset>(combatHeroInfo.modelName + "_TD.txt");
  88. if (assetHandle != null)
  89. {
  90. TextAsset textAsset = assetHandle.AssetObject<TextAsset>();
  91. TimeLienData timeLienData = JsonManager.FromJson<TimeLienData>(textAsset.text);
  92. timeLienData.DeserializeData();
  93. assetHandle.Release();
  94. combatHeroTimeLineControl.AddTimeLienData(timeLienData);
  95. }
  96. combatHeroGameObject = new CombatHeroGameObject();
  97. combatHeroGameObject.Init(this, poolInterface);
  98. BuffControl = new BuffControl();
  99. BuffControl.Init(this);
  100. NavMeshAgent navMeshAgent = poolInterface.own.GetComponent<NavMeshAgent>();
  101. if (combatAIBasic == null)
  102. {
  103. combatAIBasic = new CombatAIBasic();
  104. }
  105. HeroEntityMono heroEntityMono = poolInterface.own.GetComponent<HeroEntityMono>();
  106. if (heroEntityMono == null)
  107. {
  108. CombatHeroColliderRoot combatHeroColliderRoot= poolInterface.own.GetComponent<CombatHeroColliderRoot>();
  109. if (combatHeroColliderRoot != null)
  110. {
  111. heroEntityMono = combatHeroColliderRoot.root.GetOrAddComponent<HeroEntityMono>();
  112. }
  113. else
  114. {
  115. heroEntityMono = poolInterface.own.GetOrAddComponent<HeroEntityMono>();
  116. }
  117. }
  118. heroEntityMono.combatHeroEntity = this;
  119. CombatAIBasic = combatAIBasic;
  120. CombatAIBasic.Init(this);
  121. CombatHeroSkillControl = new CombatHeroSkillControl();
  122. await CombatHeroSkillControl.Init(this);
  123. await InitShieldsFx();
  124. AnimancerComponent animancerComponent = poolInterface.own.GetComponent<AnimancerComponent>();
  125. combatHeroAnimtion = new CombatHeroAnimtion();
  126. // if (animancerComponent != null)
  127. {
  128. }
  129. // else
  130. // {
  131. // combatHeroAnimtion = new CombatHeroGPUAnimtion();
  132. // }
  133. poolInterface.own.SetActive(true);
  134. combatHeroAnimtion.Init(this);
  135. CombatAIBasic.ChangeState(CombatHeroStateType.XiuMian);
  136. if (isCreateHeroHp)
  137. {
  138. CreateHeroHpEventData createHeroHpEventData = CreateHeroHpEventData.Create();
  139. createHeroHpEventData.combatHeroEntity = this;
  140. EventManager.Instance.Dispatch(CustomEventType.CreateHeroHp, createHeroHpEventData);
  141. }
  142. await heroMagicWeaponControl.InitMagicWeapon(this, isPlayer);
  143. CombatReportManager.Instance.AddCombatReportInfo(this);
  144. callBack?.Invoke(this);
  145. return this;
  146. }
  147. public virtual async CTask<CombatHeroEntity> Init(CombatAIBasic combatAIBasic, CombatHeroInfo combatHeroInfo,
  148. Vector3 pos,
  149. System.Action<CombatHeroEntity> callBack = null, bool isPlayer = false)
  150. {
  151. //后面记到检查战斗里面不要出现异步加载,也不要出现同步IO加载
  152. this.isPlayer = isPlayer;
  153. string modelName = combatHeroInfo.modelName;
  154. if (combatHeroInfo.isGpu)
  155. {
  156. modelName += "_gpu";
  157. }
  158. CurrCombatHeroInfo = combatHeroInfo.Copy();
  159. MaxCombatHeroInfo = combatHeroInfo.Copy();
  160. // GameTimeLineParticleFactory
  161. CombatHeroGameObjectPool poolInterface =
  162. await GObjectPool.Instance.FetchAsync<CombatHeroGameObjectPool>(modelName + ".prefab", null);
  163. if (poolInterface == null || poolInterface.own == null)
  164. {
  165. return null;
  166. }
  167. return await InitForObject(poolInterface, combatAIBasic, combatHeroInfo, pos, callBack, isPlayer);
  168. }
  169. public virtual void Update(float t)
  170. {
  171. CombatAIBasic.Update(t);
  172. CombatHeroSkillControl.Update(t);
  173. combatHeroTimeLineControl.Update(t);
  174. combatHeroAnimtion.Update(t);
  175. combatHeroGameObject.Update(t);
  176. BuffControl.Update(t);
  177. heroMagicWeaponControl?.Update(t);
  178. if (combatHeroGameObject.HeroGPUMono != null)
  179. {
  180. if (_injuriedShowTime > 0)
  181. {
  182. _injuriedShowTime -= t;
  183. if (_isAddinjuriedShow)
  184. {
  185. combatHeroGameObject.HeroGPUMono.injuriedStrength += t * (_addInjuiedValue);
  186. if (combatHeroGameObject.HeroGPUMono.injuriedStrength >= 0.3f)
  187. {
  188. _isAddinjuriedShow = false;
  189. }
  190. }
  191. else
  192. {
  193. combatHeroGameObject.HeroGPUMono.injuriedStrength -= t * (_addInjuiedValue);
  194. if (combatHeroGameObject.HeroGPUMono.injuriedStrength < 0)
  195. {
  196. combatHeroGameObject.HeroGPUMono.injuriedStrength = 0;
  197. }
  198. }
  199. }
  200. else
  201. {
  202. combatHeroGameObject.HeroGPUMono.injuriedStrength = 0;
  203. }
  204. }
  205. }
  206. public T This<T>()
  207. {
  208. return (T)(object)this;
  209. }
  210. public override T GetILifetCycleHitPoint<T>(string hitPoinName, bool isStandType, bool isIgnoreHind)
  211. {
  212. return combatHeroGameObject.GetILifetCycleHitPoint<T>(hitPoinName, isStandType, isIgnoreHind);
  213. }
  214. public override T GetMainHotPoin<T>(bool isIgnoreHind = false)
  215. {
  216. return combatHeroGameObject.GetMainHotPoin<T>(isIgnoreHind);
  217. }
  218. public void PlayAnim(string animName, bool isLoop, int layerId, bool repeat, float speed)
  219. {
  220. combatHeroAnimtion.Play(animName, speed);
  221. }
  222. public SpecialDotInfo GetSpecialDotInfo(string specialDotName)
  223. {
  224. return combatHeroGameObject.GetMainHotPoin<CombatHeroHitPoint>(true).GetSpecialDotInfo(specialDotName);
  225. }
  226. public virtual float GetAttSpeed()
  227. {
  228. // CombatHeroSkillControl combatHeroSkillControl = CombatHeroSkillControl as CombatHeroSkillControl;
  229. // if (combatHeroSkillControl != null)
  230. // {
  231. // if (combatHeroSkillControl.useSkillCount > 1)
  232. // {
  233. // return 4;
  234. // }
  235. //
  236. // return CurrCombatHeroInfo.GetAnimationSpeed;
  237. // }
  238. return 1;
  239. }
  240. public void HeroResurrection()
  241. {
  242. isDie = false;
  243. CombatAIBasic.ChangeState(CombatHeroStateType.idle, isQiangZhi: true);
  244. HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();
  245. heroHpUpdateEventData.combatHeroEntity = this;
  246. CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);
  247. HeroResurrectionEventData heroResurrectionEventData = HeroResurrectionEventData.Create();
  248. heroResurrectionEventData.combatHeroEntity = this;
  249. CombatEventManager.Instance.Dispatch(CombatEventType.HeroResurrection, heroResurrectionEventData);
  250. }
  251. public void HeroDie(HarmReturnInfo harmReturnInfo)
  252. {
  253. heroDieNodeId = CombatController.currActiveCombat.CombatTypeBasic.allWinNodeCount;
  254. isDie = true;
  255. HeroDieEventData heroDieEventData = HeroDieEventData.Create();
  256. heroDieEventData.combatHeroEntity = this;
  257. heroDieEventData.HarmReturnInfo = harmReturnInfo;
  258. CombatEventManager.Instance.Dispatch(CombatEventType.HeroDie, heroDieEventData);
  259. combatHeroGameObject.HeroDie();
  260. CombatAIBasic.ChangeState(CombatHeroStateType.dile);
  261. CombatEventManager.Instance.Dispatch(CombatEventType.HeroDieFinish, heroDieEventData);
  262. }
  263. /// <summary>
  264. /// 是否被控制
  265. /// </summary>
  266. /// <returns></returns>
  267. public bool IsControl()
  268. {
  269. BuffBasic basic = BuffControl.GetBuffBasicForIdGroup(1006);
  270. if (basic != null)
  271. {
  272. return true;
  273. }
  274. b_1025 b1025 = BuffControl.GetBuffBasicForType<b_1025>();
  275. if (b1025 != null)
  276. {
  277. return true;
  278. }
  279. return false;
  280. }
  281. /// <summary>
  282. /// 是否不能添加功法
  283. /// </summary>
  284. /// <returns></returns>
  285. public bool IsCantAddGongFa()
  286. {
  287. BuffBasic basic = BuffControl.GetBuffBasicForIdGroup(1006);
  288. if (basic != null)
  289. {
  290. return false;
  291. }
  292. return true;
  293. }
  294. public void HeroHurt(HarmReturnInfo harmReturnInfo)
  295. {
  296. if (isDie)
  297. {
  298. return;
  299. }
  300. b_1015 b1015 = BuffControl.GetBuffBasicForType<b_1015>();
  301. if (b1015 != null)
  302. {
  303. return;
  304. }
  305. long att = harmReturnInfo.att;
  306. IBarrier shieldsBarrier = harmReturnInfo.triggerData.IBarrier as IBarrier;
  307. if (shieldsBarrier != null)
  308. {
  309. att = shieldsBarrier.Harm(harmReturnInfo);
  310. harmReturnInfo.harmType |= HarmType.Shields;
  311. }
  312. else
  313. {
  314. harmReturnInfo.isHitHero = true;
  315. }
  316. if (att > 0)
  317. {
  318. CurrCombatHeroInfo.hp -= att;
  319. }
  320. if (isZhanZhuang)
  321. {
  322. CurrCombatHeroInfo.hp = MaxCombatHeroInfo.hp;
  323. }
  324. UpdateHarmText(harmReturnInfo);
  325. if (combatHeroGameObject.HeroGPUMono != null)
  326. {
  327. _injuriedShowTime = 0.4f;
  328. combatHeroGameObject.HeroGPUMono.injuriedStrength = 0;
  329. _isAddinjuriedShow = true;
  330. }
  331. HeroInjuredEventData heroInjured = HeroInjuredEventData.Create();
  332. heroInjured.HarmReturnInfo = harmReturnInfo;
  333. CombatEventManager.Instance.Dispatch(CombatEventType.HeroInjured, heroInjured);
  334. HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();
  335. heroHpUpdateEventData.combatHeroEntity = this;
  336. CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);
  337. if (CurrCombatHeroInfo.hp <= 0)
  338. {
  339. HeroDie(harmReturnInfo);
  340. }
  341. }
  342. private void UpdateHarmText(HarmReturnInfo harmReturnInfo)
  343. {
  344. // float currTime = Time.time;
  345. // // if (currTime - _lasetShowHarmTime < 0.1f)
  346. // // {
  347. // // return;
  348. // // }
  349. // _lasetShowHarmTime = currTime;
  350. HarmUpdateEventData harmUpdateEventData = HarmUpdateEventData.Create();
  351. harmUpdateEventData.HarmReturnInfo = harmReturnInfo;
  352. CombatEventManager.Instance.Dispatch(CombatEventType.HarmUpdate, harmUpdateEventData);
  353. }
  354. public void Recover(HarmReturnInfo harmReturnInfo)
  355. {
  356. CurrCombatHeroInfo.hp += harmReturnInfo.att;
  357. if (CurrCombatHeroInfo.hp > MaxCombatHeroInfo.hp)
  358. {
  359. CurrCombatHeroInfo.hp = MaxCombatHeroInfo.hp;
  360. }
  361. HarmUpdateEventData harmUpdateEventData = HarmUpdateEventData.Create();
  362. harmUpdateEventData.HarmReturnInfo = harmReturnInfo;
  363. CombatEventManager.Instance.Dispatch(CombatEventType.RecoverUpdate, harmUpdateEventData);
  364. HeroHpUpdateEventData heroHpUpdateEventData = HeroHpUpdateEventData.Create();
  365. heroHpUpdateEventData.combatHeroEntity = this;
  366. CombatEventManager.Instance.Dispatch(CombatEventType.HeroHpUpdate, heroHpUpdateEventData);
  367. }
  368. public void CloseLoopFx()
  369. {
  370. for (int i = 0; i < heroLoopParticle.Count; i++)
  371. {
  372. GObjectPool.Instance.Recycle(heroLoopParticle[i]);
  373. }
  374. heroLoopParticle.Clear();
  375. }
  376. public void DisposeForOnetCombat()
  377. {
  378. if (_isDis)
  379. {
  380. return;
  381. }
  382. _isDis = true;
  383. BuffControl.Dispose();
  384. _isDis = true;
  385. CombatHeroSkillControl.Dispose();
  386. CombatAIBasic.Dispose();
  387. combatHeroTimeLineControl.Dispose();
  388. combatHeroAnimtion.Dispose();
  389. CloseLoopFx();
  390. ShieldsBarrier?.Dispose();
  391. ShieldsBarrier = null;
  392. }
  393. public void Dispose()
  394. {
  395. if (_isDis)
  396. {
  397. return;
  398. }
  399. _isDis = true;
  400. BuffControl.Dispose();
  401. combatHeroGameObject.Dispose();
  402. isDie = true;
  403. CombatHeroSkillControl.Dispose();
  404. CombatAIBasic.Dispose();
  405. combatHeroTimeLineControl.Dispose();
  406. combatHeroAnimtion.Dispose();
  407. CloseLoopFx();
  408. ShieldsBarrier?.Dispose();
  409. ShieldsBarrier = null;
  410. }
  411. private void ProDormancyObj()
  412. {
  413. CombatHeroSkillControl.ProDormancyObj();
  414. }
  415. public override void ActiveObj()
  416. {
  417. isDie = false;
  418. _isDis = false;
  419. }
  420. public override void DormancyObj()
  421. {
  422. Dispose();
  423. ProDormancyObj();
  424. _isDis = false;
  425. CombatAIBasic = null;
  426. combatHeroGameObject = null;
  427. CurrCombatHeroInfo = null;
  428. MaxCombatHeroInfo = null;
  429. combatHeroTimeLineControl = null;
  430. combatHeroAnimtion = null;
  431. CombatHeroSkillControl = null;
  432. isFollowState = false;
  433. heroLoopParticle.Clear();
  434. isDie = true;
  435. }
  436. }