Demonic.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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. break;
  122. case SearchState.InSearchScope:
  123. if (targetCharacter)
  124. {
  125. if (targetCharacter.transform.position.x - transform.position.x < 0)
  126. {
  127. moveDir = Vector3.left;
  128. }
  129. else
  130. {
  131. moveDir = Vector3.right;
  132. }
  133. }
  134. else
  135. {
  136. moveDir = Vector3.zero;
  137. }
  138. break;
  139. case SearchState.InAttackScope:
  140. if (targetCharacter)
  141. {
  142. if (targetCharacter.transform.position.x - transform.position.x < 0)
  143. {
  144. moveDir = Vector3.left;
  145. }
  146. else
  147. {
  148. moveDir = Vector3.right;
  149. }
  150. }
  151. else
  152. {
  153. moveDir = Vector3.zero;
  154. }
  155. break;
  156. default:
  157. break;
  158. }
  159. return moveDir;
  160. }
  161. public bool GetAttack()
  162. {
  163. if (searchState == SearchState.InAttackScope)
  164. {
  165. return true;
  166. }
  167. return false;
  168. }
  169. public override void OnState()
  170. {
  171. base.OnState();
  172. hurtKeepTime -= Time.deltaTime;
  173. attackTime -= Time.deltaTime;
  174. dieKeepTime -= Time.deltaTime;
  175. invincibleTime -= Time.deltaTime;
  176. Vector3 leftDir = GetMoveDir();
  177. bool isAttack = GetAttack();
  178. switch (state)
  179. {
  180. case CharacterState.Idle:
  181. if (isAttack)
  182. {
  183. Attack2();
  184. break;
  185. }
  186. if (!foot.TrigGround && !canFly)
  187. {
  188. if (rb.velocity.y > 0)
  189. {
  190. ChangeState(CharacterState.Rise);
  191. break;
  192. }
  193. else
  194. {
  195. ChangeState(CharacterState.Fall);
  196. break;
  197. }
  198. }
  199. if (leftDir.x > 0.3f || leftDir.x < -0.3f)
  200. {
  201. ChangeState(CharacterState.Run);
  202. break;
  203. }
  204. //rb.velocity = Vector3.zero;
  205. break;
  206. case CharacterState.Run:
  207. if (isAttack)
  208. {
  209. Attack2();
  210. break;
  211. }
  212. if (!foot.TrigGround && !canFly)
  213. {
  214. if (rb.velocity.y > 0)
  215. {
  216. ChangeState(CharacterState.Rise);
  217. break;
  218. }
  219. else
  220. {
  221. ChangeState(CharacterState.Fall);
  222. break;
  223. }
  224. }
  225. if (leftDir.x < 0.3f && leftDir.x > -0.3f)
  226. {
  227. ChangeState(CharacterState.Idle);
  228. break;
  229. }
  230. if (leftDir.x > 0.3f)
  231. {
  232. //rb.velocity += Vector3.right * moveAcc * Time.deltaTime;
  233. rb.velocity = Vector3.right * moveSpeed;
  234. //if (rb.velocity.x > maxMoveSpeed)
  235. //{
  236. // rb.velocity = new Vector3(maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  237. //}
  238. if (bodyTrans.localScale.x > 0)
  239. {
  240. Turn();
  241. }
  242. }
  243. else if (leftDir.x < -0.3f)
  244. {
  245. //rb.velocity -= Vector3.right * moveAcc * Time.deltaTime;
  246. rb.velocity = Vector3.left * moveSpeed;
  247. //if (rb.velocity.x < -maxMoveSpeed)
  248. //{
  249. // rb.velocity = new Vector3(-maxMoveSpeed, rb.velocity.y, rb.velocity.z);
  250. //}
  251. if (bodyTrans.localScale.x < 0)
  252. {
  253. Turn();
  254. }
  255. }
  256. break;
  257. case CharacterState.Rise:
  258. if (rb.velocity.y <= 0)
  259. {
  260. ChangeState(CharacterState.Fall);
  261. break;
  262. }
  263. //if (btnJumpPress || cacheJumpTime > 0)
  264. //{
  265. // if (!airJumped && rb.velocity.y < airJumpSpeed)
  266. // {
  267. // airJumped = true;
  268. // AirJump();
  269. // break;
  270. // }
  271. //}
  272. rb.velocity += Vector3.up * extraRiseGravity * Time.deltaTime;
  273. break;
  274. case CharacterState.Fall:
  275. if (foot.TrigGround || canFly)
  276. {
  277. ChangeState(CharacterState.Idle);
  278. break;
  279. }
  280. //if (foot.canStepPlayers.Count > 0)
  281. //{
  282. // Jump(jumpSpeed / 2);
  283. // StepOther();
  284. // break;
  285. //}
  286. //if (foot.canStepEnemyList.Count > 0)
  287. //{
  288. // Jump(jumpSpeed / 2);
  289. // StepEnemy();
  290. // break;
  291. //}
  292. //if (btnJumpPress || cacheJumpTime > 0)
  293. //{
  294. // if (!airJumped)
  295. // {
  296. // airJumped = true;
  297. // AirJump();
  298. // break;
  299. // }
  300. // else if (canJumpTick >= runner.Tick)
  301. // {
  302. // Jump();
  303. // break;
  304. // }
  305. //}
  306. rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
  307. break;
  308. case CharacterState.Hurt:
  309. if (hurtKeepTime <= 0)
  310. {
  311. ChangeState(CharacterState.Idle);
  312. break;
  313. }
  314. if (!foot.TrigGround && !canFly)
  315. {
  316. rb.velocity += Vector3.up * extraFallGravity * Time.deltaTime;
  317. }
  318. break;
  319. case CharacterState.Attack:
  320. if (attackTime <= 0)
  321. {
  322. ChangeState(CharacterState.Idle);
  323. break;
  324. }
  325. break;
  326. case CharacterState.Die:
  327. if (dieKeepTime <= 0)
  328. {
  329. print("Die:" + gameObject.name);
  330. gameObject.SetActive(false);
  331. break;
  332. }
  333. break;
  334. default:
  335. break;
  336. }
  337. }
  338. public override void ChangeState(CharacterState newState)
  339. {
  340. switch (state)
  341. {
  342. case CharacterState.Idle:
  343. break;
  344. case CharacterState.Run:
  345. rb.velocity = Vector3.zero;
  346. break;
  347. case CharacterState.Rise:
  348. break;
  349. case CharacterState.Fall:
  350. rb.velocity = Vector3.zero;
  351. break;
  352. case CharacterState.Hurt:
  353. break;
  354. case CharacterState.Attack:
  355. aniCollider.Play("NotAttack", 1, 0);
  356. break;
  357. case CharacterState.Die:
  358. isDie = false;
  359. break;
  360. default:
  361. break;
  362. }
  363. CharacterState oldState = state;
  364. state = newState;
  365. switch (newState)
  366. {
  367. case CharacterState.Idle:
  368. ani.Play("idle", 0, 0);
  369. aniCollider.Play("Idle", 0, 0);
  370. rb.velocity = Vector3.zero;
  371. //animalAni.SetInteger("state", (int)PlayerState.Idle);
  372. break;
  373. case CharacterState.Run:
  374. ani.Play("walk", 0, 0);
  375. aniCollider.Play("Walk", 0, 0);
  376. //animalAni.SetInteger("state", (int)PlayerState.Walk);
  377. break;
  378. case CharacterState.Rise:
  379. aniCollider.Play("Rise", 0, 0);
  380. break;
  381. case CharacterState.Fall:
  382. aniCollider.Play("Fall", 0, 0);
  383. //animalAni.SetInteger("state", (int)PlayerState.Fall);
  384. break;
  385. case CharacterState.Hurt:
  386. ani.Play("hitted", 0, 0);
  387. aniCollider.Play("Hurt", 0, 0);
  388. invincibleTime = totalInvincibleTime;
  389. //ani.Play("Invincible", 2, 0);
  390. break;
  391. case CharacterState.Attack:
  392. break;
  393. case CharacterState.Die:
  394. ani.Play("die", 0, 0);
  395. aniCollider.Play("Die", 0, 0);
  396. isDie = true;
  397. dieKeepTime = totalDieKeepTime;
  398. break;
  399. default:
  400. break;
  401. }
  402. }
  403. public override void Attack1()
  404. {
  405. base.Attack1();
  406. invincibleTime = totalAttack1Time;
  407. attackTarget = targetCharacter;
  408. }
  409. public override void Attack2()
  410. {
  411. base.Attack2();
  412. attackTarget = targetCharacter;
  413. }
  414. }