Demonic.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  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 int id;
  9. public float costMp = 10;
  10. public SearchState searchState;
  11. public float attackDistance;
  12. public bool canFly = false;
  13. private void Awake()
  14. {
  15. }
  16. private void OnDisable()
  17. {
  18. PlayerController.instance.OnDemonicRecycle(this);
  19. }
  20. public override void FixedUpdate()
  21. {
  22. OnSearchState();
  23. OnState();
  24. }
  25. public bool SearchTarget()
  26. {
  27. targetCharacter = searchTrigger.GetMinDisTarget(targetTypes, canHitFly);
  28. if (targetCharacter != null)
  29. {
  30. return true;
  31. }
  32. else
  33. {
  34. return false;
  35. }
  36. }
  37. public void ChangeSearchState(SearchState newState)
  38. {
  39. switch (searchState)
  40. {
  41. case SearchState.NoTarget:
  42. break;
  43. case SearchState.InSearchScope:
  44. break;
  45. case SearchState.InAttackScope:
  46. break;
  47. default:
  48. break;
  49. }
  50. searchState = newState;
  51. switch (searchState)
  52. {
  53. case SearchState.NoTarget:
  54. targetCharacter = null;
  55. break;
  56. case SearchState.InSearchScope:
  57. break;
  58. case SearchState.InAttackScope:
  59. break;
  60. default:
  61. break;
  62. }
  63. }
  64. public void OnSearchState()
  65. {
  66. switch (searchState)
  67. {
  68. case SearchState.NoTarget:
  69. if (SearchTarget())
  70. {
  71. ChangeSearchState(SearchState.InSearchScope);
  72. break;
  73. }
  74. //ĎňÍćźŇťůľŘŇĆśŻ
  75. break;
  76. case SearchState.InSearchScope:
  77. if (!SearchTarget())
  78. {
  79. targetCharacter = null;
  80. ChangeSearchState(SearchState.NoTarget);
  81. break;
  82. }
  83. if (targetCharacter != null && Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) <= attackDistance)
  84. {
  85. ChangeSearchState(SearchState.InAttackScope);
  86. break;
  87. }
  88. break;
  89. case SearchState.InAttackScope:
  90. if (targetCharacter != null)
  91. {
  92. if (!targetCharacter.gameObject.activeInHierarchy || targetCharacter.isDie
  93. || Mathf.Abs(targetCharacter.transform.position.x - transform.position.x) > attackDistance)
  94. {
  95. ChangeSearchState(SearchState.NoTarget);
  96. }
  97. }
  98. else
  99. {
  100. ChangeSearchState(SearchState.NoTarget);
  101. }
  102. break;
  103. default:
  104. break;
  105. }
  106. }
  107. public override Vector3 GetMoveDir()
  108. {
  109. Vector3 moveDir = Vector3.zero;
  110. switch (searchState)
  111. {
  112. case SearchState.NoTarget:
  113. //if (PlayerController.instance.bodyTrans.localScale.x > 0)
  114. //{
  115. // moveDir = Vector3.left;
  116. //}
  117. //else
  118. //{
  119. // moveDir = Vector3.right;
  120. //}
  121. moveDir = Vector3.left;
  122. break;
  123. case SearchState.InSearchScope:
  124. if (targetCharacter)
  125. {
  126. if (targetCharacter.transform.position.x - transform.position.x < 0)
  127. {
  128. moveDir = Vector3.left;
  129. }
  130. else
  131. {
  132. moveDir = Vector3.right;
  133. }
  134. }
  135. else
  136. {
  137. moveDir = Vector3.zero;
  138. }
  139. break;
  140. case SearchState.InAttackScope:
  141. if (targetCharacter)
  142. {
  143. if (targetCharacter.transform.position.x - transform.position.x < 0)
  144. {
  145. moveDir = Vector3.left;
  146. }
  147. else
  148. {
  149. moveDir = Vector3.right;
  150. }
  151. }
  152. else
  153. {
  154. moveDir = Vector3.zero;
  155. }
  156. break;
  157. default:
  158. break;
  159. }
  160. return moveDir;
  161. }
  162. public bool GetAttack()
  163. {
  164. if (searchState == SearchState.InAttackScope)
  165. {
  166. return true;
  167. }
  168. return false;
  169. }
  170. public override void OnState()
  171. {
  172. base.OnState();
  173. hurtKeepTime -= Time.deltaTime;
  174. attackTime -= Time.deltaTime;
  175. dieKeepTime -= Time.deltaTime;
  176. invincibleTime -= Time.deltaTime;
  177. weakTime -= Time.deltaTime;
  178. Vector3 leftDir = GetMoveDir();
  179. bool isAttack = GetAttack();
  180. switch (state)
  181. {
  182. case CharacterState.Idle:
  183. if (isAttack)
  184. {
  185. Attack2();
  186. break;
  187. }
  188. if (!foot.TrigGround && !canFly)
  189. {
  190. if (rb.velocity.y > 0)
  191. {
  192. ChangeState(CharacterState.Rise);
  193. break;
  194. }
  195. else
  196. {
  197. ChangeState(CharacterState.Fall);
  198. break;
  199. }
  200. }
  201. if (leftDir.x > 0.3f || leftDir.x < -0.3f)
  202. {
  203. ChangeState(CharacterState.Run);
  204. break;
  205. }
  206. //rb.velocity = Vector3.zero;
  207. break;
  208. case CharacterState.Run:
  209. if (isAttack)
  210. {
  211. Attack2();
  212. break;
  213. }
  214. if (!foot.TrigGround && !canFly)
  215. {
  216. if (rb.velocity.y > 0)
  217. {
  218. ChangeState(CharacterState.Rise);
  219. break;
  220. }
  221. else
  222. {
  223. ChangeState(CharacterState.Fall);
  224. break;
  225. }
  226. }
  227. if (leftDir.x < 0.3f && leftDir.x > -0.3f)
  228. {
  229. ChangeState(CharacterState.Idle);
  230. break;
  231. }
  232. if (leftDir.x > 0.3f)
  233. {
  234. //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
  235. rb.velocity = Vector3.right * moveSpeed;
  236. //if (rb.velocity.x > maxMoveSpeed)
  237. //{
  238. // rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  239. //}
  240. if (bodyTrans.localScale.x > 0)
  241. {
  242. Turn();
  243. }
  244. }
  245. else if (leftDir.x < -0.3f)
  246. {
  247. //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
  248. rb.velocity = Vector3.left * moveSpeed;
  249. //if (rb.velocity.x < -maxMoveSpeed)
  250. //{
  251. // rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  252. //}
  253. if (bodyTrans.localScale.x < 0)
  254. {
  255. Turn();
  256. }
  257. }
  258. break;
  259. case CharacterState.Rise:
  260. if (rb.velocity.y <= 0)
  261. {
  262. ChangeState(CharacterState.Fall);
  263. break;
  264. }
  265. //if (btnJumpPress || cacheJumpTime > 0)
  266. //{
  267. // if (!airJumped && rb.velocity.y < airJumpSpeed)
  268. // {
  269. // airJumped = true;
  270. // AirJump();
  271. // break;
  272. // }
  273. //}
  274. rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
  275. break;
  276. case CharacterState.Fall:
  277. if (foot.TrigGround || canFly)
  278. {
  279. ChangeState(CharacterState.Idle);
  280. break;
  281. }
  282. //if (foot.canStepPlayers.Count > 0)
  283. //{
  284. // Jump(jumpSpeed / 2);
  285. // StepOther();
  286. // break;
  287. //}
  288. //if (foot.canStepEnemyList.Count > 0)
  289. //{
  290. // Jump(jumpSpeed / 2);
  291. // StepEnemy();
  292. // break;
  293. //}
  294. //if (btnJumpPress || cacheJumpTime > 0)
  295. //{
  296. // if (!airJumped)
  297. // {
  298. // airJumped = true;
  299. // AirJump();
  300. // break;
  301. // }
  302. // else if (canJumpTick >= runner.Tick)
  303. // {
  304. // Jump();
  305. // break;
  306. // }
  307. //}
  308. rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
  309. break;
  310. case CharacterState.Hurt:
  311. if (hurtKeepTime <= 0)
  312. {
  313. ChangeState(CharacterState.Idle);
  314. break;
  315. }
  316. if (!foot.TrigGround)
  317. {
  318. rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
  319. }
  320. Vector3 vel = rb.velocity;
  321. vel.x = vel.x * (1 - decelerationRatio * Time.deltaTime);
  322. rb.velocity = vel;
  323. break;
  324. case CharacterState.Attack:
  325. if (attackTime <= 0)
  326. {
  327. ChangeState(CharacterState.Idle);
  328. break;
  329. }
  330. break;
  331. case CharacterState.Die:
  332. if (dieKeepTime <= 0)
  333. {
  334. print("Die:" + gameObject.name);
  335. gameObject.SetActive(false);
  336. break;
  337. }
  338. break;
  339. case CharacterState.Weak:
  340. if (weakTime <= 0)
  341. {
  342. ChangeState(CharacterState.Idle);
  343. break;
  344. }
  345. break;
  346. default:
  347. break;
  348. }
  349. }
  350. public override void ChangeState(CharacterState newState)
  351. {
  352. switch (state)
  353. {
  354. case CharacterState.Idle:
  355. break;
  356. case CharacterState.Run:
  357. rb.velocity = Vector3.zero;
  358. break;
  359. case CharacterState.Rise:
  360. break;
  361. case CharacterState.Fall:
  362. rb.velocity = Vector3.zero;
  363. break;
  364. case CharacterState.Hurt:
  365. break;
  366. case CharacterState.Attack:
  367. aniCollider.Play("NotAttack", 1, 0);
  368. break;
  369. case CharacterState.Die:
  370. isDie = false;
  371. break;
  372. case CharacterState.Weak:
  373. break;
  374. default:
  375. break;
  376. }
  377. CharacterState oldState = state;
  378. state = newState;
  379. switch (newState)
  380. {
  381. case CharacterState.Idle:
  382. ani.Play("idle", 0, 0);
  383. aniCollider.Play("Idle", 0, 0);
  384. rb.velocity = Vector3.zero;
  385. //animalAni.SetInteger("state", (int)PlayerState.Idle);
  386. break;
  387. case CharacterState.Run:
  388. ani.Play("walk", 0, 0);
  389. aniCollider.Play("Walk", 0, 0);
  390. //animalAni.SetInteger("state", (int)PlayerState.Walk);
  391. break;
  392. case CharacterState.Rise:
  393. aniCollider.Play("Rise", 0, 0);
  394. break;
  395. case CharacterState.Fall:
  396. aniCollider.Play("Fall", 0, 0);
  397. //animalAni.SetInteger("state", (int)PlayerState.Fall);
  398. break;
  399. case CharacterState.Hurt:
  400. ani.Play("hitted", 0, 0);
  401. aniCollider.Play("Hurt", 0, 0);
  402. invincibleTime = totalInvincibleTime;
  403. //ani.Play("Invincible", 2, 0);
  404. break;
  405. case CharacterState.Attack:
  406. break;
  407. case CharacterState.Die:
  408. ani.Play("die", 0, 0);
  409. aniCollider.Play("Die", 0, 0);
  410. isDie = true;
  411. dieKeepTime = totalDieKeepTime;
  412. break;
  413. case CharacterState.Weak:
  414. aniCollider.Play("Weak", 0, 0);
  415. ani.Play("weak", 0, 0);
  416. Vector3 velocity = rb.velocity;
  417. velocity.y = weakUpSpeed;
  418. rb.velocity = velocity;
  419. weakTime = totalWeakTime;
  420. break;
  421. default:
  422. break;
  423. }
  424. }
  425. public override void Attack1()
  426. {
  427. base.Attack1();
  428. Vector3 moveDir;
  429. if (PlayerController.instance.bodyTrans.localScale.x > 0)
  430. {
  431. moveDir = Vector3.left;
  432. }
  433. else
  434. {
  435. moveDir = Vector3.right;
  436. }
  437. if (moveDir.x > 0.3f)
  438. {
  439. if (bodyTrans.localScale.x > 0)
  440. {
  441. Turn();
  442. }
  443. }
  444. else if (moveDir.x < -0.3f)
  445. {
  446. if (bodyTrans.localScale.x < 0)
  447. {
  448. Turn();
  449. }
  450. }
  451. invincibleTime = totalAttack1Time;
  452. attackTarget = targetCharacter;
  453. }
  454. public override void Attack2()
  455. {
  456. base.Attack2();
  457. attackTarget = targetCharacter;
  458. }
  459. }