BaseMonsterAdon.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872
  1. using Adon.Game.Data.StructData;
  2. using Adon.Game.Helper;
  3. using Adon.Game.Manager;
  4. using AdonGameKit;
  5. using BehaviorDesigner.Runtime;
  6. using Chronos;
  7. using Cinemachine;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using UnityEngine;
  11. using UnityEngine.AI;
  12. using WarReport;
  13. namespace Adon.Game.BO
  14. {
  15. /// <summary>
  16. /// 基础怪
  17. /// </summary>
  18. public class BaseMonsterAdon : BaseCharacterAdon
  19. {
  20. /// <summary>
  21. /// 血条类
  22. /// </summary>
  23. public MonHpBarAdon m_HpBar;
  24. protected NavMeshAgent m_NavMeshAgent;
  25. /// <summary>
  26. /// 时间器刚体
  27. /// </summary>
  28. public RigidbodyTimeline3D m_RigidbodyTimeline3D;
  29. /// <summary>
  30. /// 推力方向
  31. /// </summary>
  32. public Vector3 m_ForceDirection;
  33. /// <summary>
  34. /// 推力
  35. /// </summary>
  36. public float m_Force;
  37. /// <summary>
  38. /// 暂停时间
  39. /// </summary>
  40. private float pauseTime = 0;
  41. private bool isPause = false;
  42. //protected BehaviorTreeManager m_BehaviorTreeManager;//行为树管理器
  43. public Behavior CurrentBehaviorTree;
  44. public float m_damageFlashScale;//损伤材质闪光强度
  45. public BaseHero m_TargetHero;
  46. public GameObject m_Lock;//锁定标识
  47. BaseHero _hero;
  48. Dictionary<int, int> buffnum = new Dictionary<int, int>();//buff计数
  49. //buff效果对象列表
  50. private GameObject[] buffs = new GameObject[20];
  51. /// <summary>
  52. /// 是否被击
  53. /// </summary>
  54. public bool isAttacked;
  55. public BaseHero m_Hero
  56. {
  57. get
  58. {
  59. if (_hero == null)
  60. {
  61. _hero = RoleManager.Instance.GetPlayer() as BaseHero;
  62. }
  63. else if (_hero.gameObject.activeSelf == false)
  64. {
  65. _hero = RoleManager.Instance.GetPlayer() as BaseHero;
  66. }
  67. return _hero;
  68. }
  69. }
  70. private Clock m_Clock;
  71. private bool IsDieEff;//是否在播放特效
  72. //动作参数字符哈希值
  73. protected static readonly int hashMoveX = Animator.StringToHash("MoveX");
  74. protected static readonly int hashMoveZ = Animator.StringToHash("MoveZ");
  75. protected static readonly int hashHit = Animator.StringToHash("Hit");//受击击
  76. //protected static readonly int hashHitX = Animator.StringToHash("HitX");//打击
  77. //protected static readonly int hashHitZ = Animator.StringToHash("HitZ");//打击
  78. protected static readonly int hashHitAngle = Animator.StringToHash("HitAngle");//受击方向
  79. protected static readonly int hashHitDown = Animator.StringToHash("HitDown");//击倒
  80. protected static readonly int hashDie = Animator.StringToHash("Die");//死亡
  81. protected static readonly int hashDieDown = Animator.StringToHash("DieDown");//击飞死亡
  82. private static readonly int hashFind = Animator.StringToHash("Find");//发现目标
  83. protected override void Awake()
  84. {
  85. base.Awake();
  86. m_WeaponCol = transform.Find("WeaponCollider").GetComponent<Collider>();
  87. m_WeaponCol.gameObject.AddComponent<WeaponColliderMonster>().SetMonster(this); ;//添加武器碰撞器脚本
  88. CurrentBehaviorTree = GetComponent<Behavior>();
  89. m_Lock = transform.Find("FBX/Effect_ZhongXin/Lock").gameObject;
  90. m_FxManagerAdon = GetComponent<FxManagerAdon>();
  91. m_CinemachineImpulseSource = GetComponent<CinemachineImpulseSource>();
  92. //Name = "Mob01";
  93. //ObjectManagerAdon.AddMobObject(Name, this.gameObject);
  94. m_CurState = eState.Idle;
  95. }
  96. protected virtual void Start()
  97. {
  98. //m_Hero = RoleManager.Instance.GetPlayer(0) as BaseHero;
  99. m_fbx.gameObject.GetComponent<FBXEventMonster>().SetOwner(this.gameObject);
  100. m_Clock = Timekeeper.instance.Clock("Enemy");
  101. m_NavMeshAgent = time.navMeshAgent.component;
  102. m_RigidbodyTimeline3D = time.rigidbody;
  103. m_NavMeshAgent.radius = 0;//去掉怪物寻路组件的碰撞范围
  104. m_CapsuleCollider.isTrigger = true;//去掉物理碰撞启用触发方式
  105. }
  106. // Update is called once per frame
  107. protected virtual void Update()
  108. {
  109. if (isPause)
  110. {
  111. pauseTime -= Time.deltaTime;
  112. if (pauseTime <= 0)
  113. {
  114. isPause = false;
  115. CurrentBehaviorTree.EnableBehavior();
  116. if (m_NavMeshAgent && isDie == false)
  117. {
  118. m_NavMeshAgent.isStopped = false;
  119. }
  120. }
  121. }
  122. //受击闪光效果
  123. if (isAttacked)
  124. {
  125. m_damageFlashScale -= time.deltaTime * 20;
  126. if (m_damageFlashScale <= 0)
  127. {
  128. m_damageFlash.gameObject.SetActive(false);
  129. m_damageFlashScale = 0;
  130. isAttacked = false;
  131. }
  132. else
  133. {
  134. m_damageFlash.gameObject.SetActive(true);
  135. }
  136. for (int l = 0; l < m_damageFlashMaterial.Length; l++)
  137. {
  138. m_damageFlashMaterial[l].SetFloat("_Scale", m_damageFlashScale);
  139. }
  140. }
  141. }
  142. /// <summary>
  143. /// 行为树暂停
  144. /// </summary>
  145. /// <param name="_pauseTime">暂停时间</param>
  146. /// <returns></returns>
  147. public void BehaviorTreePause(float _pauseTime)
  148. {
  149. isPause = true;
  150. pauseTime = _pauseTime;
  151. m_NavMeshAgent.isStopped = true;
  152. CurrentBehaviorTree.DisableBehavior(true);
  153. }
  154. #region ============================================ 消息触发 MSG ======================================================
  155. /// <summary>
  156. /// 受击消息接收
  157. /// </summary>
  158. /// <param name="baseData"></param>
  159. public override void OnMsg_Attacked(Attacked_MsgData data)
  160. {
  161. //Debug.Log("怪物受击消息");
  162. if (m_CurState == eState.Die)
  163. {
  164. return;
  165. }
  166. m_TargetHero = data.sender.GetComponent<BaseHero>();
  167. m_ForceDirection = data.forceDirection;
  168. Vector3 hitDir = data.forceDirection;
  169. //计算怪角度偏移
  170. //float HitAngle = PlayerHelperAdon.Angle_360(transform.forward, hitDir);
  171. float HitAngle = data.HitAngle;
  172. HpbarManager.Instance.CreateHpTip(this, data.dmg, data.isCR, data.weakness);//血条及数字显示
  173. if (data.resultHp <= 0)//死亡
  174. {
  175. OnMsg_Die(data.attackedEffType);//发送死亡消息
  176. }
  177. else
  178. {
  179. if (data.attackedEffType == EnumDefine.AttackedEffT.DWN)//击倒击飞
  180. {
  181. // 只有普通怪 才播放播放受击动画
  182. if (roleType == RoleType.Common)
  183. {
  184. BehaviorTreePause(2.5f);
  185. m_Animator.SetTrigger(hashHitDown);//播放击倒动作
  186. SetCameraShake(transform.position, 3f, 0.1f, 0.4f);//震屏
  187. //转向玩家
  188. transform.LookAt(data.sender.transform);
  189. }
  190. }
  191. else if (data.attackedEffType == EnumDefine.AttackedEffT.STF)
  192. {
  193. //SetCameraShake(transform.position, 1f, 0.1f, 0.2f);//震屏
  194. }
  195. else if (data.attackedEffType == EnumDefine.AttackedEffT.INHALE)
  196. {
  197. //SetCameraShake(transform.position, 1f, 0.1f, 0.2f);//震屏
  198. m_Animator.SetFloat(hashMoveZ, 1);//更新移动动作
  199. }
  200. else
  201. {
  202. // 只有普通怪 才播放播放受击动画
  203. if (roleType == RoleType.Common)
  204. {
  205. BehaviorTreePause(1.0f);
  206. m_Animator.Play("HitTree");
  207. m_Animator.SetFloat(hashHitAngle, HitAngle);//根据受击方向播受击动作
  208. }
  209. }
  210. }
  211. //实例化克隆被击光效
  212. if (data.AttackedEff && m_HitObj != null)
  213. {
  214. GameObject effobj = Instantiate(data.AttackedEff);
  215. if (!effobj.GetComponent<DestroyObjectDelayed>()) effobj.gameObject.AddComponent<DestroyObjectDelayed>();//添加延迟销毁脚本
  216. effobj.transform.position = m_HitObj.position;
  217. effobj.transform.rotation = m_TargetHero.transform.rotation;
  218. effobj.SetActive(true);
  219. }
  220. if (data.SkillId == "6010221")//冰冻技
  221. {
  222. m_freezeFlashs.gameObject.SetActive(true);//冰冻效果
  223. //for (int l = 0; l < m_freezeFlashMaterial.Length; l++)
  224. //{
  225. // m_freezeFlashMaterial[l].SetFloat("_Power", 2.5f);
  226. //}
  227. }
  228. else
  229. {
  230. m_damageFlash.gameObject.SetActive(true);//受击高亮材质显示
  231. m_damageFlashScale = 3f;
  232. for (int l = 0; l < m_damageFlashMaterial.Length; l++)
  233. {
  234. m_damageFlashMaterial[l].SetFloat("_Scale", m_damageFlashScale);
  235. }
  236. }
  237. isAttacked = true;
  238. }
  239. /// <summary>
  240. /// 执行死亡指令
  241. /// </summary>
  242. /// <param name="baseData"></param>
  243. public void OnMsg_Die(EnumDefine.AttackedEffT attackedEffType, bool isImmDie = false)
  244. {
  245. //Debug.Log("播放死亡销毁光效");
  246. //m_FxManagerAdon.PlayDieEff(0, false, this.m_HitObj);
  247. //RoleManager.Instance.DeleteRole(this);
  248. print("死亡");
  249. //播放死亡特效和音效
  250. if (isImmDie)
  251. {
  252. //RoleManager.Instance.DeleteRole(this);
  253. }
  254. else if (attackedEffType == EnumDefine.AttackedEffT.DWN)//击倒
  255. {
  256. m_Animator.SetTrigger(hashDieDown);//播放击倒死亡动作
  257. SetCameraShake(transform.position, 2f, 0.1f, 0.3f);//震屏
  258. }
  259. else if (attackedEffType == EnumDefine.AttackedEffT.NOR)
  260. {
  261. //m_Animator.SetTrigger(hashDieDown);//播放击倒死亡动作
  262. //SetCameraShake(transform.position, 2f, 0.1f, 0.3f);//震屏
  263. }
  264. else
  265. {
  266. //死亡动作
  267. m_Animator.SetTrigger(hashDie);
  268. m_NavMeshAgent.baseOffset = 0;
  269. SetCameraShake(transform.position, 0.8f, 0.1f, 0.2f);//震屏
  270. }
  271. //禁用碰撞盒,寻路组件
  272. m_CapsuleCollider.enabled = false;
  273. m_NavMeshAgent.enabled = false;
  274. //CurrentBehaviorTree.SendEvent("DieEvent");
  275. m_CurState = eState.Die;
  276. Invoke("OnDieEnd", 2);
  277. }
  278. /// <summary>
  279. /// 发现目标消息
  280. /// </summary>
  281. /// <param name="baseData"></param>
  282. public override void OnMsgFindTarget()
  283. {
  284. m_Animator.SetTrigger(hashFind);
  285. }
  286. /// <summary>
  287. /// 普通打击
  288. /// </summary>
  289. /// <param name="attackIdx"></param>
  290. /// <param name="enemy"></param>
  291. public virtual void OnMsgAttackHit(ReportDataAdon report)
  292. {
  293. //foreach (WarReportUnit heroData in report.UnitDataTarget)//遍历目标者列表
  294. //{
  295. m_TargetHero = RoleManager.Instance.GetRole(report.TargetId) as BaseHero;
  296. //targetHero = hero.gameObject;
  297. Attacked_MsgData data = new Attacked_MsgData();//受击消息数据
  298. data.SkillId = report.SkillId;
  299. data.sender = this.gameObject;
  300. Vector3 force = m_Hero.transform.position - transform.position;//推力方向
  301. force.Normalize();
  302. data.attackedEffType = EnumDefine.AttackedEffT.STF;
  303. data.forceDirection = force;//推力方向
  304. //计算敌人剩余血量
  305. data.resultHp = report.resultHP;
  306. data.dmg = report.dmg;
  307. data.isCR = report.isCR;//是否暴击
  308. data.weakness = report.weakness;
  309. if (m_FxManagerAdon.m_AttackedEff != null && m_FxManagerAdon.m_AttackedEff.Length > 0) data.AttackedEff = m_FxManagerAdon.m_AttackedEff[0].gameObject;//被击特效
  310. m_Hero.OnMsg_Attacked(data);
  311. //if (data.resultHp <= 0)//目标死亡
  312. //{
  313. // //释放目标
  314. // ReleaseTarget();
  315. //}
  316. //}
  317. }
  318. /// <summary>
  319. /// 打击发动Debuff
  320. /// </summary>
  321. /// <param name="attackIdx"></param>
  322. /// <param name="enemy"></param>
  323. public void FireMsgDebuffNew(ReportDataAdon report)
  324. {
  325. Debug.Log("新Debuff战报触发");
  326. Attacked_MsgData data = new Attacked_MsgData();//受击消息数据
  327. data.buffType = report.buffType;
  328. //data.valueMove = report.BuffDataInfo.mo.moveSpeed;
  329. data.dmg = report.dmg;
  330. data.resultHp = report.resultHP;
  331. data.sender = this.gameObject;
  332. //data.AttackedEff = part.GetAttackedEff().gameObject;
  333. //data.DieEff = part.GetDieEff().gameObject;
  334. BaseHero hero = RoleManager.Instance.GetRole(report.TargetId) as BaseHero;
  335. hero.OnMsgDebuff(data);
  336. }
  337. float buffPower = 1;
  338. /// <summary>
  339. /// 执行debuff
  340. /// </summary>
  341. /// <param name="report"></param>
  342. public void OnMsgDebuff(Attacked_MsgData data)
  343. {
  344. int damage;
  345. //debuff计数
  346. if (buffnum.ContainsKey(data.buffType))
  347. {
  348. int num = buffnum[data.buffType];
  349. num++;
  350. buffnum[data.buffType] = num;
  351. }
  352. else
  353. {
  354. buffnum[data.buffType] = 1;
  355. }
  356. //处理buff特效资源挂载
  357. if(buffs[data.buffType] == null)
  358. {
  359. ResourceHelper.Instance.LoadAssetBundle(data.buffResStr, ab =>
  360. {
  361. if (ab != null)
  362. {
  363. GameObject model = (GameObject)Instantiate(ab.LoadAsset(data.buffResStr));
  364. model.transform.SetParent(transform);
  365. switch(data.buffPoi)
  366. {
  367. case 0:
  368. model.transform.position = m_TopObj.position;
  369. break;
  370. case 1:
  371. model.transform.position = m_HitObj.position;
  372. break;
  373. case 2:
  374. model.transform.position = m_HitObj.position;
  375. break;
  376. case 3:
  377. model.transform.position = m_FootObj.position;
  378. break;
  379. }
  380. buffs[data.buffType] = model;
  381. }
  382. });
  383. }
  384. //1眩晕 2静止 3护盾 4沉默 5麻痹 6灼烧 7冰冻 8中毒
  385. switch (data.buffType)
  386. {
  387. case 6://灼烧
  388. damage = data.dmg;
  389. ///灼烧
  390. HpbarManager.Instance.CreateHpTip(this, -damage, false, 1.0f);//血条及数字显示
  391. break;
  392. case 7:
  393. if (data.resultHp <= 0)
  394. {
  395. ///死亡
  396. Debug.Log("冰冻死亡");
  397. //播放死亡光效
  398. if(data.DieEff)
  399. {
  400. GameObject difeff = Instantiate(data.DieEff);
  401. difeff.SetActive(true);
  402. difeff.transform.position = m_HitObj.position;
  403. }
  404. OnMsg_Die(data.attackedEffType, true);//发送死亡消息
  405. }
  406. else
  407. {
  408. damage = data.dmg;
  409. buffPower = buffPower - 0.2f;
  410. if (buffPower <= 0)
  411. {
  412. buffPower = 0;
  413. CurrentBehaviorTree.DisableBehavior(true);
  414. }
  415. //float targetATK = report.BuffDataInfo.target.GetProperty(YLBattle.EBattleProperty.ATTACKSPEED);
  416. //float targetMove = report.BuffDataInfo.target.GetProperty(YLBattle.EBattleProperty.MOVESPEED);
  417. ///执行debuff
  418. ///缓速
  419. ///冻结效果
  420. SetLocalClockTimeScale(buffPower);
  421. //开启冻结网格材质
  422. //根据冻结强度设置材质参数
  423. float _PowerMin = 0.3f;
  424. float _PowerMax = 2.5f;
  425. float _PowerDiff = _PowerMax - _PowerMin;
  426. float materialPower = _PowerMin + _PowerDiff * buffPower;
  427. m_freezeFlashs.gameObject.SetActive(true);
  428. //m_freezeFlashPower = 5;
  429. for (int l = 0; l < m_freezeFlashMaterial.Length; l++)
  430. {
  431. m_freezeFlashMaterial[l].SetFloat("_Power", materialPower);
  432. }
  433. HpbarManager.Instance.CreateHpTip(this, -damage, false, 1.0f);//血条及数字显示
  434. }
  435. break;
  436. case 8://中毒
  437. damage = data.dmg;
  438. HpbarManager.Instance.CreateHpTip(this, -damage, false, 1.0f);//血条及数字显示
  439. break;
  440. }
  441. }
  442. /// <summary>
  443. /// 关闭debuff
  444. /// </summary>
  445. /// <param name="report"></param>
  446. public void OffMsgDebuff(ReportDataAdon reportData)
  447. {
  448. //debuff计数减
  449. if (buffnum.ContainsKey(reportData.buffType))
  450. {
  451. int num = buffnum[reportData.buffType];
  452. num--;
  453. buffnum[reportData.buffType] = num;
  454. }
  455. if (buffnum[reportData.buffType] > 0) return;
  456. //1眩晕 2静止 3护盾 4沉默 5麻痹 6灼烧 7冰冻 8黯
  457. switch (reportData.buffType)
  458. {
  459. case 6:
  460. break;
  461. case 7:
  462. buffPower = 1;
  463. SetLocalClockTimeScale(buffPower);
  464. for (int l = 0; l < m_freezeFlashMaterial.Length; l++)
  465. {
  466. m_freezeFlashMaterial[l].SetFloat("_Power", 2.5f);
  467. }
  468. m_freezeFlashs.gameObject.SetActive(false);
  469. CurrentBehaviorTree.EnableBehavior();
  470. break;
  471. }
  472. buffs[reportData.buffType] = null;//销毁光效对象
  473. }
  474. #endregion
  475. #region ============================================ 动作事件 MSB ======================================================
  476. /// <summary>
  477. /// 移动进入
  478. /// </summary>
  479. public void MSB_Move_Enter()
  480. {
  481. m_CurState = eState.Move;
  482. m_WeaponCol.enabled = false;
  483. //SendBehaviorVariable("IsAttacked", false);
  484. //m_RigidbodyTimeline3D.velocity = Vector3.zero;
  485. }
  486. Vector3 LastPosition;
  487. public void MSB_Move_Update(AnimatorStateInfo stateInfo)
  488. {
  489. Vector3 direction = transform.localPosition - LastPosition;//方向
  490. float angle = PlayerHelperAdon.Angle_360(direction, transform.forward);
  491. //float angle = Vector3.Angle(direction, transform.forward);
  492. Vector3 cc = Vector3.zero;
  493. cc.x = -Mathf.Sin(angle * Mathf.Deg2Rad);
  494. cc.z = Mathf.Cos(angle * Mathf.Deg2Rad);
  495. //cc.Normalize();
  496. m_Animator.SetFloat(hashMoveX, cc.x * m_NavMeshAgent.velocity.magnitude / m_Clock.localTimeScale * 0.5f);//更新移动动作
  497. m_Animator.SetFloat(hashMoveZ, cc.z * m_NavMeshAgent.velocity.magnitude / m_Clock.localTimeScale * 0.5f);//更新移动动作
  498. LastPosition = transform.localPosition;
  499. }
  500. public void MSB_Move_Exit()
  501. {
  502. m_damageFlash.gameObject.SetActive(false);
  503. m_RigidbodyTimeline3D.velocity = Vector3.zero;
  504. }
  505. /// <summary>
  506. /// 受击进入
  507. /// </summary>
  508. public void MSB_Hit_Enter()
  509. {
  510. m_CurState = eState.Attacked;
  511. m_WeaponCol.enabled = false;
  512. }
  513. public void MSB_Hit_Update(AnimatorStateInfo stateInfo)
  514. {
  515. m_RigidbodyTimeline3D.velocity = GetForce();
  516. //Debug.Log("推力" + m_RigidbodyTimeline3D.velocity);
  517. }
  518. public void MSB_Hit_Exit()
  519. {
  520. m_ForceDirection = Vector3.zero;
  521. m_RigidbodyTimeline3D.velocity = GetForce();
  522. }
  523. /// <summary>
  524. /// 击飞倒进入
  525. /// </summary>
  526. public void MSB_Down_Enter()
  527. {
  528. m_CurState = eState.Down;
  529. m_WeaponCol.enabled = false;
  530. }
  531. /// <summary>
  532. /// 击倒更新
  533. /// </summary>
  534. /// <param name="stateInfo"></param>
  535. public void MSB_Down_Update(AnimatorStateInfo stateInfo)
  536. {
  537. m_damageFlashScale -= time.deltaTime * 5;
  538. if (m_damageFlashScale <= 0)
  539. {
  540. m_damageFlash.gameObject.SetActive(false);
  541. m_damageFlashScale = 0;
  542. }
  543. for (int l = 0; l < m_damageFlashMaterial.Length; l++)
  544. {
  545. m_damageFlashMaterial[l].SetFloat("_Scale", m_damageFlashScale);
  546. }
  547. m_RigidbodyTimeline3D.velocity = GetForce();
  548. //Debug.Log("推力" + m_RigidbodyTimeline3D.velocity);
  549. }
  550. public void MSB_Down_Exit()
  551. {
  552. m_ForceDirection = Vector3.zero;
  553. m_RigidbodyTimeline3D.velocity = GetForce();
  554. }
  555. /// <summary>
  556. /// 死亡状态更新
  557. /// </summary>
  558. /// <param name="stateInfo"></param>
  559. public void MSB_Die_Enter()
  560. {
  561. m_CurState = eState.Die;
  562. m_WeaponCol.enabled = false;
  563. }
  564. /// <summary>
  565. /// 死亡状态更新
  566. /// </summary>
  567. /// <param name="stateInfo"></param>
  568. public void MSB_Die_Update(AnimatorStateInfo stateInfo)
  569. {
  570. m_damageFlashScale -= time.deltaTime * 5;
  571. if (m_damageFlashScale <= 0)
  572. {
  573. m_damageFlash.gameObject.SetActive(false);
  574. m_damageFlashScale = 0;
  575. }
  576. for (int l = 0; l < m_damageFlashMaterial.Length; l++)
  577. {
  578. m_damageFlashMaterial[l].SetFloat("_Scale", m_damageFlashScale);
  579. }
  580. if (stateInfo.normalizedTime > 0.9f)
  581. {
  582. GetComponent<CapsuleCollider>().enabled = false;
  583. }
  584. m_RigidbodyTimeline3D.velocity = GetForce();
  585. //死亡效果
  586. if (stateInfo.normalizedTime >= 1 && IsDieEff == false)
  587. {
  588. IsDieEff = true;
  589. //GetComponent<CapsuleCollider>().enabled = false;
  590. //GetComponent<NavMeshAgent>().enabled = false;
  591. //Destroy(GetComponent<Rigidbody>());//移除刚体
  592. //m_RigidbodyTimeline3D.velocity = Vector3.zero;
  593. ////播放死亡光效
  594. //m_FxManagerAdon.PlayDieEff();
  595. ////闪红
  596. //m_damageFlash.gameObject.SetActive(true);//受击高亮材质显示
  597. //m_damageFlashScale = 2.5f;
  598. //for (int l = 0; l < m_damageFlashMaterial.Length; l++)
  599. //{
  600. // m_damageFlashMaterial[l].SetFloat("_Scale", m_damageFlashScale);
  601. //}
  602. ////销毁
  603. //Destroy(this.gameObject, 0.3f);
  604. }
  605. }
  606. /// <summary>
  607. /// 死亡状态离开
  608. /// </summary>
  609. /// <param name="stateInfo"></param>
  610. public void MSB_Die_Exit()
  611. {
  612. }
  613. public void MSB_Attack_Enter()
  614. {
  615. m_CurState = eState.Attack;
  616. transform.LookAt(new Vector3(m_Hero.transform.position.x, 0, m_Hero.transform.position.z));//看向目标
  617. }
  618. public void MSB_Attack_Update(AnimatorStateInfo stateInfo)
  619. {
  620. //受击闪光逐渐消失
  621. m_damageFlashScale -= time.deltaTime * 10;
  622. if (m_damageFlashScale <= 0)
  623. {
  624. m_damageFlash.gameObject.SetActive(false);
  625. m_damageFlashScale = 0;
  626. }
  627. for (int l = 0; l < m_damageFlashMaterial.Length; l++)
  628. {
  629. m_damageFlashMaterial[l].SetFloat("_Scale", m_damageFlashScale);
  630. }
  631. m_RigidbodyTimeline3D.velocity = GetForce();
  632. }
  633. public void MSB_Attack_Exit()
  634. {
  635. }
  636. /// <summary>
  637. /// 发现目标进入
  638. /// </summary>
  639. public void MSB_Find_Enter()
  640. {
  641. m_CurState = eState.Find;
  642. m_WeaponCol.enabled = false;
  643. }
  644. public void MSB_Find_Update(AnimatorStateInfo stateInfo)
  645. {
  646. }
  647. public void MSB_Find_Exit()
  648. {
  649. }
  650. #endregion
  651. #region Animation Event
  652. /// <summary>
  653. /// 普通攻击开始
  654. /// </summary>
  655. public virtual void OnAttackStart(int attackId) { }
  656. /// <summary>
  657. /// 普通攻击触发
  658. /// </summary>
  659. /// <param name="skillId">技能id</param>
  660. /// <param name="attackId">子连击id</param>
  661. public virtual void OnAttackOn(string attackId)
  662. {
  663. List<string> list = new List<string>(attackId.Split(','));
  664. m_SkillId = int.Parse(list[0]);
  665. if (list.Count > 1)
  666. {
  667. m_CurAttackIdx = int.Parse(list[1]);
  668. }
  669. else
  670. {
  671. m_CurAttackIdx = 1;
  672. }
  673. m_WeaponCol.transform.localEulerAngles = Vector3.zero;
  674. m_WeaponCol.enabled = true;
  675. }
  676. /// <summary>
  677. /// 普通攻击结束
  678. /// </summary>
  679. public virtual void OnAttackOff()
  680. {
  681. this.m_WeaponCol.enabled = false;//关闭武器碰撞
  682. }
  683. /// <summary>
  684. /// 攻击移动触发
  685. /// </summary>
  686. public virtual void OnAttackMoveStart(float num)
  687. {
  688. Debug.Log("执行OnAttackMoveStart.SendMessage");
  689. Vector3 velocity = transform.forward.normalized * num;
  690. time.rigidbody.velocity = velocity;
  691. }
  692. /// <summary>
  693. /// 攻击移动触发
  694. /// </summary>
  695. public virtual void OnAttackMoveEnd()
  696. {
  697. time.rigidbody.velocity = Vector3.zero;
  698. }
  699. /// <summary>
  700. /// 打击移动结束
  701. /// </summary>
  702. public void OnHitMoveEnd()
  703. {
  704. m_RigidbodyTimeline3D.velocity = Vector3.zero;
  705. }
  706. /// <summary>
  707. /// 可进入极限闪避
  708. /// </summary>
  709. public void OnExtremeDodge(float _time)
  710. {
  711. //播放可极限闪避光效
  712. m_FxManagerAdon.PlayExtermePointEff();
  713. //设置可进入极限闪避
  714. m_Hero.SetExtermeTimeZone(_time);
  715. }
  716. /// <summary>
  717. /// 死亡结束,开始销毁
  718. /// </summary>
  719. public void OnDieEnd()
  720. {
  721. Debug.Log("播放死亡销毁光效");
  722. if (m_FxManagerAdon != null)
  723. {
  724. m_FxManagerAdon.PlayDieEff(0, false, this.transform);
  725. }
  726. RoleManager.Instance.DeleteRole(this);
  727. }
  728. #endregion
  729. ///// <summary>
  730. ///// 发送行为树参数
  731. ///// </summary>
  732. ///// <param name="VariabelName"></param>
  733. ///// <param name="value"></param>
  734. //private void SendBehaviorVariable(string VariabelName,object value)
  735. //{
  736. // if(m_BehaviorTreeManager.CurrentBehaviorTree)
  737. // //m_BehaviorTreeManager.CurrentBehaviorTree.SetVariableValue(VariabelName, value);
  738. //}
  739. /// <summary>
  740. /// 震屏
  741. /// </summary>
  742. public void OnShake(float _velocity = 1)
  743. {
  744. //判断震屏等级
  745. Vector3 velocity = Vector3.one * _velocity;
  746. //发送震屏消息
  747. m_CinemachineImpulseSource.GenerateImpulseAt(this.transform.position, velocity);
  748. }
  749. //设置刚力
  750. public void SetForce(float _Force)
  751. {
  752. m_Force = _Force;
  753. }
  754. /// <summary>
  755. /// 获取推力
  756. /// </summary>
  757. /// <returns></returns>
  758. public Vector3 GetForce()
  759. {
  760. Vector3 force = m_ForceDirection * m_Force;
  761. return force;
  762. }
  763. /// <summary>
  764. /// 被锁定效果
  765. /// </summary>
  766. public void Lock()
  767. {
  768. m_Lock.SetActive(true);
  769. }
  770. /// <summary>
  771. /// 解除被锁定效果
  772. /// </summary>
  773. public void ReleaseLock()
  774. {
  775. m_Lock.SetActive(false);
  776. if( BattleCanvas.Instance != null)
  777. {
  778. BattleCanvas.Instance.HideLockMonsterHP();
  779. }
  780. }
  781. }
  782. }