FighterGoCtrl.cs 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265
  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. Debug.Log(dest);
  907. bool result = false;
  908. if (navAgent != null) {
  909. EnableNavAgent(true);
  910. result = navAgent.SetDestination(dest);
  911. if(result)
  912. {
  913. if (null == Fighter.Actor)
  914. return;
  915. float speed = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_rushspeed_configid);
  916. if(Fighter.IsBack)
  917. {
  918. SetMoveSpeed(UnityEngine.Random.Range(speed, speed * 1.1f));
  919. }
  920. }
  921. else
  922. {
  923. DebugHelper.LogError("RunToWithNav:" + dest);
  924. StartCoroutine(DelayRunToWithNav(dest));
  925. }
  926. }
  927. //DebugHelper.LogError("RunToWithNav:" + dest + " result = "+ result);
  928. }
  929. private IEnumerator DelayRunToWithNav(Vector3 dest)
  930. {
  931. yield return new WaitForSeconds(0.3f);
  932. bool result = false;
  933. if (null == Fighter.Actor)
  934. yield break;
  935. if (navAgent != null)
  936. {
  937. while (!result)
  938. {
  939. EnableNavAgent(true);
  940. result = navAgent.SetDestination(dest);
  941. if (result)
  942. {
  943. float speed = GlobalConfig.Instance.GetConfigIntValue(GlobalConfig.c_rushspeed_configid);
  944. if (Fighter.IsBack)
  945. {
  946. SetMoveSpeed(UnityEngine.Random.Range(speed, speed * 1.1f));
  947. }
  948. }
  949. else
  950. {
  951. EnableNavAgent(false);
  952. DebugHelper.Log("DelayRunToWithNav:" + dest);
  953. yield return new WaitForSeconds(0.3f);
  954. }
  955. }
  956. }
  957. }
  958. public void EnableNavAgent(bool enabled)
  959. {
  960. if (navAgent != null)
  961. navAgent.enabled = enabled;
  962. }
  963. public void SetStopDistance(float dist)
  964. {
  965. if (navAgent != null)
  966. navAgent.stoppingDistance = Mathf.Min(dist,10);
  967. }
  968. public bool IsNavRunStop()
  969. {
  970. if (navAgent != null)
  971. return navAgent.isStopped || navAgent.velocity.FEqual(Vector3.zero,0.001f);
  972. return true;
  973. }
  974. public float AnimSpeed
  975. {
  976. get
  977. {
  978. float attackSpeedPercent = Mathf.Max(1- Fighter.AttrAttackSpeedPercent,0.3f) * Mathf.Max(1 - Fighter.SkillAttackSpeedPercent,0.3f);
  979. return 1 / attackSpeedPercent;
  980. }
  981. }
  982. public void SetMoveSpeed(float speed)
  983. {
  984. if (navAgent == null) return;
  985. navAgent.speed = speed;
  986. navAgent.acceleration = navAgent.speed * 6;
  987. }
  988. public bool NavAgentEnabled
  989. {
  990. get { return navAgent != null ? navAgent.enabled : false; }
  991. }
  992. public FixVector3 mMoveDestPos = FixVector3.Zero;
  993. Fix64 fDeltaTime = Fix64.Zero;
  994. bool bIsMove = false;
  995. public void MoveTo(FixVector3 destPos)
  996. {
  997. bIsMove = true;
  998. mMoveDestPos = destPos;
  999. fDeltaTime = Fix64.Zero;
  1000. }
  1001. public bool IsMoveing()
  1002. {
  1003. return bIsMove;
  1004. }
  1005. public void EndMoveTo()
  1006. {
  1007. bIsMove = false;
  1008. fDeltaTime = Fix64.Zero;
  1009. Fighter.SyncPosition(mMoveDestPos.ToVector3());
  1010. }
  1011. private void UpdateCurrentPos(float deltaTime)
  1012. {
  1013. if (!IsMoveing())
  1014. return;
  1015. fDeltaTime += (Fix64)Time.deltaTime;
  1016. FixVector3 fv3Pos = new FixVector3(Fighter.Position);
  1017. FixVector3 fv3MovePos = mMoveDestPos;
  1018. Fix64 Lerp = fDeltaTime / Constants.s_internaltime;
  1019. Lerp = Fix64.Clamp(Lerp, Fix64.Zero, Fix64.One);
  1020. FixVector3 fv3EndPos = FixVector3.Lerp(fv3Pos, fv3MovePos, Lerp);
  1021. Fighter.SyncPosition(fv3EndPos.ToVector3());
  1022. if (Lerp == Fix64.One)
  1023. EndMoveTo();
  1024. }
  1025. //Vector3 mMoveDestPos = Vector3.zero;
  1026. //bool bChaseTarget = false;
  1027. //Fighter mChaseFighter = null;
  1028. //float mStopDist = 0;
  1029. //public void MoveTo(Vector3 destPos,bool chaseTarget,Fighter chaseFighter,float stopDist)
  1030. //{
  1031. // bChaseTarget = chaseTarget;
  1032. // mMoveDestPos = destPos;
  1033. // mChaseFighter = chaseFighter;
  1034. // mStopDist = stopDist;
  1035. // Fighter.LookAt(mMoveDestPos);
  1036. //}
  1037. //private void UpdateCurrentPos(float deltaTime)
  1038. //{
  1039. // Vector3 dest = mMoveDestPos;
  1040. // if (bChaseTarget)
  1041. // {
  1042. // if (mChaseFighter == null || !mChaseFighter.IsAlive)
  1043. // {
  1044. // mChaseFighter = null;
  1045. // Fighter.StateData.ChangeState(Fighter.StateData.GetIdleNext());
  1046. // return;
  1047. // }
  1048. // Vector3 tPos = mChaseFighter.Position;
  1049. // Vector3 selfPos = Fighter.Position;
  1050. // tPos.y = Fighter.CurrentBattleField.FloorY;
  1051. // selfPos.y = Fighter.CurrentBattleField.FloorY;
  1052. // Vector3 dir = (tPos - selfPos).normalized;
  1053. // float dist = Vector3.Distance(tPos, selfPos);
  1054. // dest = Fighter.Position + Mathf.Max((dist - mStopDist), 0) * dir;
  1055. // }
  1056. // dest.y = Fighter.CurrentBattleField.FloorY;
  1057. // mMoveDestPos = dest;
  1058. // Vector3 pos = Vector3.MoveTowards(Fighter.Position, dest, Fighter.MoveSpeed * deltaTime * Fighter.SpeedRatio);
  1059. // Fighter.SyncPosition(pos);
  1060. // if (Fighter.Position.FEqual(dest, 0.1f))
  1061. // {
  1062. // mChaseFighter = null;
  1063. // Fighter.SyncPosition(dest);
  1064. // Fighter.StateData.ChangeState(Fighter.StateData.GetIdleNext());
  1065. // }
  1066. //}
  1067. public void RebindAvatarGo(GameObject avatarGo)
  1068. {
  1069. if (avatarGo == null) return;
  1070. OnAvatarLoaded(avatarGo, null, null);
  1071. ShowShadow();
  1072. }
  1073. //public void ForceToDest()
  1074. //{
  1075. // if(Fighter.IsRun)
  1076. // {
  1077. // mChaseFighter = null;
  1078. // Fighter.SyncPosition(mMoveDestPos);
  1079. // }
  1080. //}
  1081. }