FighterGoCtrl.cs 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System;
  5. using UnityEngine.AI;
  6. public class UIFixWordInfo
  7. {
  8. public int x;
  9. public int y;
  10. public int randomX;
  11. public int randomY;
  12. public UIFixWordInfo (int vx, int vy, int vRandomX, int vRandomY)
  13. {
  14. x = vx;
  15. y = vy;
  16. randomX = vRandomX;
  17. randomY = vRandomY;
  18. }
  19. }
  20. public struct UIEventParamFighterHurt
  21. {
  22. public Fighter mCaster;
  23. public Fighter mTarget;
  24. public int mHurtVal;
  25. public bool mIsCrit;
  26. public int mMultiSkillNum;
  27. public float mMultiKillInterval;
  28. public int mAttackSeq;
  29. public int mSkillId;
  30. public int mBuffId;
  31. public int mHurtByType;
  32. public int mLastDamage;
  33. // -1 未知, 0-5 技能类型 Id, 6 buff
  34. public UIEventParamFighterHurt (Fighter caster, Fighter target,
  35. int hurtVal, bool isCrit, int hurtByType,int isMultiSkill,float killInterval,int seq,
  36. int skillId,int buffId,int lastDamage)
  37. {
  38. mCaster = caster;
  39. mTarget = target;
  40. mHurtVal = hurtVal;
  41. mIsCrit = isCrit;
  42. mMultiKillInterval = killInterval;
  43. mMultiSkillNum = isMultiSkill;
  44. mAttackSeq = seq;
  45. mHurtByType = hurtByType;
  46. mSkillId = skillId;
  47. mBuffId = buffId;
  48. mLastDamage = lastDamage;
  49. }
  50. }
  51. public class FighterGoCtrl : MonoBehaviour
  52. {
  53. const string no_hit_sound = "none";
  54. GameObject mAvatarObject;
  55. bool mIsMirror = false;
  56. bool mIsLoading = false;
  57. bool mIsLoaded = false;
  58. BeHitColorChange mBeHitColorChange;
  59. FighterScaleInfo mFighterScaleInfo;
  60. Gray mGrayChange;
  61. Stiff mStiffCom;
  62. RimColor mRimColor;
  63. int mHitCommonEffectFlag = 0;
  64. int shadowEffectInstanceId = 0;
  65. int runsmokeEffectInstanceId = 0;
  66. int selfEffectInstanceId = 0; //主角光环特效
  67. int bornEffectInstanceId = 0;
  68. bool mInSpecular = false;
  69. Dictionary<BodyPart, GameObject> mPartGoes = null;
  70. NavMeshAgent navAgent;
  71. #region property
  72. public Fighter Fighter { get; set; }
  73. private Animator mAnimator = null;
  74. public Animator Animator { get { return mAnimator; } }
  75. public bool IsLoaded { get { return mIsLoaded; } }
  76. public bool IsVisible {
  77. get { return mAvatarObject != null && mAvatarObject.activeInHierarchy; }
  78. set {
  79. if (mAvatarObject != null && mAvatarObject.activeInHierarchy != value) {
  80. mAvatarObject.SetActive(value);
  81. OnVisibleChanged();
  82. }
  83. }
  84. }
  85. public bool IsMirror {
  86. get { return mIsMirror; }
  87. set {
  88. if (mIsMirror != value) {
  89. mIsMirror = value;
  90. }
  91. }
  92. }
  93. #endregion //property
  94. #region monobehavior
  95. void Start()
  96. {
  97. }
  98. void OnEnable()
  99. {
  100. if (Fighter != null)
  101. {
  102. DebugHelper.LogError("OnEnable:" + Fighter.Name);
  103. Fighter.ForceSync(transform);
  104. }
  105. }
  106. void OnDestroy()
  107. {
  108. if (Fighter != null)
  109. Fighter.OnGoDestroy();
  110. Fighter = null;
  111. mAvatarObject = null;
  112. if (mBeHitColorChange != null)
  113. {
  114. GameObject.DestroyImmediate(mBeHitColorChange);
  115. mBeHitColorChange = null;
  116. }
  117. mFighterScaleInfo = null;
  118. if (mGrayChange != null)
  119. GameObject.DestroyImmediate(mGrayChange);
  120. mGrayChange = null;
  121. if (mRimColor != null)
  122. GameObject.DestroyImmediate(mRimColor);
  123. mRimColor = null;
  124. if (mStiffCom != null)
  125. GameObject.DestroyImmediate(mStiffCom);
  126. mStiffCom = null;
  127. }
  128. void Update()
  129. {
  130. if (null == Fighter)
  131. return;
  132. if (!Fighter.IsSpawned || Fighter.IsDisposed)
  133. return;
  134. if (!IsVisible)
  135. return;
  136. if (Fighter.IsNavRun)
  137. Fighter.SetPosition(transform.position);
  138. else //if (Fighter.IsRun)
  139. UpdateCurrentPos(Time.deltaTime);
  140. }
  141. #endregion
  142. #region event_callbacks
  143. public void OnSpawned()
  144. {
  145. IsVisible = true;
  146. ShowShadow();
  147. if (Fighter.BornEffectId > 0)
  148. bornEffectInstanceId = EffectManager.Instance.PlayEffect(Fighter.BornEffectId, Fighter, Fighter);
  149. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_SPAWN, Fighter));
  150. }
  151. public void OnRelive()
  152. {
  153. int reliveEffectId = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_relive_effectid);
  154. if (reliveEffectId > 0)
  155. EffectManager.Instance.PlayEffect(reliveEffectId, Fighter, Fighter);
  156. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_RELIVE, Fighter));
  157. }
  158. public void OnEnterTransfer()
  159. {
  160. int effectId = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_enter_transfer_effectId);
  161. if (effectId > 0)
  162. EffectManager.Instance.PlayEffect(effectId, Fighter, Fighter);
  163. }
  164. public void OnExitTransfer()
  165. {
  166. int effectId = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_exit_transfer_effectId);
  167. if (effectId > 0)
  168. EffectManager.Instance.PlayEffect(effectId, Fighter, Fighter);
  169. }
  170. Fadeout fadeout = null;
  171. public void FadeOut(float time)
  172. {
  173. if (mAvatarObject == null) return;
  174. //if (DeviceInfo.IsGoodDevice)
  175. //{
  176. // fadeout = mAvatarObject.AddComponent<Fadeout>();
  177. // fadeout.time = time;
  178. //}
  179. HideShadow();
  180. }
  181. public void OnDie()
  182. {
  183. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_DIE, Fighter));
  184. }
  185. public void OnLifeChanged()
  186. {
  187. }
  188. public void OnManaChanged()
  189. {
  190. }
  191. public void OnRageChanged()
  192. {
  193. }
  194. public void OnBeHit(SkillHitFighterInfo hitInfo, int seq)
  195. {
  196. if (hitInfo.IsImmunity)
  197. {
  198. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_IMMUNITY, Fighter));
  199. }
  200. else if (hitInfo.IsDodge || hitInfo.IsPerfectDodge)
  201. {
  202. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_DODGE, Fighter));
  203. EventMgr.DispatchEvent<Fighter,BaseSkill>(new CoreEvent<Fighter,BaseSkill>(ECoreEventType.EID_Fighter_Damage_Avoid, hitInfo.Caster,hitInfo.Skill));
  204. }
  205. else if (hitInfo.Damage > 0)
  206. {
  207. DoBeHitEffect(hitInfo.AttackInfo.hitEffect, hitInfo.Caster);
  208. DoBeHitColor();
  209. }
  210. }
  211. public void OnDisposed(bool destroyImmediatly = false)
  212. {
  213. if (Fighter.IsHero && mPartGoes != null)
  214. {
  215. RecyclePartGo();
  216. if (mAvatarObject != null)
  217. {
  218. GameObject.Destroy(mAvatarObject);
  219. mAvatarObject = null;
  220. }
  221. }
  222. else
  223. {
  224. if (mAvatarObject != null)
  225. {
  226. if (!Fighter.IsMainRole || BattleMgr.Instance.RoleModelGo == null)
  227. {
  228. ResourceMgr.Instance.RecycleGO(Constants.ModelPath, Fighter.Actor.AvatarData.prefab, mAvatarObject);
  229. if (fadeout != null)
  230. {
  231. fadeout.Reset();
  232. GameObject.DestroyImmediate(fadeout);
  233. fadeout = null;
  234. }
  235. }
  236. mAvatarObject = null;
  237. }
  238. }
  239. mIsLoaded = false;
  240. if (bornEffectInstanceId > 0)
  241. EffectManager.Instance.RemoveEffectByInstanceID(bornEffectInstanceId);
  242. bornEffectInstanceId = 0;
  243. HideShadow();
  244. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_DISPOSE, Fighter));
  245. }
  246. private void RecyclePartGo()
  247. {
  248. if (mPartGoes == null) return;
  249. HeroActorData hero = Fighter.Actor as HeroActorData;
  250. foreach (var p in mPartGoes)
  251. {
  252. GameObject.Destroy(p.Value);
  253. }
  254. mPartGoes.Clear();
  255. }
  256. public void OnRotationChanged(Quaternion rot)
  257. {
  258. this.transform.rotation = rot;
  259. }
  260. public void OnForwardChanged()
  261. {
  262. if (Fighter.LocalForward.FEqual(Vector3.zero)) return;
  263. if (!this.transform.forward.FEqual(Fighter.LocalForward))
  264. {
  265. this.transform.forward = Fighter.LocalForward;
  266. }
  267. }
  268. private CoreEvent<CastSkillData> castSkillCE = null;
  269. public void OnEnterSkill(BaseSkill skill)
  270. {
  271. if (skill == null)
  272. return;
  273. if (Fighter.IsPlayer || Fighter.IsBoss)
  274. {
  275. if (!skill.IsNormalAttack)
  276. {
  277. CastSkillData skillParam = Fighter.CastSkill;
  278. if (skillParam != null)
  279. {
  280. skillParam.isBoss = Fighter.IsBoss;
  281. skillParam.actorId = Fighter.Actor.ID;
  282. skillParam.teamSide = (int)Fighter.TeamSide;
  283. skillParam.skillId = skill.Id;
  284. skillParam.skillIcon = skill.SkillDataInfo.skillIcon;
  285. skillParam.cdTime = 0;
  286. skillParam.IsCasting = true;
  287. skillParam.IsForbidden = false;
  288. skillParam.IsEnhance = skill.IsEnhance;
  289. if (castSkillCE == null)
  290. {
  291. castSkillCE = new CoreEvent<CastSkillData>(ECoreEventType.EID_Refresh_Skill, skillParam);
  292. }
  293. else
  294. {
  295. castSkillCE.SetData(skillParam);
  296. }
  297. EventMgr.DispatchEvent<CastSkillData>(castSkillCE);
  298. }
  299. }
  300. }
  301. }
  302. public void OnLeaveSkill(BaseSkill skill)
  303. {
  304. if (Fighter.IsPlayer || Fighter.IsBoss)
  305. {
  306. if (!skill.IsNormalAttack)
  307. {
  308. CastSkillData skillParam = Fighter.CastSkill;
  309. if (skillParam != null && Fighter.AI != null)
  310. {
  311. BaseSkill nextSkill = Fighter.GetSkill(Fighter.AI.NextSelectAttack);
  312. Fighter.CheckSkillEnhance(nextSkill, true);
  313. skillParam.isBoss = Fighter.IsBoss;
  314. skillParam.skillId = nextSkill.Id;
  315. skillParam.actorId = Fighter.Actor.ID;
  316. skillParam.teamSide = (int)Fighter.TeamSide;
  317. skillParam.skillIcon = nextSkill.SkillDataInfo.skillIcon;
  318. skillParam.cdTime = nextSkill.SkillDataInfo.cd;
  319. skillParam.IsCasting = false;
  320. skillParam.IsEnhance = nextSkill.IsEnhance;
  321. skillParam.IsForbidden = Fighter.FuncMgr.HaveForbidSkillFunc();
  322. castSkillCE.SetData(skillParam);
  323. EventMgr.DispatchEvent<CastSkillData>(castSkillCE);
  324. }
  325. }
  326. }
  327. }
  328. public void OnFightingStart(BaseSkill skill)
  329. {
  330. if (Fighter.IsPlayer || Fighter.IsBoss)
  331. {
  332. if (!skill.IsNormalAttack)
  333. {
  334. CastSkillData skillParam = Fighter.CastSkill;
  335. if (skillParam != null)
  336. {
  337. skillParam.isBoss = Fighter.IsBoss;
  338. skillParam.skillId = skill.Id;
  339. skillParam.actorId = Fighter.Actor.ID;
  340. skillParam.teamSide = (int)Fighter.TeamSide;
  341. skillParam.skillIcon = skill.SkillDataInfo.skillIcon;
  342. skillParam.cdTime = skill.SkillDataInfo.cd;
  343. skillParam.IsCasting = false;
  344. skillParam.IsEnhance = skill.IsEnhance;
  345. skillParam.IsForbidden = false;
  346. if (castSkillCE == null)
  347. {
  348. castSkillCE = new CoreEvent<CastSkillData>(ECoreEventType.EID_Refresh_Skill, skillParam);
  349. }
  350. else
  351. {
  352. castSkillCE.SetData(skillParam);
  353. }
  354. EventMgr.DispatchEvent<CastSkillData>(castSkillCE);
  355. }
  356. }
  357. }
  358. }
  359. bool mInStiff = false;
  360. public void ProcessStiff(bool stiff)
  361. {
  362. if (mInStiff) return;
  363. if(mAvatarObject != null)
  364. {
  365. if(mStiffCom == null)
  366. {
  367. mStiffCom = mAvatarObject.GetComponent<Stiff>();
  368. if (mStiffCom == null)
  369. mStiffCom = mAvatarObject.AddComponent<Stiff>();
  370. }
  371. mStiffCom.SetStiff(stiff);
  372. }
  373. }
  374. public void ProcessVertigo(bool grey)
  375. {
  376. if (mInSpecular) return;
  377. if (mAvatarObject != null)
  378. {
  379. if (mGrayChange == null) {
  380. mGrayChange = mAvatarObject.GetComponent<Gray>();
  381. if (mGrayChange == null)
  382. mGrayChange = mAvatarObject.AddComponent<Gray>();
  383. }
  384. mGrayChange.SetGrey(grey);
  385. }
  386. }
  387. public void ProcesssSpecularColor(bool add, Color clr)
  388. {
  389. if (mAvatarObject != null)
  390. {
  391. mInSpecular = add;
  392. if (mBeHitColorChange != null)
  393. mBeHitColorChange.enabled = false;
  394. if (mRimColor == null) {
  395. mRimColor = mAvatarObject.GetComponent<RimColor>();
  396. if (mRimColor == null)
  397. mRimColor = mAvatarObject.AddComponent<RimColor>();
  398. }
  399. mRimColor.SetRimColor(add, clr);
  400. }
  401. }
  402. #endregion //event_callbacks
  403. #region public_methods
  404. public Vector3 GetChildRelativePosition(string name)
  405. {
  406. Transform t = UnityEngineUtils.RecurisiveFindTransformChild(transform, name);
  407. if (t != null && t != transform)
  408. return transform.InverseTransformPoint(t.position);
  409. return Vector3.zero;
  410. }
  411. public void SwitchNode(string childNodeName, int frameCount, bool show)
  412. {
  413. if (mAvatarObject == null)
  414. return;
  415. }
  416. public void StartScale(float intime, float scale, float time, float outtime)
  417. {
  418. Fighter.SetScale(scale);
  419. if (mFighterScaleInfo == null)
  420. mFighterScaleInfo = gameObject.AddComponent<FighterScaleInfo>();
  421. if (mFighterScaleInfo.enabled)
  422. mFighterScaleInfo.enabled = false;
  423. mFighterScaleInfo.fadeInTime = intime;
  424. mFighterScaleInfo.fadeOutTime = outtime;
  425. mFighterScaleInfo.scaleValue = scale;
  426. mFighterScaleInfo.continueTime = time;
  427. mFighterScaleInfo.enabled = true;
  428. }
  429. #endregion //public_methods
  430. public void ParseLoad()
  431. {
  432. if (IsLoaded || Fighter == null)
  433. return;
  434. if (Fighter.IsHero)
  435. {
  436. HeroActorData heroActorData = Fighter.Actor as HeroActorData;
  437. if (null != heroActorData && heroActorData.PartResList != null)
  438. {
  439. foreach (var p in heroActorData.PartResList)
  440. {
  441. BattlePrepareManager.Instance.PrecacheModel(p.Value, Fighter.Actor.AType);
  442. }
  443. BattlePrepareManager.Instance.PrecacheAnimatorCtrl(heroActorData.AnimCtrlName);
  444. }
  445. else
  446. {
  447. if (!string.IsNullOrEmpty(Fighter.Actor.AvatarData.prefab))
  448. {
  449. BattlePrepareManager.Instance.PrecacheModel(Fighter.Actor.AvatarData.prefab, Fighter.Actor.AType);
  450. }
  451. }
  452. }
  453. else
  454. {
  455. if (!string.IsNullOrEmpty(Fighter.Actor.AvatarData.prefab))
  456. {
  457. BattlePrepareManager.Instance.PrecacheModel(Fighter.Actor.AvatarData.prefab, Fighter.Actor.AType);
  458. }
  459. if (Fighter.IsFellow || Fighter.IsPet)
  460. {
  461. BattlePrepareManager.Instance.PrecacheAnimatorCtrl(Fighter.Actor.AnimCtrlName);
  462. }
  463. }
  464. if(Fighter.BornEffectId > 0)
  465. {
  466. BattlePrepareManager.Instance.PrecacheEffect(Fighter.BornEffectId);
  467. }
  468. }
  469. bool mPrefabLoaded = false;
  470. bool mAnimCtrlLoaded = false;
  471. public void AsyncLoad()
  472. {
  473. if (IsLoaded || Fighter == null)
  474. return;
  475. if (Fighter.IsHero && (!Fighter.IsPetHero))
  476. {
  477. mPrefabLoaded = false;
  478. mAnimCtrlLoaded = false;
  479. HeroActorData heroActorData = Fighter.Actor as HeroActorData;
  480. if (null != heroActorData && heroActorData.PartResList != null)
  481. {
  482. List<string> loadAssets = new List<string>(heroActorData.PartResList.Count);
  483. foreach (var p in heroActorData.PartResList)
  484. {
  485. loadAssets.Add(p.Value);
  486. }
  487. ResourceMgr.Instance.LoadAsset<List<GameObject>>(OnHeroPartLoaded, Constants.ModelPath, loadAssets.ToArray());
  488. ResourceMgr.Instance.LoadAsset<RuntimeAnimatorController>(OnHeroAnimCtrlLoaded, Constants.AnimatorPath, heroActorData.AnimCtrlName);
  489. }
  490. else
  491. {
  492. if (!string.IsNullOrEmpty(Fighter.Actor.AvatarData.prefab))
  493. {
  494. BattlePrepareManager.Instance.PrecacheModel(Fighter.Actor.AvatarData.prefab, Fighter.Actor.AType);
  495. }
  496. }
  497. }
  498. else
  499. {
  500. mPrefabLoaded = false;
  501. mAnimCtrlLoaded = (Fighter.IsFellow || Fighter.IsPet || Fighter.IsPetHero) ? false : true;
  502. ResourceMgr.Instance.GetGOFromPool(Constants.ModelPath, Fighter.Actor.AvatarData.prefab, OnAsyncLoaded);
  503. if (Fighter.IsFellow || Fighter.IsPet || Fighter.IsPetHero)
  504. {
  505. ResourceMgr.Instance.LoadAsset<RuntimeAnimatorController>(OnPartAnimCtrlLoaded, Constants.AnimatorPath, Fighter.Actor.AnimCtrlName);
  506. }
  507. }
  508. }
  509. void OnHeroPartLoaded(List<GameObject> partPrefabs, string assetPath, string[] assetNames)
  510. {
  511. mPrefabLoaded = true;
  512. if (mPrefabLoaded && mAnimCtrlLoaded)
  513. {
  514. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_ASYNC_LOADED, Fighter));
  515. }
  516. }
  517. void OnHeroAnimCtrlLoaded(RuntimeAnimatorController ctrl, string assetPath, string[] assetNames)
  518. {
  519. mAnimCtrlLoaded = true;
  520. if (mPrefabLoaded && mAnimCtrlLoaded)
  521. {
  522. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_ASYNC_LOADED, Fighter));
  523. }
  524. }
  525. void OnPartAnimCtrlLoaded(RuntimeAnimatorController ctrl, string assetPath, string[] assetNames)
  526. {
  527. mAnimCtrlLoaded = true;
  528. if (mPrefabLoaded && mAnimCtrlLoaded)
  529. {
  530. SetAvatarAnimCtrl();
  531. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_ASYNC_LOADED, Fighter));
  532. }
  533. }
  534. void OnAsyncLoaded(GameObject go)
  535. {
  536. mPrefabLoaded = true;
  537. OnAvatarLoaded(go, Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  538. if (mPrefabLoaded && mAnimCtrlLoaded)
  539. {
  540. SetAvatarAnimCtrl();
  541. EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_FIGHTER_ASYNC_LOADED, Fighter));
  542. }
  543. }
  544. public void Load()
  545. {
  546. if (IsLoaded || Fighter == null)
  547. return;
  548. if (Fighter.IsMainRole && BattleMgr.Instance.RoleModelGo != null)
  549. {
  550. OnAvatarLoaded(BattleMgr.Instance.RoleModelGo, Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  551. }
  552. else
  553. {
  554. if (Fighter.IsHero)
  555. {
  556. HeroActorData data = Fighter.Actor as HeroActorData;
  557. if (null != data && data.PartResList != null && data.PartResList.Count > 0)
  558. {
  559. mPartGoes = new Dictionary<BodyPart, GameObject>();
  560. foreach (var p in data.PartResList)
  561. {
  562. LoadBodyPartGo(p.Key, p.Value);
  563. }
  564. InitAvatar();
  565. }
  566. else
  567. {
  568. GameObject go = ResourceMgr.Instance.GetGoFromPool(Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  569. OnAvatarLoaded(go, Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  570. }
  571. }
  572. else
  573. {
  574. GameObject go = ResourceMgr.Instance.GetGoFromPool(Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  575. OnAvatarLoaded(go, Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  576. SetAvatarAnimCtrl();
  577. }
  578. }
  579. }
  580. private void LoadBodyPartGo(BodyPart part, string prefabName)
  581. {
  582. if (string.IsNullOrEmpty(prefabName) || mPartGoes.ContainsKey(part)) return;
  583. GameObject go = ResourceMgr.Instance.GetGoFromPool(Constants.ModelPath, prefabName);
  584. if (go != null)
  585. {
  586. mPartGoes.Add(part, go);
  587. go.layer = Fighter.Layer;
  588. }
  589. }
  590. private void InitAvatar()
  591. {
  592. GameObject skeletonGo = mPartGoes[BodyPart.Skeleton];
  593. if (skeletonGo == null)
  594. {
  595. DebugHelper.LogError(string.Format("{0}的基础骨骼加载失败!", Fighter.Name));
  596. return;
  597. }
  598. foreach (var p in mPartGoes)
  599. {
  600. BodyPart part = p.Key;
  601. if (part == BodyPart.Skeleton) continue;
  602. if (part == BodyPart.Hair)
  603. {
  604. HeroActorData hero = Fighter.Actor as HeroActorData;
  605. ChangeHairColor(mPartGoes[part], hero.FashionData.hairClrParam);
  606. }
  607. if (part == BodyPart.Face || part == BodyPart.HairStyle
  608. || part == BodyPart.Pupil || part == BodyPart.Eye
  609. || part == BodyPart.Hair || part == BodyPart.Cloth)
  610. {
  611. ResetMeshBones(skeletonGo, part);
  612. }
  613. else
  614. {
  615. LinkPart(skeletonGo, part);
  616. }
  617. }
  618. UnityEngine.Object asset = ResourceMgr.Instance.GetAsset(Constants.AnimatorPath, Fighter.Actor.AnimCtrlName);
  619. if (asset != null)
  620. {
  621. Animator skeletonAnimator = skeletonGo.GetComponent<Animator>();
  622. if (skeletonAnimator != null)
  623. skeletonAnimator.runtimeAnimatorController = asset as RuntimeAnimatorController;
  624. }
  625. OnAvatarLoaded(skeletonGo, Constants.ModelPath, Fighter.Actor.AvatarData.prefab);
  626. }
  627. private void ResetMeshBones(GameObject skeleton, BodyPart part)
  628. {
  629. if (!mPartGoes.ContainsKey(part)) return;
  630. GameObject src = mPartGoes[part];
  631. if (src == null) return;
  632. string tmpName = string.Empty;
  633. string tmpName2 = string.Empty;
  634. string srcName = src.name;
  635. SkinnedMeshRenderer[] smrs = src.GetComponentsInChildren<SkinnedMeshRenderer>(true);
  636. if (smrs.Length > 0)
  637. {
  638. for (int i = 0; i < smrs.Length; ++i)
  639. {
  640. Transform smrsparent = smrs[i].transform.parent;
  641. tmpName = smrsparent.name;
  642. if (tmpName.Equals(srcName))
  643. {
  644. Transform[] bones = smrs[i].bones;
  645. int bonesCount = bones.Length;
  646. Transform[] newbones = new Transform[bonesCount];
  647. for (int j = 0; j < bonesCount; ++j)
  648. {
  649. string path = UnityEngineUtils.GetParentPath(bones[j], src.transform);
  650. newbones[j] = skeleton.transform.Find(path);
  651. }
  652. string path2 = UnityEngineUtils.GetParentPath(smrs[i].rootBone, src.transform);
  653. Transform tr = skeleton.transform.Find(path2);
  654. smrs[i].bones = newbones;
  655. smrs[i].rootBone = tr;
  656. smrs[i].transform.SetParentNormalize(skeleton.transform);
  657. }
  658. }
  659. }
  660. }
  661. private void LinkPart(GameObject skeleton, BodyPart part)
  662. {
  663. if (!mPartGoes.ContainsKey(part)) return;
  664. GameObject src = mPartGoes[part];
  665. if (src == null) return;
  666. HeroActorData hero = Fighter.Actor as HeroActorData;
  667. BodyPartParam partParam = hero.GetBodyPartParam(part);
  668. if (string.IsNullOrEmpty(partParam.linkPoint)) return;
  669. Transform partTrans = src.transform;
  670. string linkPoint = partParam.linkPoint;
  671. Transform linkTrans = UnityEngineUtils.RecurisiveFindTransformChild(skeleton.transform, linkPoint);
  672. if (linkTrans == null) return;
  673. partTrans.SetParent(linkTrans);
  674. partTrans.localPosition = partParam.pos;
  675. partTrans.localRotation = Quaternion.Euler(partParam.rot);
  676. partTrans.localScale = partParam.scale;
  677. }
  678. void ChangeHairColor(GameObject go, HairColorParam colorParam)
  679. {
  680. SkinnedMeshRenderer smr = go.GetComponentInChildren<SkinnedMeshRenderer>();
  681. if (smr == null) return;
  682. Material mat = smr.material;
  683. if (mat == null) return;
  684. mat.SetTextureOffset("_MainTex", colorParam.uvOffset);
  685. }
  686. void OnAvatarLoaded(GameObject go, string path, params string[] assetName)
  687. {
  688. if (go != null)
  689. {
  690. go.transform.SetParent(transform);
  691. go.transform.localPosition = Fighter.Actor.Offset;
  692. go.transform.localEulerAngles = Fighter.Actor.Rot;
  693. go.transform.localScale = Vector3.one * Fighter.Actor.AvatarData.scale;
  694. go.name = "avatar";
  695. mAvatarObject = go;
  696. if (Fighter.IsPlayer || Fighter.IsPet)
  697. {
  698. navAgent = this.gameObject.GetComponent<NavMeshAgent>();
  699. if (navAgent == null)
  700. {
  701. navAgent = this.gameObject.AddComponent<NavMeshAgent>();
  702. navAgent.speed = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_rushspeed_configid);
  703. navAgent.acceleration = navAgent.speed * 6;
  704. }
  705. EnableNavAgent(false);
  706. }
  707. mAnimator = go.GetComponent<Animator>();
  708. if (mAnimator != null) {
  709. mAnimator.logWarnings = false;
  710. mAnimator.SetFloat("moveSpeed", 1);
  711. mAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
  712. }
  713. SetLayer(Fighter.Layer);
  714. }
  715. else
  716. {
  717. DebugHelper.LogError("{0}/{1} 加载失败", path, assetName[0]);
  718. }
  719. mIsLoading = false;
  720. mIsLoaded = true;
  721. IsVisible = Fighter.IsSpawned;
  722. }
  723. void SetAvatarAnimCtrl()
  724. {
  725. if (mAnimator == null) return;
  726. if (Fighter.IsFellow || Fighter.IsPet)
  727. {
  728. UnityEngine.Object ctrl = ResourceMgr.Instance.GetAsset(Constants.AnimatorPath, Fighter.Actor.AnimCtrlName);
  729. if (ctrl != null)
  730. {
  731. mAnimator.runtimeAnimatorController = ctrl as RuntimeAnimatorController;
  732. }
  733. }
  734. }
  735. void DoBeHitColor()
  736. {
  737. if (Fighter.IsPlayer || Fighter.IsPet || mInSpecular || !DeviceInfo.IsGoodDevice) return;
  738. if (mAvatarObject != null)
  739. {
  740. if (mBeHitColorChange == null) {
  741. mBeHitColorChange = mAvatarObject.GetComponent<BeHitColorChange>();
  742. if (mBeHitColorChange == null)
  743. mBeHitColorChange = mAvatarObject.AddComponent<BeHitColorChange>();
  744. }
  745. mBeHitColorChange.color = Color.white;
  746. mBeHitColorChange.time = 0.2f;
  747. mBeHitColorChange.enabled = false;
  748. mBeHitColorChange.enabled = true;
  749. }
  750. }
  751. public void DoBeHitEffect (int effectId, Fighter caster)
  752. {
  753. if (effectId > 0)
  754. {
  755. EffectManager.Instance.PlayEffect(effectId, caster, Fighter);
  756. }
  757. }
  758. void DoBeHitSound (string strSound, bool isBullet)
  759. {
  760. if (!string.IsNullOrEmpty (strSound)) {
  761. MusicMgr.Instance.PlayFightSound(strSound);
  762. }
  763. }
  764. public void PlayFullScreenEffect (string name, float time, bool follow, bool hideSelf)
  765. {
  766. FullScreenSkillEffect effectCtrl = GetComponent<FullScreenSkillEffect> ();
  767. if (effectCtrl == null)
  768. effectCtrl = gameObject.AddComponent<FullScreenSkillEffect> ();
  769. bool mirror = Fighter.TeamSide == eTeamType.Enemy;
  770. effectCtrl.Play (name, time, follow, hideSelf, mirror);
  771. }
  772. public void Pause ()
  773. {
  774. EffectManager.Instance.PauseEffectOfOwnerFighter (Fighter);
  775. PauseAnim ();
  776. }
  777. public void ResumePause ()
  778. {
  779. EffectManager.Instance.ResumeEffectOfOwnerFighter (Fighter);
  780. ResumeAnim ();
  781. }
  782. public void PauseAnim ()
  783. {
  784. if (Animator != null)
  785. Animator.speed = 0;
  786. }
  787. public void ResumeAnim ()
  788. {
  789. if (Animator != null)
  790. Animator.speed = 1;
  791. }
  792. public void SetLayer(int layer)
  793. {
  794. if (mAvatarObject == null) return;
  795. //mAvatarObject.layer = layer;
  796. //for (int i = 0; i < mAvatarObject.transform.childCount; ++i)
  797. //{
  798. // mAvatarObject.transform.GetChild(i).gameObject.layer = layer;
  799. //}
  800. CommonUtil.SetGameObjectLayer(mAvatarObject, layer);
  801. if (shadowEffectInstanceId > 0)
  802. {
  803. if (layer == LayerMask.NameToLayer(BattleCamera.HideLayerName))
  804. {
  805. EffectManager.Instance.HideEffectByInstanceId(shadowEffectInstanceId);
  806. }
  807. else
  808. {
  809. EffectManager.Instance.UnHideEffectByInstanceId(shadowEffectInstanceId);
  810. }
  811. }
  812. }
  813. void OnVisibleChanged ()
  814. {
  815. }
  816. public Vector3 GetPosByLink(string linkName)
  817. {
  818. if (mAvatarObject == null) return Fighter.Position;
  819. if (string.IsNullOrEmpty(linkName)) return Fighter.Position;
  820. Transform trans = mAvatarObject.transform.Find(linkName);
  821. if (trans == null) return Fighter.Position;
  822. return trans.position;
  823. }
  824. public Vector3 GetUIPointPos()
  825. {
  826. if (mAvatarObject == null) return Fighter.Position;
  827. Transform uiPointTrans = mAvatarObject.transform.Find("ui_point");
  828. if (uiPointTrans == null) return Fighter.Position;
  829. return uiPointTrans.position;
  830. }
  831. Transform mFoot;
  832. Transform Foot
  833. {
  834. get {
  835. if (mFoot == null)
  836. {
  837. mFoot = mAvatarObject.transform.Find("foot_point");
  838. if (mFoot != null)
  839. {
  840. Vector3 pos = mFoot.localPosition;
  841. if (Fighter.IsPlayer)
  842. pos.y += 0.03f;
  843. mFoot.localPosition = pos;
  844. }
  845. }
  846. return mFoot;
  847. }
  848. }
  849. void ShowShadow()
  850. {
  851. if (Foot == null) return;
  852. if(shadowEffectInstanceId == 0)
  853. shadowEffectInstanceId = EffectManager.Instance.PlayEffect(GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_shadow_effectid), Foot, Foot);
  854. if(shadowEffectInstanceId > 0)
  855. {
  856. EffectManager.Instance.SetEffectScaleByInstanceId(shadowEffectInstanceId, Fighter.Actor.AvatarData.shadowScale);
  857. }
  858. if (Fighter.IsMainRole && selfEffectInstanceId == 0)
  859. {
  860. selfEffectInstanceId = EffectManager.Instance.PlayEffect(GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_self_effectid),Foot,Foot);
  861. }
  862. }
  863. void HideShadow()
  864. {
  865. EffectManager.Instance.RemoveEffectByInstanceID(shadowEffectInstanceId);
  866. if(selfEffectInstanceId > 0)
  867. {
  868. EffectManager.Instance.RemoveEffectByInstanceID(selfEffectInstanceId);
  869. selfEffectInstanceId = 0;
  870. }
  871. }
  872. public void SetShadowVisible(bool vis)
  873. {
  874. if(shadowEffectInstanceId > 0)
  875. {
  876. if (vis)
  877. EffectManager.Instance.UnHideEffectByInstanceId(shadowEffectInstanceId);
  878. else
  879. EffectManager.Instance.HideEffectByInstanceId(shadowEffectInstanceId);
  880. }
  881. }
  882. public void ShowRunSmoke()
  883. {
  884. if (Foot == null) return;
  885. if (runsmokeEffectInstanceId == 0)
  886. {
  887. runsmokeEffectInstanceId = EffectManager.Instance.PlayEffect(GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_runsmoke_effectid), Foot, Foot);
  888. }
  889. else
  890. {
  891. EffectManager.Instance.UnHideEffectByInstanceId(runsmokeEffectInstanceId);
  892. }
  893. }
  894. public void HideRunSmoke()
  895. {
  896. if(runsmokeEffectInstanceId > 0)
  897. EffectManager.Instance.HideEffectByInstanceId(runsmokeEffectInstanceId);
  898. }
  899. public void OnBreakSkill()
  900. {
  901. //DebugHelper.LogError("mFighter:" + Fighter.Name);
  902. //EventMgr.DispatchEvent<Fighter>(new CoreEvent<Fighter>(ECoreEventType.EID_SKILL_BREAK, Fighter));
  903. }
  904. public void RunToWithNav(Vector3 dest)
  905. {
  906. bool result = false;
  907. if (navAgent != null) {
  908. EnableNavAgent(true);
  909. if (!navAgent.isOnNavMesh)
  910. {
  911. Debug.LogWarning($"不在AI上 == {transform.position} lp == {transform.localPosition} dest = {dest}");
  912. navAgent.Warp(dest);
  913. }
  914. //
  915. result = navAgent.SetDestination(dest);
  916. if(result)
  917. {
  918. if (null == Fighter.Actor)
  919. return;
  920. float speed = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_rushspeed_configid);
  921. if(Fighter.IsBack)
  922. {
  923. SetMoveSpeed(UnityEngine.Random.Range(speed, speed * 1.1f));
  924. }
  925. }
  926. else
  927. {
  928. DebugHelper.LogError("RunToWithNav:" + dest);
  929. }
  930. }
  931. //DebugHelper.LogError("RunToWithNav:" + dest + " result = "+ result);
  932. }
  933. public void EnableNavAgent(bool enabled)
  934. {
  935. if (navAgent != null)
  936. navAgent.enabled = enabled;
  937. }
  938. public void SetStopDistance(float dist)
  939. {
  940. if (navAgent != null)
  941. navAgent.stoppingDistance = Mathf.Min(dist,10);
  942. }
  943. public bool IsNavRunStop()
  944. {
  945. if (navAgent != null)
  946. return navAgent.isStopped || navAgent.velocity.FEqual(Vector3.zero,0.001f);
  947. return true;
  948. }
  949. public float AnimSpeed
  950. {
  951. get
  952. {
  953. float attackSpeedPercent = Mathf.Max(1- Fighter.AttrAttackSpeedPercent,0.3f) * Mathf.Max(1 - Fighter.SkillAttackSpeedPercent,0.3f);
  954. return 1 / attackSpeedPercent;
  955. }
  956. }
  957. public void SetMoveSpeed(float speed)
  958. {
  959. if (navAgent == null) return;
  960. navAgent.speed = speed;
  961. navAgent.acceleration = navAgent.speed * 6;
  962. }
  963. public bool NavAgentEnabled
  964. {
  965. get { return navAgent != null ? navAgent.enabled : false; }
  966. }
  967. public FixVector3 mMoveDestPos = FixVector3.Zero;
  968. Fix64 fDeltaTime = Fix64.Zero;
  969. bool bIsMove = false;
  970. public void MoveTo(FixVector3 destPos)
  971. {
  972. bIsMove = true;
  973. mMoveDestPos = destPos;
  974. fDeltaTime = Fix64.Zero;
  975. }
  976. public bool IsMoveing()
  977. {
  978. return bIsMove;
  979. }
  980. public void EndMoveTo()
  981. {
  982. bIsMove = false;
  983. fDeltaTime = Fix64.Zero;
  984. Fighter.SyncPosition(mMoveDestPos.ToVector3());
  985. }
  986. private void UpdateCurrentPos(float deltaTime)
  987. {
  988. if (!IsMoveing())
  989. return;
  990. fDeltaTime += (Fix64)Time.deltaTime;
  991. FixVector3 fv3Pos = new FixVector3(Fighter.Position);
  992. FixVector3 fv3MovePos = mMoveDestPos;
  993. Fix64 Lerp = fDeltaTime / Constants.s_internaltime;
  994. Lerp = Fix64.Clamp(Lerp, Fix64.Zero, Fix64.One);
  995. FixVector3 fv3EndPos = FixVector3.Lerp(fv3Pos, fv3MovePos, Lerp);
  996. Fighter.SyncPosition(fv3EndPos.ToVector3());
  997. if (Lerp == Fix64.One)
  998. EndMoveTo();
  999. }
  1000. //Vector3 mMoveDestPos = Vector3.zero;
  1001. //bool bChaseTarget = false;
  1002. //Fighter mChaseFighter = null;
  1003. //float mStopDist = 0;
  1004. //public void MoveTo(Vector3 destPos,bool chaseTarget,Fighter chaseFighter,float stopDist)
  1005. //{
  1006. // bChaseTarget = chaseTarget;
  1007. // mMoveDestPos = destPos;
  1008. // mChaseFighter = chaseFighter;
  1009. // mStopDist = stopDist;
  1010. // Fighter.LookAt(mMoveDestPos);
  1011. //}
  1012. //private void UpdateCurrentPos(float deltaTime)
  1013. //{
  1014. // Vector3 dest = mMoveDestPos;
  1015. // if (bChaseTarget)
  1016. // {
  1017. // if (mChaseFighter == null || !mChaseFighter.IsAlive)
  1018. // {
  1019. // mChaseFighter = null;
  1020. // Fighter.StateData.ChangeState(Fighter.StateData.GetIdleNext());
  1021. // return;
  1022. // }
  1023. // Vector3 tPos = mChaseFighter.Position;
  1024. // Vector3 selfPos = Fighter.Position;
  1025. // tPos.y = Fighter.CurrentBattleField.FloorY;
  1026. // selfPos.y = Fighter.CurrentBattleField.FloorY;
  1027. // Vector3 dir = (tPos - selfPos).normalized;
  1028. // float dist = Vector3.Distance(tPos, selfPos);
  1029. // dest = Fighter.Position + Mathf.Max((dist - mStopDist), 0) * dir;
  1030. // }
  1031. // dest.y = Fighter.CurrentBattleField.FloorY;
  1032. // mMoveDestPos = dest;
  1033. // Vector3 pos = Vector3.MoveTowards(Fighter.Position, dest, Fighter.MoveSpeed * deltaTime * Fighter.SpeedRatio);
  1034. // Fighter.SyncPosition(pos);
  1035. // if (Fighter.Position.FEqual(dest, 0.1f))
  1036. // {
  1037. // mChaseFighter = null;
  1038. // Fighter.SyncPosition(dest);
  1039. // Fighter.StateData.ChangeState(Fighter.StateData.GetIdleNext());
  1040. // }
  1041. //}
  1042. public void RebindAvatarGo(GameObject avatarGo)
  1043. {
  1044. if (avatarGo == null) return;
  1045. OnAvatarLoaded(avatarGo, null, null);
  1046. ShowShadow();
  1047. }
  1048. //public void ForceToDest()
  1049. //{
  1050. // if(Fighter.IsRun)
  1051. // {
  1052. // mChaseFighter = null;
  1053. // Fighter.SyncPosition(mMoveDestPos);
  1054. // }
  1055. //}
  1056. }