Enemy.cs 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214
  1. using Spine.Unity;
  2. using Spine;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. using Base.Common;
  7. using UnityEditor.SceneManagement;
  8. public enum TargetType
  9. {
  10. None = 0,
  11. Demonic = 1,
  12. Tower = 2,
  13. Player = 3,
  14. Enemy = 4,
  15. EnemyTower = 5,
  16. Boss = 6,
  17. Portal = 7,
  18. }
  19. public enum SearchState
  20. {
  21. NoTarget = 0, //搜索范围内没有目标
  22. InSearchScope = 1, //在搜索范围内发现目标,但不在攻击范围内
  23. InAttackScope = 2, //目标在攻击范围内
  24. }
  25. public class Enemy : MoveCharacter
  26. {
  27. [Header("敌方单位属性")]
  28. public int id;
  29. public int baseSortingOrder;
  30. int sortingOrder = 0;
  31. public bool canFly = false;
  32. public bool isBack = false; //往反方向走
  33. public float flyHeight;
  34. public float flyUpSpeed = 10;
  35. public float jumpSpeed = 10;
  36. public float maxMoveSpeed, minMoveSpeed;
  37. public float runSpeed;
  38. [Header("击飞、屏幕反弹")]
  39. public bool isBeBlownUp; //被击飞
  40. public bool isBeReboundedX; //X方向被反弹
  41. public bool isBeReboundedY; //Y方向被反弹
  42. private bool hasBeReboundedX;
  43. private bool hasBeReboundedY;
  44. public float reboundXSpeed;
  45. public float reboundYSpeed;
  46. public int wallDamage;
  47. [Header("落地眩晕")]
  48. public bool willBeComa;
  49. public float willComaTime;
  50. public int comaDamage;
  51. public bool willBeFly;
  52. [Header("敌方英灵")]
  53. public Spirits.SpiritType type;
  54. [Header("敌方单位组件")]
  55. public SearchState searchState;
  56. [Header("攻击")]
  57. public float attackDistance;
  58. public float maxAttackDis, minAttackDis;
  59. public bool needToChange;
  60. public float attackRatio;
  61. [Header("掉落魂")]
  62. public int dropSoulMax = 3;
  63. public int dropSoulMin = 1;
  64. public float dropSoulAngle = 60f;
  65. [Header("冲刺攻击")]
  66. public GameObject aimEffect;
  67. public DashEffect dashEffect;
  68. [HideInInspector]
  69. public bool noOnSearchState;
  70. [HideInInspector]
  71. public bool isFindingPlayer;
  72. [HideInInspector]
  73. public bool isFindPlayer;
  74. public float hateDistance;
  75. [HideInInspector]
  76. public float distance;
  77. [HideInInspector]
  78. public Vector3 rushEndPos;
  79. public float aimDistance;
  80. public float rushTime;
  81. public float rushSpeed;
  82. [HideInInspector]
  83. public float time;
  84. public float readyCD;
  85. [HideInInspector]
  86. public Vector3 targetDir;
  87. public bool haveDownRush; //冲刺结束后是否可以接落地斩
  88. public bool rushHaveAttack; //冲刺是否带伤害
  89. public float downRushTime;
  90. public float finishRushTime;
  91. [Header("验证功能开关")]
  92. public bool upFirstAfterWeaknessOrNot; //虚弱结束后是否先升高
  93. private void Awake()
  94. {
  95. aimDistance = rushTime * rushSpeed / 2;
  96. }
  97. private void Start()
  98. {
  99. if (needToChange)
  100. {
  101. attackDistance = Random.Range(minAttackDis, maxAttackDis);
  102. }
  103. }
  104. public void OnDisable()
  105. {
  106. EnemyCreater.instance.OnEnemyRecycle(this);
  107. }
  108. public override void Init()
  109. {
  110. base.Init();
  111. moveSpeed = Random.Range(minMoveSpeed, maxMoveSpeed);
  112. ChangeSearchState(SearchState.NoTarget);
  113. }
  114. public override void FixedUpdate()
  115. {
  116. if (!noOnSearchState)
  117. {
  118. OnSearchState();
  119. }
  120. OnState();
  121. }
  122. public override Vector3 GetMoveDir()
  123. {
  124. Vector3 moveDir = Vector3.zero;
  125. if (canMove)
  126. {
  127. switch (searchState)
  128. {
  129. case SearchState.NoTarget:
  130. if (TowerMap.myTowers.Count == 0)
  131. {
  132. moveDir = Vector3.right;
  133. break;
  134. }
  135. float minDistance = Mathf.Infinity;
  136. int id = -1;
  137. for (int i = 0; i < TowerMap.myTowers.Count; i++)
  138. {
  139. Tower myTower = TowerMap.myTowers[i].GetComponent<Tower>();
  140. if (transform.position.y >
  141. myTower.transform.position.y + myTower.height)
  142. {
  143. continue;
  144. }
  145. float distance = Vector3.Distance(transform.position,
  146. TowerMap.myTowers[i].transform.position);
  147. if (distance < minDistance)
  148. {
  149. minDistance = distance;
  150. id = i;
  151. }
  152. }
  153. if (id == -1)
  154. {
  155. moveDir = Vector3.right;
  156. break;
  157. }
  158. if (bodyTrans.position.x > TowerMap.myTowers[id].transform.position.x)
  159. {
  160. moveDir = Vector3.left;
  161. }
  162. else
  163. {
  164. moveDir = Vector3.right;
  165. }
  166. break;
  167. case SearchState.InSearchScope:
  168. if (targetCharacter)
  169. {
  170. if (targetCharacter.transform.position.x - transform.position.x < 0)
  171. {
  172. moveDir = Vector3.left;
  173. }
  174. else
  175. {
  176. moveDir = Vector3.right;
  177. }
  178. }
  179. else
  180. {
  181. moveDir = Vector3.zero;
  182. }
  183. break;
  184. case SearchState.InAttackScope:
  185. if (targetCharacter)
  186. {
  187. if (targetCharacter.transform.position.x - transform.position.x < 0)
  188. {
  189. moveDir = Vector3.left;
  190. }
  191. else
  192. {
  193. moveDir = Vector3.right;
  194. }
  195. }
  196. else
  197. {
  198. moveDir = Vector3.zero;
  199. }
  200. break;
  201. default:
  202. break;
  203. }
  204. }
  205. if (!isBack)
  206. {
  207. return moveDir;
  208. }
  209. return -moveDir;
  210. }
  211. public bool GetAttack()
  212. {
  213. if (searchState == SearchState.InAttackScope)
  214. {
  215. return true;
  216. }
  217. return false;
  218. }
  219. public bool GetJump()
  220. {
  221. return false;
  222. }
  223. public bool AdjustHeight()
  224. {
  225. if (canFly)
  226. {
  227. if (transform.position.y - flyHeight > 0.1f)
  228. {
  229. Vector3 pos = transform.position;
  230. pos.y -= flyUpSpeed * Time.deltaTime;
  231. transform.position = pos;
  232. return false;
  233. }
  234. else if (transform.position.y - flyHeight < -0.1f)
  235. {
  236. Vector3 pos = transform.position;
  237. pos.y += flyUpSpeed * Time.deltaTime;
  238. transform.position = pos;
  239. return false;
  240. }
  241. }
  242. return true;
  243. }
  244. public override void OnState()
  245. {
  246. base.OnState();
  247. //hurtKeepTime -= Time.deltaTime;
  248. attackTime -= Time.deltaTime;
  249. dieKeepTime -= Time.deltaTime;
  250. invincibleTime -= Time.deltaTime;
  251. weakTime -= Time.deltaTime;
  252. beRepelValue += Time.deltaTime;
  253. Vector3 leftDir = GetMoveDir();
  254. bool isAttack = GetAttack();
  255. switch (state)
  256. {
  257. case CharacterState.Idle:
  258. if (isAttack)
  259. {
  260. Attack2();
  261. break;
  262. }
  263. if (!foot.TrigGround && !canFly)
  264. {
  265. if (rb.velocity.y > 0)
  266. {
  267. ChangeState(CharacterState.Rise);
  268. break;
  269. }
  270. else
  271. {
  272. ChangeState(CharacterState.Fall);
  273. break;
  274. }
  275. }
  276. if (leftDir.x > 0.3f || leftDir.x < -0.3f)
  277. {
  278. ChangeState(CharacterState.Run);
  279. break;
  280. }
  281. //rb.velocity = Vector3.zero;
  282. if (!upFirstAfterWeaknessOrNot)
  283. {
  284. AdjustHeight();
  285. }
  286. break;
  287. case CharacterState.Run:
  288. if (isAttack)
  289. {
  290. Attack2();
  291. break;
  292. }
  293. if (!foot.TrigGround && !canFly)
  294. {
  295. if (rb.velocity.y > 0)
  296. {
  297. ChangeState(CharacterState.Rise);
  298. break;
  299. }
  300. else
  301. {
  302. ChangeState(CharacterState.Fall);
  303. break;
  304. }
  305. }
  306. if (leftDir.x < 0.3f && leftDir.x > -0.3f)
  307. {
  308. ChangeState(CharacterState.Idle);
  309. break;
  310. }
  311. if (leftDir.x > 0.3f)
  312. {
  313. rb.velocity = Vector3.right * moveSpeed;
  314. if (bodyTrans.localScale.x > 0)
  315. {
  316. Turn();
  317. }
  318. }
  319. else if (leftDir.x < -0.3f)
  320. {
  321. rb.velocity = Vector3.left * moveSpeed;
  322. if (bodyTrans.localScale.x < 0)
  323. {
  324. Turn();
  325. }
  326. }
  327. if (!upFirstAfterWeaknessOrNot)
  328. {
  329. AdjustHeight();
  330. }
  331. break;
  332. case CharacterState.Rush:
  333. if (isAttack)
  334. {
  335. Attack2();
  336. break;
  337. }
  338. if (!foot.TrigGround && !canFly)
  339. {
  340. if (rb.velocity.y > 0)
  341. {
  342. ChangeState(CharacterState.Rise);
  343. break;
  344. }
  345. else
  346. {
  347. ChangeState(CharacterState.Fall);
  348. break;
  349. }
  350. }
  351. if (leftDir.x < 0.3f && leftDir.x > -0.3f)
  352. {
  353. ChangeState(CharacterState.Idle);
  354. break;
  355. }
  356. if (leftDir.x > 0.3f)
  357. {
  358. //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
  359. rb.velocity = Vector3.right * runSpeed;
  360. //if (rb.velocity.x > maxMoveSpeed)
  361. //{
  362. // rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  363. //}
  364. if (bodyTrans.localScale.x > 0)
  365. {
  366. Turn();
  367. }
  368. }
  369. else if (leftDir.x < -0.3f)
  370. {
  371. //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
  372. rb.velocity = Vector3.left * runSpeed;
  373. //if (rb.velocity.x < -maxMoveSpeed)
  374. //{
  375. // rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  376. //}
  377. if (bodyTrans.localScale.x < 0)
  378. {
  379. Turn();
  380. }
  381. }
  382. //AdjustHeight();
  383. break;
  384. case CharacterState.Rise:
  385. if (rb.velocity.y <= 0)
  386. {
  387. ChangeState(CharacterState.Fall);
  388. break;
  389. }
  390. rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
  391. break;
  392. case CharacterState.Fall:
  393. if (foot.TrigGround || canFly)
  394. {
  395. if (isFindingPlayer)
  396. {
  397. ChangeState(CharacterState.FindPlayer);
  398. }
  399. else if (willBeComa)
  400. {
  401. comaTime = willComaTime;
  402. ChangeState(CharacterState.Coma);
  403. }
  404. else
  405. {
  406. ChangeState(CharacterState.Idle);
  407. }
  408. break;
  409. }
  410. Vector3 velocity = rb.velocity;
  411. velocity.y += extraFallGravity * Time.deltaTime;
  412. if (leftDir.x > 0.3f)
  413. {
  414. velocity.x = moveSpeed;
  415. if (bodyTrans.localScale.x > 0)
  416. {
  417. Turn();
  418. }
  419. }
  420. else if (leftDir.x < -0.3f)
  421. {
  422. velocity.x = -moveSpeed;
  423. if (bodyTrans.localScale.x < 0)
  424. {
  425. Turn();
  426. }
  427. }
  428. rb.velocity = velocity;
  429. break;
  430. case CharacterState.Attack:
  431. if (attackTime <= 0)
  432. {
  433. ChangeState(CharacterState.Idle);
  434. break;
  435. }
  436. break;
  437. case CharacterState.Die:
  438. if (dieKeepTime <= 0)
  439. {
  440. gameObject.SetActive(false);
  441. break;
  442. }
  443. break;
  444. case CharacterState.Weak:
  445. if(rb.velocity.magnitude > 1)
  446. {
  447. if(!isBeBlownUp)
  448. {
  449. isBeBlownUp = true;
  450. ani.Play("hitted",0,0);
  451. aniCollider.Play("Hurt",0,0);
  452. }
  453. Vector3 vel = rb.velocity;
  454. if (foot.TrigGround && vel.y <= 0)
  455. {
  456. vel = Vector3.zero;
  457. }
  458. else
  459. {
  460. if (!hasBeReboundedX)
  461. {
  462. vel.x -= vel.x * decelerationRatio * Time.deltaTime;
  463. if (!hasBeReboundedX && isBeReboundedX)
  464. {
  465. hasBeReboundedX = true;
  466. vel.x = 0;
  467. }
  468. }
  469. if (!hasBeReboundedY)
  470. {
  471. vel.y += extraFallGravity * Time.deltaTime;
  472. if (!hasBeReboundedY && isBeReboundedY)
  473. {
  474. hasBeReboundedY = true;
  475. vel.y = 0;
  476. }
  477. }
  478. }
  479. //vel.y = vel.y * (1 - decelerationRatio * Time.deltaTime);
  480. //vel.x = vel.x * (1 - decelerationRatio * Time.deltaTime);
  481. rb.velocity = vel;
  482. }
  483. else
  484. {
  485. if (isBeBlownUp)
  486. {
  487. isBeBlownUp = false;
  488. isBeReboundedX = false;
  489. isBeReboundedY = false;
  490. hasBeReboundedX = false;
  491. hasBeReboundedY = false;
  492. }
  493. if (weakTime <= -0.1)
  494. {
  495. if (upFirstAfterWeaknessOrNot)
  496. {
  497. if (AdjustHeight())
  498. {
  499. ChangeState(CharacterState.Idle);
  500. }
  501. else
  502. {
  503. if (ani.GetCurrentAnimatorClipInfo(0)[0].clip.name != "walk")
  504. {
  505. ani.Play("walk", 0, 0);
  506. aniCollider.Play("Walk", 0, 0);
  507. }
  508. }
  509. }
  510. else
  511. {
  512. ChangeState(CharacterState.Idle);
  513. }
  514. break;
  515. }
  516. else
  517. {
  518. if (ani.GetCurrentAnimatorClipInfo(0)[0].clip.name != "weak")
  519. {
  520. ani.Play("weak", 0, 0);
  521. aniCollider.Play("Weak", 0, 0);
  522. rb.velocity = Vector3.zero;
  523. }
  524. }
  525. }
  526. break;
  527. case CharacterState.Coma:
  528. pastComaTime += Time.deltaTime;
  529. if (pastComaTime >= comaTime)
  530. {
  531. ChangeState(CharacterState.Idle);
  532. }
  533. break;
  534. case CharacterState.FindPlayer:
  535. if (!isFindPlayer)
  536. {
  537. if (!foot.TrigGround && !canFly)
  538. {
  539. if (rb.velocity.y > 0)
  540. {
  541. ChangeState(CharacterState.Rise);
  542. break;
  543. }
  544. else
  545. {
  546. ChangeState(CharacterState.Fall);
  547. break;
  548. }
  549. }
  550. if(targetCharacter == null)
  551. {
  552. ChosePlayer();
  553. if(targetCharacter == null)
  554. {
  555. ChangeState(CharacterState.FinishRush);
  556. time = finishRushTime;
  557. break;
  558. }
  559. }
  560. else
  561. {
  562. if (targetCharacter.isRevive ||
  563. targetCharacter.GetComponent<PlayerController>().isBaseBtnOut)
  564. {
  565. targetCharacter = null;
  566. break;
  567. }
  568. }
  569. if (Mathf.Abs(transform.position.x-targetCharacter.transform.position.x)
  570. < hateDistance)
  571. {
  572. rushEndPos = targetCharacter.transform.position;
  573. isFindPlayer = true;
  574. break;
  575. }
  576. if (targetCharacter.transform.position.x > transform.position.x)
  577. {
  578. rb.velocity = Vector3.right * moveSpeed;
  579. if (bodyTrans.localScale.x > 0)
  580. {
  581. Turn();
  582. }
  583. }
  584. if (targetCharacter.transform.position.x < transform.position.x)
  585. {
  586. rb.velocity = Vector3.left * moveSpeed;
  587. if (bodyTrans.localScale.x < 0)
  588. {
  589. Turn();
  590. }
  591. }
  592. }
  593. break;
  594. case CharacterState.ReadyToRush:
  595. time += Time.deltaTime;
  596. if (time >= readyCD)
  597. {
  598. time = 0;
  599. if (rushHaveAttack)
  600. {
  601. ChangeState(CharacterState.RushAttack);
  602. }
  603. else
  604. {
  605. ChangeState(CharacterState.Rush);
  606. }
  607. }
  608. break;
  609. case CharacterState.RushAttack:
  610. time += Time.deltaTime;
  611. dashEffect.canHit = true;
  612. Rush();
  613. if (time >= rushTime)
  614. {
  615. time = 0;
  616. if (haveDownRush)
  617. {
  618. if (foot.TrigGround)
  619. {
  620. ChangeState(CharacterState.FinishRush);
  621. }
  622. else
  623. {
  624. ChangeState(CharacterState.ReadyToDownRush);
  625. }
  626. }
  627. else
  628. {
  629. ChangeState(CharacterState.FinishRush);
  630. }
  631. }
  632. break;
  633. case CharacterState.ReadyToDownRush:
  634. time += Time.deltaTime;
  635. if (time >= downRushTime)
  636. {
  637. time = 0;
  638. ChangeState(CharacterState.DownRush);
  639. }
  640. break;
  641. case CharacterState.DownRush:
  642. if (transform.position.y > 0)
  643. {
  644. dashEffect.canHit = true;
  645. Rush();
  646. }
  647. if (foot.TrigGround || transform.position.y <= -1)
  648. {
  649. ChangeState(CharacterState.FinishRush);
  650. }
  651. break;
  652. case CharacterState.FinishRush:
  653. time += Time.deltaTime;
  654. if (time > finishRushTime)
  655. {
  656. time = 0;
  657. ChangeState(CharacterState.Idle);
  658. }
  659. break;
  660. default:
  661. break;
  662. }
  663. }
  664. public override void ChangeState(CharacterState newState)
  665. {
  666. if (state == newState)
  667. {
  668. return;
  669. }
  670. switch (state)
  671. {
  672. case CharacterState.Idle:
  673. break;
  674. case CharacterState.Run:
  675. rb.velocity = Vector3.zero;
  676. break;
  677. case CharacterState.Rush:
  678. rb.velocity = Vector3.zero;
  679. break;
  680. case CharacterState.Rise:
  681. if (!canFly)
  682. {
  683. bodyCollider.SetActive(true);
  684. }
  685. break;
  686. case CharacterState.Fall:
  687. rb.velocity = Vector3.zero;
  688. break;
  689. //case CharacterState.Hurt:
  690. // break;
  691. case CharacterState.Attack:
  692. aniCollider.Play("NotAttack", 1, 0);
  693. break;
  694. case CharacterState.Die:
  695. isDie = false;
  696. break;
  697. case CharacterState.Weak:
  698. beRepelValue = totalBeRepelValue;
  699. if (canFly)
  700. {
  701. rb.constraints = RigidbodyConstraints.FreezeRotation | RigidbodyConstraints.FreezePositionZ |RigidbodyConstraints.FreezePositionY;
  702. rb.useGravity = false;
  703. }
  704. if (isBeBlownUp)
  705. {
  706. isBeBlownUp = false;
  707. isBeReboundedX = false;
  708. isBeReboundedY = false;
  709. hasBeReboundedX = false;
  710. hasBeReboundedY = false;
  711. }
  712. break;
  713. case CharacterState.Float:
  714. canMove = true;
  715. break;
  716. case CharacterState.Coma:
  717. canMove = true;
  718. break;
  719. case CharacterState.FindPlayer:
  720. noOnSearchState = false;
  721. rb.velocity = Vector3.zero;
  722. isFindPlayer = false;
  723. break;
  724. case CharacterState.ReadyToRush:
  725. time = 0;
  726. aimEffect.SetActive(false);
  727. aimEffect.transform.localScale = Vector3.zero;
  728. rb.constraints =
  729. RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;
  730. break;
  731. case CharacterState.RushAttack:
  732. time = 0;
  733. dashEffect.canHit = false;
  734. rb.velocity = Vector3.zero;
  735. bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
  736. break;
  737. case CharacterState.ReadyToDownRush:
  738. time = 0;
  739. rb.constraints =
  740. RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;
  741. break;
  742. case CharacterState.DownRush:
  743. dashEffect.canHit = false;
  744. rb.velocity = Vector3.zero;
  745. bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
  746. if (foot.trigGroundList.Count == 0)
  747. {
  748. transform.position = new Vector3(transform.position.x, -1, 0);
  749. }
  750. else
  751. {
  752. transform.position = new Vector3(transform.position.x,
  753. foot.trigGroundList[0].transform.position.y, 0);
  754. }
  755. break;
  756. case CharacterState.FinishRush:
  757. time = 0;
  758. searchState = SearchState.NoTarget;
  759. noOnSearchState = false;
  760. ani.Play("idle", 0, 0);
  761. aniCollider.Play("Idle", 0, 0);
  762. break;
  763. default:
  764. break;
  765. }
  766. CharacterState oldState = state;
  767. state = newState;
  768. switch (newState)
  769. {
  770. case CharacterState.Idle:
  771. ani.Play("idle", 0, 0);
  772. aniCollider.Play("Idle", 0, 0);
  773. rb.velocity = Vector3.zero;
  774. //animalAni.SetInteger("state", (int)PlayerState.Idle);
  775. break;
  776. case CharacterState.Run:
  777. ani.Play("walk", 0, 0);
  778. aniCollider.Play("Walk", 0, 0);
  779. //animalAni.SetInteger("state", (int)PlayerState.Walk);
  780. break;
  781. case CharacterState.Rush:
  782. ani.Play("rush", 0, 0);
  783. aniCollider.Play("Rush", 0, 0);
  784. break;
  785. case CharacterState.Rise:
  786. aniCollider.Play("Rise", 0, 0);
  787. break;
  788. case CharacterState.Fall:
  789. aniCollider.Play("Fall", 0, 0);
  790. break;
  791. case CharacterState.Float:
  792. canMove = false;
  793. break;
  794. case CharacterState.Coma:
  795. if (willBeComa)
  796. {
  797. BeHit(comaDamage, Vector3.zero, false, 0);
  798. canFly = true;
  799. }
  800. //ani.Play("Coma", 0, 0);
  801. ani.Play("idle", 0, 0);
  802. aniCollider.Play("Idle", 0, 0);
  803. rb.velocity = Vector3.zero;
  804. pastComaTime = 0;
  805. break;
  806. case CharacterState.Attack:
  807. break;
  808. case CharacterState.Die:
  809. ani.Play("die", 0, 0);
  810. aniCollider.Play("Die", 0, 0);
  811. isDie = true;
  812. dieKeepTime = totalDieKeepTime;
  813. DropSouls();
  814. if (linked)
  815. {
  816. PlayersInput.instance[0].sprintLinkTrigger.linkedEnemy.Remove(this);
  817. PlayersInput.instance[0].playerRope.gameObject.SetActive(false);
  818. }
  819. break;
  820. case CharacterState.Weak:
  821. switch (oldState)
  822. {
  823. case CharacterState.ReadyToRush:
  824. case CharacterState.RushAttack:
  825. case CharacterState.ReadyToDownRush:
  826. case CharacterState.DownRush:
  827. case CharacterState.Rush:
  828. state = oldState;
  829. beRepelValue = totalBeRepelValue;
  830. break;
  831. default:
  832. weakTime = totalWeakTime;
  833. rb.AddForce(weakForce);
  834. if (canFly)
  835. {
  836. rb.constraints = RigidbodyConstraints.FreezeRotation | RigidbodyConstraints.FreezePositionZ;
  837. rb.useGravity = true;
  838. flyHeight = Random.Range(minHeight, maxHeight);
  839. }
  840. //hurtKeepTime = minHurtKeepTime;
  841. break;
  842. }
  843. break;
  844. case CharacterState.FindPlayer:
  845. isFindPlayer = false;
  846. isFindingPlayer = true;
  847. noOnSearchState = true;
  848. ChosePlayer();
  849. ani.Play("walk", 0, 0);
  850. aniCollider.Play("Walk", 0, 0);
  851. break;
  852. case CharacterState.ReadyToRush:
  853. time = 0;
  854. canNotChangeHurt = true;
  855. ani.Play("charge", 0, 0);
  856. aimEffect.SetActive(true);
  857. rb.constraints = RigidbodyConstraints.FreezeAll;
  858. ReadyToDash(rushEndPos + Vector3.up, transform.position + Vector3.up);
  859. break;
  860. case CharacterState.RushAttack:
  861. targetDir =
  862. (rushEndPos - transform.position).normalized;
  863. ani.Play("rush_attack", 0, 0);
  864. break;
  865. case CharacterState.ReadyToDownRush:
  866. time = 0;
  867. rb.constraints = RigidbodyConstraints.FreezeAll;
  868. ani.Play("charge", 0, 0);
  869. break;
  870. case CharacterState.DownRush:
  871. time = 0;
  872. targetDir = Vector3.down;
  873. ani.Play("rush_attack", 0, 0);
  874. break;
  875. case CharacterState.FinishRush:
  876. time = 0;
  877. if (oldState == CharacterState.DownRush)
  878. {
  879. ani.Play("fall_end", 0, 0);
  880. }
  881. else
  882. {
  883. ani.Play("idle", 0, 0);
  884. aniCollider.Play("Idle", 0, 0);
  885. }
  886. canNotChangeHurt = false;
  887. break;
  888. default:
  889. break;
  890. }
  891. }
  892. public void DropSouls()
  893. {
  894. int dropSoulNum = Random.Range(dropSoulMin, dropSoulMax+1);
  895. if (dropSoulNum > 1)
  896. {
  897. for (int i = 0; i < dropSoulNum; i++)
  898. {
  899. float angleInterval = dropSoulAngle / (float)(dropSoulNum - 1);
  900. float angle = 90 + ((float)i - (float)(dropSoulNum - 1) / 2) * angleInterval;
  901. angle = angle / 180 * Mathf.PI;
  902. GameObject soulObj = PoolManager.Instantiate(soulPrefab, transform.position);
  903. Vector3 dir = new Vector3(Mathf.Cos(angle), Mathf.Sin(angle), 0);
  904. Soul soul = soulObj.GetComponent<Soul>();
  905. soul.Burst(dir * soulStartSpeed);
  906. soul.type = type;
  907. }
  908. }
  909. else
  910. {
  911. GameObject soulObj = PoolManager.Instantiate(soulPrefab, transform.position);
  912. Vector3 dir = Vector3.up;
  913. Soul soul = soulObj.GetComponent<Soul>();
  914. soul.Burst(dir * soulStartSpeed);
  915. soul.type = type;
  916. }
  917. }
  918. public void Jump()
  919. {
  920. SetUpSpeed(jumpSpeed);
  921. ani.Play("jump", 0, 0);
  922. }
  923. public void SetUpSpeed(float speed)
  924. {
  925. ChangeState(CharacterState.Rise);
  926. Vector3 velocity = rb.velocity;
  927. Vector3 leftDir = GetMoveDir();
  928. if (leftDir.x > 0.3f)
  929. {
  930. if (bodyTrans.localScale.x > 0)
  931. {
  932. Turn();
  933. }
  934. }
  935. else if (leftDir.x < -0.3f)
  936. {
  937. if (bodyTrans.localScale.x < 0)
  938. {
  939. Turn();
  940. }
  941. }
  942. velocity.y = speed;
  943. rb.velocity = velocity;
  944. //animalAni.SetInteger("state", (int)PlayerState.Rise);
  945. }
  946. public void ChangeSearchState(SearchState newState)
  947. {
  948. switch (searchState)
  949. {
  950. case SearchState.NoTarget:
  951. break;
  952. case SearchState.InSearchScope:
  953. break;
  954. case SearchState.InAttackScope:
  955. break;
  956. default:
  957. break;
  958. }
  959. searchState = newState;
  960. switch (searchState)
  961. {
  962. case SearchState.NoTarget:
  963. Character character0 = PlayersInput.instance[0];
  964. Character character1 = PlayersInput.instance[1];
  965. if (character0.beTargetCharacter.Exists(t => t == this))
  966. {
  967. character0.beTargetCharacter.Remove(this);
  968. }
  969. if (character1.beTargetCharacter.Exists(t => t == this))
  970. {
  971. character1.beTargetCharacter.Remove(this);
  972. }
  973. targetCharacter = null;
  974. break;
  975. case SearchState.InSearchScope:
  976. break;
  977. case SearchState.InAttackScope:
  978. break;
  979. default:
  980. break;
  981. }
  982. }
  983. public bool SearchTarget()
  984. {
  985. targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);
  986. if (targetCharacter != null)
  987. {
  988. Character character0 = PlayersInput.instance[0];
  989. Character character1 = PlayersInput.instance[1];
  990. if (targetCharacter == character0
  991. && !character0.beTargetCharacter.Exists(t => t == this))
  992. {
  993. character0.beTargetCharacter.Add(this);
  994. }
  995. if (targetCharacter == character1
  996. && !character1.beTargetCharacter.Exists(t => t == this))
  997. {
  998. character1.beTargetCharacter.Add(this);
  999. }
  1000. return true;
  1001. }
  1002. else
  1003. {
  1004. return false;
  1005. }
  1006. }
  1007. public void OnSearchState()
  1008. {
  1009. switch (searchState)
  1010. {
  1011. case SearchState.NoTarget:
  1012. if (SearchTarget())
  1013. {
  1014. ChangeSearchState(SearchState.InSearchScope);
  1015. break;
  1016. }
  1017. //向玩家基地移动
  1018. break;
  1019. case SearchState.InSearchScope:
  1020. if (!SearchTarget())
  1021. {
  1022. targetCharacter = null;
  1023. ChangeSearchState(SearchState.NoTarget);
  1024. break;
  1025. }
  1026. if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
  1027. {
  1028. ChangeSearchState(SearchState.InAttackScope);
  1029. break;
  1030. }
  1031. break;
  1032. case SearchState.InAttackScope:
  1033. if (targetCharacter != null && !searchTrigger.IsCharacterLeave(targetCharacter, targetTypes, canHitFly))
  1034. {
  1035. if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie
  1036. || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
  1037. {
  1038. ChangeSearchState(SearchState.NoTarget);
  1039. }
  1040. }
  1041. else
  1042. {
  1043. ChangeSearchState(SearchState.NoTarget);
  1044. }
  1045. break;
  1046. default:
  1047. break;
  1048. }
  1049. }
  1050. public override void Attack1()
  1051. {
  1052. base.Attack1();
  1053. attackTarget = targetCharacter;
  1054. }
  1055. public override void Attack2()
  1056. {
  1057. base.Attack2();
  1058. attackTarget = targetCharacter;
  1059. }
  1060. public void ChosePlayer()
  1061. {
  1062. float distance0 = Mathf.Infinity;
  1063. float distance1 = Mathf.Infinity;
  1064. PlayerController player0 = PlayersInput.instance[0];
  1065. PlayerController player1 = PlayersInput.instance[1];
  1066. if (player0!=null && !player0.isRevive && !player0.isBaseBtnOut)
  1067. {
  1068. distance0 = Mathf.Abs(player0.transform.position.x
  1069. - transform.position.x);
  1070. }
  1071. if (player1!=null && !player1.isRevive && !player1.isBaseBtnOut)
  1072. {
  1073. distance1 = Mathf.Abs(player1.transform.position.x
  1074. - transform.position.x);
  1075. }
  1076. if(distance0 == Mathf.Infinity && distance1 == Mathf.Infinity)
  1077. {
  1078. targetCharacter = null;
  1079. return;
  1080. }
  1081. if (distance0 <= distance1)
  1082. {
  1083. targetCharacter = player0;
  1084. if (!player0.beTargetCharacter.Exists(t => t == this))
  1085. {
  1086. player0.beTargetCharacter.Add(this);
  1087. }
  1088. distance = distance0;
  1089. }
  1090. else
  1091. {
  1092. targetCharacter = player1;
  1093. if (!player1.beTargetCharacter.Exists(t => t == this))
  1094. {
  1095. player1.beTargetCharacter.Add(this);
  1096. }
  1097. distance = distance1;
  1098. }
  1099. }
  1100. public void ReadyToDash(Vector3 pos0, Vector3 pos1)
  1101. {
  1102. Vector3 target = (pos0 - pos1).normalized;
  1103. float distance = aimDistance;
  1104. aimEffect.transform.localScale =
  1105. new Vector3(distance, 1, 1);
  1106. targetDir = pos0 - pos1;
  1107. float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
  1108. if (targetDir.x < 0)
  1109. {
  1110. aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
  1111. if (bodyTrans.localScale.x < 0)
  1112. {
  1113. bodyTrans.localScale =
  1114. new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
  1115. }
  1116. }
  1117. else
  1118. {
  1119. aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
  1120. if (bodyTrans.localScale.x > 0)
  1121. {
  1122. bodyTrans.localScale =
  1123. new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
  1124. }
  1125. }
  1126. }
  1127. private void Rush()
  1128. {
  1129. float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
  1130. if (targetDir.x < 0)
  1131. {
  1132. dashEffect.offset = 1;
  1133. if (bodyTrans.localScale.x < 0)
  1134. {
  1135. bodyTrans.localScale =
  1136. new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
  1137. }
  1138. bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k - 180));
  1139. }
  1140. else
  1141. {
  1142. if (bodyTrans.localScale.x > 0)
  1143. {
  1144. bodyTrans.localScale =
  1145. new Vector3(-bodyTrans.localScale.x, bodyTrans.localScale.y, bodyTrans.localScale.z);
  1146. }
  1147. dashEffect.offset = -1;
  1148. bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k));
  1149. }
  1150. rb.velocity = targetDir * rushSpeed;
  1151. }
  1152. }