Demonic.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759
  1. using Spine.Unity;
  2. using Spine;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityEngine;
  6. public class Demonic : MoveCharacter
  7. {
  8. public PlayerController player; //召唤师
  9. public int id;
  10. public float costMp = 10;
  11. public float totalSummonTime = 0.5f;
  12. public SearchState searchState;
  13. public float attackDistance;
  14. public float maxAttackDis, minAttackDis;
  15. public bool needToChange;
  16. public bool canFly = false;
  17. public float flyHeight;
  18. public float flyUpSpeed = 10;
  19. public int sortingOrder = 0;
  20. public int playerID;
  21. public bool hasEffect = false;
  22. public Collider soulCollector;
  23. public bool isBack = false; //往反方向走
  24. public float runSpeed;
  25. private void Awake()
  26. {
  27. }
  28. private void Start()
  29. {
  30. if (needToChange)
  31. {
  32. attackDistance = Random.Range(minAttackDis, maxAttackDis);
  33. }
  34. }
  35. private void OnDisable()
  36. {
  37. PlayersInput.instance[playerID].OnDemonicRecycle(this);
  38. }
  39. public override void FixedUpdate()
  40. {
  41. if (!isNonAttack)
  42. {
  43. OnSearchState();
  44. }
  45. OnState();
  46. }
  47. public bool SearchTarget()
  48. {
  49. targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);
  50. if (targetCharacter != null)
  51. {
  52. return true;
  53. }
  54. else
  55. {
  56. return false;
  57. }
  58. }
  59. public void ChangeSearchState(SearchState newState)
  60. {
  61. switch (searchState)
  62. {
  63. case SearchState.NoTarget:
  64. break;
  65. case SearchState.InSearchScope:
  66. break;
  67. case SearchState.InAttackScope:
  68. break;
  69. default:
  70. break;
  71. }
  72. searchState = newState;
  73. switch (searchState)
  74. {
  75. case SearchState.NoTarget:
  76. targetCharacter = null;
  77. break;
  78. case SearchState.InSearchScope:
  79. break;
  80. case SearchState.InAttackScope:
  81. break;
  82. default:
  83. break;
  84. }
  85. }
  86. public void OnSearchState()
  87. {
  88. switch (searchState)
  89. {
  90. case SearchState.NoTarget:
  91. if (SearchTarget())
  92. {
  93. ChangeSearchState(SearchState.InSearchScope);
  94. break;
  95. }
  96. //向玩家基地移动
  97. break;
  98. case SearchState.InSearchScope:
  99. if (!SearchTarget())
  100. {
  101. targetCharacter = null;
  102. ChangeSearchState(SearchState.NoTarget);
  103. break;
  104. }
  105. if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
  106. {
  107. ChangeSearchState(SearchState.InAttackScope);
  108. break;
  109. }
  110. break;
  111. case SearchState.InAttackScope:
  112. if (targetCharacter != null && !searchTrigger.IsCharacterLeave(targetCharacter, targetTypes, canHitFly))
  113. {
  114. if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie
  115. || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
  116. {
  117. ChangeSearchState(SearchState.NoTarget);
  118. }
  119. }
  120. else
  121. {
  122. ChangeSearchState(SearchState.NoTarget);
  123. }
  124. break;
  125. default:
  126. break;
  127. }
  128. }
  129. public override Vector3 GetMoveDir()
  130. {
  131. Vector3 moveDir = Vector3.zero;
  132. if (canMove)
  133. {
  134. if (!isTran)
  135. {
  136. switch (searchState)
  137. {
  138. case SearchState.NoTarget:
  139. if(TowerMap.enemyTowers.Count == 0)
  140. {
  141. moveDir = Vector3.left;
  142. break;
  143. }
  144. float minDistance = Mathf.Infinity;
  145. int id = -1;
  146. for (int i = 0; i < TowerMap.enemyTowers.Count; i++)
  147. {
  148. EnemyTower enemyTower = TowerMap.enemyTowers[i].GetComponent<EnemyTower>();
  149. if(transform.position.y >
  150. enemyTower.transform.position.y + enemyTower.height)
  151. {
  152. continue;
  153. }
  154. float distance = Vector3.Distance(transform.position,
  155. TowerMap.enemyTowers[i].transform.position);
  156. if (distance < minDistance)
  157. {
  158. minDistance = distance;
  159. id = i;
  160. }
  161. }
  162. if(id == -1)
  163. {
  164. moveDir = Vector3.left;
  165. break;
  166. }
  167. if (bodyTrans.position.x > TowerMap.enemyTowers[id].transform.position.x)
  168. {
  169. moveDir = Vector3.left;
  170. }
  171. else
  172. {
  173. moveDir = Vector3.right;
  174. }
  175. break;
  176. case SearchState.InSearchScope:
  177. if (targetCharacter)
  178. {
  179. if (targetCharacter.transform.position.x - transform.position.x < 0)
  180. {
  181. moveDir = Vector3.left;
  182. }
  183. else
  184. {
  185. moveDir = Vector3.right;
  186. }
  187. }
  188. else
  189. {
  190. moveDir = Vector3.zero;
  191. }
  192. break;
  193. case SearchState.InAttackScope:
  194. if (targetCharacter)
  195. {
  196. if (targetCharacter.transform.position.x - transform.position.x < 0)
  197. {
  198. moveDir = Vector3.left;
  199. }
  200. else
  201. {
  202. moveDir = Vector3.right;
  203. }
  204. }
  205. else
  206. {
  207. moveDir = Vector3.zero;
  208. }
  209. break;
  210. default:
  211. break;
  212. }
  213. }
  214. else
  215. {
  216. if (pc == null)
  217. {
  218. pc = GetComponentInParent<PlayerController>();
  219. }
  220. moveDir = pc.GetMoveDir();
  221. }
  222. }
  223. if (!isBack)
  224. {
  225. return moveDir;
  226. }
  227. return -moveDir;
  228. }
  229. public bool GetAttack()
  230. {
  231. if (searchState == SearchState.InAttackScope)
  232. {
  233. return true;
  234. }
  235. return false;
  236. }
  237. public void AdjustHeight()
  238. {
  239. if (canFly && !isBeDropped)
  240. {
  241. if (transform.position.y - flyHeight > 0.1f)
  242. {
  243. Vector3 pos = transform.position;
  244. pos.y -= flyUpSpeed * Time.deltaTime;
  245. transform.position = pos;
  246. }
  247. else if (transform.position.y - flyHeight < -0.1f)
  248. {
  249. Vector3 pos = transform.position;
  250. pos.y += flyUpSpeed * Time.deltaTime;
  251. transform.position = pos;
  252. }
  253. }
  254. }
  255. public override void OnState()
  256. {
  257. base.OnState();
  258. //hurtKeepTime -= Time.deltaTime;
  259. attackTime -= Time.deltaTime;
  260. dieKeepTime -= Time.deltaTime;
  261. invincibleTime -= Time.deltaTime;
  262. weakTime -= Time.deltaTime;
  263. beRepelValue += Time.deltaTime;
  264. Vector3 leftDir = GetMoveDir();
  265. bool isAttack = GetAttack();
  266. switch (state)
  267. {
  268. case CharacterState.Idle:
  269. if (isAttack)
  270. {
  271. Attack2();
  272. break;
  273. }
  274. if (!foot.TrigGround && !canFly)
  275. {
  276. if (rb.velocity.y > 0)
  277. {
  278. ChangeState(CharacterState.Rise);
  279. break;
  280. }
  281. else
  282. {
  283. ChangeState(CharacterState.Fall);
  284. break;
  285. }
  286. }
  287. if (leftDir.x > 0.3f || leftDir.x < -0.3f)
  288. {
  289. ChangeState(CharacterState.Run);
  290. break;
  291. }
  292. AdjustHeight();
  293. rb.velocity = Vector3.right * velocityAddition;
  294. break;
  295. case CharacterState.Run:
  296. if (isAttack)
  297. {
  298. Attack2();
  299. break;
  300. }
  301. if (!foot.TrigGround && !canFly)
  302. {
  303. if (rb.velocity.y > 0)
  304. {
  305. ChangeState(CharacterState.Rise);
  306. break;
  307. }
  308. else
  309. {
  310. ChangeState(CharacterState.Fall);
  311. break;
  312. }
  313. }
  314. if (leftDir.x < 0.3f && leftDir.x > -0.3f)
  315. {
  316. ChangeState(CharacterState.Idle);
  317. break;
  318. }
  319. if (leftDir.x > 0.3f)
  320. {
  321. //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
  322. rb.velocity = Vector3.right * (moveSpeed + velocityAddition);
  323. //if (rb.velocity.x > maxMoveSpeed)
  324. //{
  325. // rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  326. //}
  327. if (bodyTrans.localScale.x > 0)
  328. {
  329. Turn();
  330. }
  331. }
  332. else if (leftDir.x < -0.3f)
  333. {
  334. //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
  335. rb.velocity = Vector3.right *( -moveSpeed + velocityAddition);
  336. //if (rb.velocity.x < -maxMoveSpeed)
  337. //{
  338. // rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  339. //}
  340. if (bodyTrans.localScale.x < 0)
  341. {
  342. Turn();
  343. }
  344. }
  345. AdjustHeight();
  346. break;
  347. case CharacterState.Rush:
  348. if (isAttack)
  349. {
  350. Attack2();
  351. break;
  352. }
  353. if (!foot.TrigGround && !canFly)
  354. {
  355. if (rb.velocity.y > 0)
  356. {
  357. ChangeState(CharacterState.Rise);
  358. break;
  359. }
  360. else
  361. {
  362. ChangeState(CharacterState.Fall);
  363. break;
  364. }
  365. }
  366. if (leftDir.x < 0.3f && leftDir.x > -0.3f)
  367. {
  368. ChangeState(CharacterState.Idle);
  369. break;
  370. }
  371. if (leftDir.x > 0.3f)
  372. {
  373. //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
  374. rb.velocity = Vector3.right * runSpeed;
  375. //if (rb.velocity.x > maxMoveSpeed)
  376. //{
  377. // rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  378. //}
  379. if (bodyTrans.localScale.x > 0)
  380. {
  381. Turn();
  382. }
  383. }
  384. else if (leftDir.x < -0.3f)
  385. {
  386. //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
  387. rb.velocity = Vector3.left * runSpeed;
  388. //if (rb.velocity.x < -maxMoveSpeed)
  389. //{
  390. // rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  391. //}
  392. if (bodyTrans.localScale.x < 0)
  393. {
  394. Turn();
  395. }
  396. }
  397. AdjustHeight();
  398. break;
  399. case CharacterState.Rise:
  400. if (rb.velocity.y <= 0)
  401. {
  402. ChangeState(CharacterState.Fall);
  403. break;
  404. }
  405. //if (btnJumpPress || cacheJumpTime > 0)
  406. //{
  407. // if (!airJumped && rb.velocity.y < airJumpSpeed)
  408. // {
  409. // airJumped = true;
  410. // AirJump();
  411. // break;
  412. // }
  413. //}
  414. rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
  415. break;
  416. case CharacterState.Fall:
  417. if (foot.TrigGround || canFly)
  418. {
  419. if (!isBeDropped)
  420. {
  421. ChangeState(CharacterState.Idle);
  422. }
  423. break;
  424. }
  425. //if (foot.canStepPlayers.Count > 0)
  426. //{
  427. // Jump(jumpSpeed / 2);
  428. // StepOther();
  429. // break;
  430. //}
  431. //if (foot.canStepEnemyList.Count > 0)
  432. //{
  433. // Jump(jumpSpeed / 2);
  434. // StepEnemy();
  435. // break;
  436. //}
  437. //if (btnJumpPress || cacheJumpTime > 0)
  438. //{
  439. // if (!airJumped)
  440. // {
  441. // airJumped = true;
  442. // AirJump();
  443. // break;
  444. // }
  445. // else if (canJumpTick >= runner.Tick)
  446. // {
  447. // Jump();
  448. // break;
  449. // }
  450. //}
  451. rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
  452. break;
  453. //case CharacterState.Hurt:
  454. // if (hurtKeepTime <= 0 && rb.velocity.magnitude < hurtChangeVelocity)
  455. // {
  456. // ChangeState(CharacterState.Idle);
  457. // break;
  458. // }
  459. // if (!foot.TrigGround)
  460. // {
  461. // rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
  462. // }
  463. // Vector3 vel = rb.velocity;
  464. // vel.x = vel.x * (1 - decelerationRatio * Time.deltaTime);
  465. // rb.velocity = vel;
  466. // break;
  467. case CharacterState.Coma:
  468. if (!isCaughtByCook)
  469. {
  470. pastComaTime += Time.deltaTime;
  471. if (pastComaTime >= comaTime)
  472. {
  473. ChangeState(CharacterState.Idle);
  474. }
  475. }
  476. break;
  477. case CharacterState.Attack:
  478. if (attackTime <= 0)
  479. {
  480. ChangeState(CharacterState.Idle);
  481. break;
  482. }
  483. rb.velocity = new Vector3(velocityAddition,rb.velocity.y,rb.velocity.z);
  484. break;
  485. case CharacterState.Die:
  486. if (dieKeepTime <= 0)
  487. {
  488. if (!isSpirit)
  489. {
  490. Corpse.allCorpsesNum += 1;
  491. Corpse.isChange = true;
  492. }
  493. gameObject.SetActive(false);
  494. break;
  495. }
  496. break;
  497. case CharacterState.Weak:
  498. if (rb.velocity.magnitude > 1)
  499. {
  500. if (ani.GetCurrentAnimatorClipInfo(0)[0].clip.name != "hitted")
  501. {
  502. ani.Play("hitted", 0, 0);
  503. aniCollider.Play("Hurt", 0, 0);
  504. }
  505. Vector3 vel = rb.velocity;
  506. if (!canFly)
  507. {
  508. if (foot.TrigGround && vel.y < 0)
  509. {
  510. vel.y = 0;
  511. }
  512. else
  513. {
  514. vel += Vector3.up * extraFallGravity * Time.deltaTime;
  515. }
  516. }
  517. vel.y = vel.y * (1 - decelerationRatio * Time.deltaTime);
  518. vel.x = vel.x * (1 - decelerationRatio * Time.deltaTime);
  519. rb.velocity = vel;
  520. }
  521. else
  522. {
  523. if (ani.GetCurrentAnimatorClipInfo(0)[0].clip.name != "weak")
  524. {
  525. ani.Play("weak", 0, 0);
  526. aniCollider.Play("Weak", 0, 0);
  527. rb.velocity = Vector3.zero;
  528. weakTime = totalWeakTime;
  529. }
  530. rb.velocity = new Vector3(velocityAddition, rb.velocity.y,0);
  531. }
  532. if (weakTime <= 0)
  533. {
  534. ChangeState(CharacterState.Idle);
  535. break;
  536. }
  537. break;
  538. default:
  539. break;
  540. }
  541. }
  542. public override void ChangeState(CharacterState newState)
  543. {
  544. if(state == newState)
  545. {
  546. return;
  547. }
  548. switch (state)
  549. {
  550. case CharacterState.Idle:
  551. break;
  552. case CharacterState.Run:
  553. rb.velocity = Vector3.zero;
  554. break;
  555. case CharacterState.Rush:
  556. rb.velocity = Vector3.zero;
  557. break;
  558. case CharacterState.Rise:
  559. if (!canFly)
  560. {
  561. bodyCollider.SetActive(true);
  562. }
  563. break;
  564. case CharacterState.Fall:
  565. rb.velocity = Vector3.zero;
  566. break;
  567. //case CharacterState.Hurt:
  568. // break;
  569. case CharacterState.Coma:
  570. canMove = true;
  571. foreach(GameObject i in HitCols)
  572. {
  573. i.SetActive(true);
  574. }
  575. break;
  576. case CharacterState.Attack:
  577. aniCollider.Play("NotAttack", 1, 0);
  578. break;
  579. case CharacterState.Die:
  580. isDie = false;
  581. break;
  582. case CharacterState.Weak:
  583. beRepelValue = totalBeRepelValue;
  584. break;
  585. case CharacterState.Float:
  586. canMove = true;
  587. break;
  588. default:
  589. break;
  590. }
  591. CharacterState oldState = state;
  592. state = newState;
  593. switch (newState)
  594. {
  595. case CharacterState.Idle:
  596. ani.Play("idle", 0, 0);
  597. aniCollider.Play("Idle", 0, 0);
  598. rb.velocity = Vector3.zero;
  599. //animalAni.SetInteger("state", (int)PlayerState.Idle);
  600. break;
  601. case CharacterState.Run:
  602. ani.Play("walk", 0, 0);
  603. aniCollider.Play("Walk", 0, 0);
  604. //animalAni.SetInteger("state", (int)PlayerState.Walk);
  605. break;
  606. case CharacterState.Rush:
  607. ani.Play("rush", 0, 0);
  608. aniCollider.Play("Rush", 0, 0);
  609. break;
  610. case CharacterState.Rise:
  611. aniCollider.Play("Rise", 0, 0);
  612. break;
  613. case CharacterState.Fall:
  614. ani.Play("fall", 0, 0);
  615. aniCollider.Play("Fall", 0, 0);
  616. //animalAni.SetInteger("state", (int)PlayerState.Fall);
  617. break;
  618. //case CharacterState.Hurt:
  619. // ani.Play("hitted", 0, 0);
  620. // aniCollider.Play("Hurt", 0, 0);
  621. // invincibleTime = totalInvincibleTime;
  622. // hurtKeepTime = minHurtKeepTime;
  623. // //ani.Play("Invincible", 2, 0);
  624. // break;
  625. case CharacterState.Coma:
  626. //ani.Play("Coma", 0, 0);
  627. ani.Play("idle", 0, 0);
  628. aniCollider.Play("Idle", 0, 0);
  629. if (isCaughtByCook)
  630. {
  631. foreach (GameObject i in HitCols)
  632. {
  633. i.SetActive(false);
  634. }
  635. }
  636. pastComaTime = 0;
  637. rb.velocity = Vector3.zero;
  638. break;
  639. case CharacterState.Attack:
  640. break;
  641. case CharacterState.Die:
  642. ani.Play("die", 0, 0);
  643. aniCollider.Play("Die", 0, 0);
  644. isDie = true;
  645. dieKeepTime = totalDieKeepTime;
  646. break;
  647. case CharacterState.Weak:
  648. weakTime = totalWeakTime;
  649. break;
  650. case CharacterState.Float:
  651. canMove = false;
  652. break;
  653. default:
  654. break;
  655. }
  656. }
  657. public override void Attack1()
  658. {
  659. base.Attack1();
  660. Vector3 moveDir;
  661. if (PlayersInput.instance[playerID].bodyTrans.localScale.x > 0)
  662. {
  663. moveDir = Vector3.left;
  664. }
  665. else
  666. {
  667. moveDir = Vector3.right;
  668. }
  669. if (moveDir.x > 0.3f)
  670. {
  671. if (bodyTrans.localScale.x > 0)
  672. {
  673. Turn();
  674. }
  675. }
  676. else if (moveDir.x < -0.3f)
  677. {
  678. if (bodyTrans.localScale.x < 0)
  679. {
  680. Turn();
  681. }
  682. }
  683. invincibleTime = totalAttack1Time;
  684. attackTarget = targetCharacter;
  685. }
  686. public override void Attack2()
  687. {
  688. base.Attack2();
  689. attackTarget = targetCharacter;
  690. }
  691. private List<AttackInfo> origAttackInfos = new List<AttackInfo>();
  692. private float origAttackTime;
  693. private int count;
  694. public GameObject attributeUpEffect;
  695. private GameObject curUpEffect;
  696. public bool hasUp = false;
  697. public bool isFirst = true;
  698. public void AttackAttributesUp(float upDamageDegree, float upAttackSpeedDegree, float conTime) //提升攻击和攻速
  699. {
  700. if (isFirst)
  701. {
  702. isFirst = false;
  703. curUpEffect = Instantiate(attributeUpEffect, transform.position, new Quaternion(0, 0, 0, 0), transform);
  704. }
  705. curUpEffect.SetActive(true);
  706. count = attack2Infos.Count;
  707. for (int i = 0; i < count; i++)
  708. {
  709. AttackInfo a = attack2Infos[i];
  710. origAttackInfos.Add(a);
  711. int d = a.damage;
  712. a.damage = (int)(d * (1 + upDamageDegree));
  713. attack2Infos[i] = a;
  714. }
  715. origAttackTime = totalAttack2Time;
  716. totalAttack2Time = totalAttack2Time / (1 + upAttackSpeedDegree);
  717. Invoke("AttackAttributesBack", conTime);
  718. }
  719. public void AttackAttributesBack()
  720. {
  721. curUpEffect.SetActive(false);
  722. for (int i = 0; i < count; i++)
  723. {
  724. attack2Infos[i] = origAttackInfos[i];
  725. }
  726. totalAttack2Time = origAttackTime;
  727. hasUp = false;
  728. }
  729. }