ESpirits_Cook.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using TMPro;
  5. using System;
  6. using Random = UnityEngine.Random;
  7. public class ESpirits_Cook : MonoBehaviour
  8. {
  9. public TextMeshProUGUI text; //剩余串的数量文本
  10. private GameObject dia; //文本框
  11. private Transform cook; //厨子
  12. private Animator ani; //厨子动画
  13. private Collider col; //厨子的碰撞体
  14. public int chuan; //厨子拥有多少串
  15. public bool isGood; //厨子是否是好厨子
  16. public GameObject[] colliders; //一些要开要关的collider
  17. private float intervalTimePast;
  18. public float intervalTimeSell; //卖串的间隔时间
  19. private bool isInterval = false; //开始计算间隔时间
  20. public float minX; //厨子卖串的最小地址站
  21. public float maxX; //厨子卖串的最大地址站
  22. public float value; //加血程度百分比
  23. public GameObject effect; //加血效果
  24. private Enemy ene; //厨子的enemy脚本
  25. private float activeTime; //厨子已出现的时长
  26. public float activeAniTime; //厨子出现动画的时长
  27. private bool isAct = false; //厨子已经完整出现
  28. public float larger; //顾客变大的程度
  29. private GameObject target;
  30. public SearchTrigger searchtrigger;
  31. public GameObject lockEffect;
  32. private GameObject curLock;
  33. //public GameObject cookKillEffect;
  34. private float pastTime;
  35. public float cookTime;
  36. public float seizeTime;
  37. public float chargeTime;
  38. private float destX;
  39. public enum cookState
  40. {
  41. sell = 0,
  42. run = 1,
  43. seize = 2, //抓住
  44. back = 3,
  45. cook = 4,
  46. first = 5, //刚出生
  47. }
  48. private cookState state;
  49. private GameObject food; //被抓的食材
  50. private void Start()
  51. {
  52. cook = transform.parent;
  53. ene = cook.GetComponent<Enemy>();
  54. ani = ene.ani;
  55. col = GetComponent<Collider>();
  56. col.enabled = false;
  57. dia = text.transform.parent.gameObject;
  58. dia.SetActive(false);
  59. //customers = new List<GameObject>();
  60. destX = DestinationX();
  61. text.text = chuan.ToString();
  62. ene.noOnSearchState = true;
  63. //curLock = Instantiate(lockEffect, cook.transform.position, new Quaternion(0, 0, 0, 0), cook.transform);
  64. }
  65. private float DestinationX()
  66. {
  67. float x = Random.Range(minX, maxX);
  68. return x;
  69. }
  70. private void ToRush()
  71. {
  72. ChangeState(cookState.run);
  73. }
  74. private void TargetInteract()
  75. {
  76. }
  77. private void OnTriggerEnter(Collider other)
  78. {
  79. //路过发串
  80. if (state == cookState.sell && (other.gameObject.layer == 7 || other.gameObject.layer == 8 || other.gameObject.layer == 6))
  81. {
  82. if (!isInterval && chuan > 0)
  83. {
  84. GameObject ga = other.transform.parent.parent.parent.gameObject;
  85. Character ca = ga.GetComponent<Character>();
  86. if (!ca.cooks.Exists(T => T == gameObject))
  87. {
  88. isInterval = true;
  89. chuan -= 1;
  90. text.text = chuan.ToString();
  91. ani.Play("attack_march", 0, 0);
  92. ca.HpUp(value, larger);
  93. ca.cooks.Add(gameObject);
  94. //count += 1;
  95. //Instantiate(effect, ga.transform.position, new Quaternion(0, 0, 0, 0), ga.transform);
  96. if (chuan == 0)
  97. {
  98. ani.Play("charge", 0, 0);
  99. Invoke("ToRush", chargeTime);
  100. }
  101. }
  102. }
  103. }
  104. //抓人
  105. else if (state == cookState.run)
  106. {
  107. if (other.gameObject.layer == 6 || other.gameObject.layer == 7)
  108. {
  109. food = other.transform.parent.parent.parent.gameObject;
  110. if (food.layer == 7 && !food.GetComponent<Demonic>().isDie)
  111. {
  112. food.GetComponent<Demonic>().ChangeState(CharacterState.Coma);
  113. //cookKillEffect.SetActive(true);
  114. ChangeState(cookState.seize);
  115. }
  116. else if (food.layer == 6 && !food.GetComponent<PlayerController>().isDie)
  117. {
  118. food.GetComponent<PlayerController>().ChangeState(CharacterState.Coma);
  119. //cookKillEffect.SetActive(true);
  120. ChangeState(cookState.seize);
  121. }
  122. chuan = food.GetComponent<Character>().cookNum;
  123. text.text = chuan.ToString();
  124. }
  125. }
  126. //回家卖串
  127. else if (state == cookState.back && other.gameObject.layer == 8)
  128. {
  129. ChangeState(cookState.cook);
  130. }
  131. }
  132. private void ChangeState(cookState cs)
  133. {
  134. switch (cs)
  135. {
  136. //卖串中
  137. case cookState.sell:
  138. dia.SetActive(true);
  139. ene.isBack = false;
  140. ene.canMove = false;
  141. //不能被攻击
  142. foreach (GameObject g in colliders)
  143. {
  144. g.SetActive(false);
  145. }
  146. break;
  147. //冲刺中
  148. case cookState.run:
  149. dia.SetActive(false);
  150. foreach (GameObject g in colliders)
  151. {
  152. g.SetActive(true);
  153. }
  154. ene.canMove = true;
  155. ene.ChangeState(CharacterState.Rush);
  156. break;
  157. //抓住你啦
  158. case cookState.seize:
  159. ene.canMove = false;
  160. break;
  161. //鲨人中
  162. case cookState.cook:
  163. ene.canMove = false;
  164. ani.Play("attack_march", 0, 0);
  165. break;
  166. //返回中
  167. case cookState.back:
  168. ene.canMove = true;
  169. ene.isBack = true;
  170. break;
  171. //首次登场
  172. case cookState.first:
  173. dia.SetActive(false);
  174. ene.canMove = true;
  175. foreach (GameObject g in colliders)
  176. {
  177. g.SetActive(true);
  178. }
  179. break;
  180. default:
  181. break;
  182. }
  183. state = cs;
  184. }
  185. private void AimAtPlayer()
  186. {
  187. lockEffect.transform.position = transform.position;
  188. }
  189. private void StateAct(cookState cs)
  190. {
  191. switch (cs)
  192. {
  193. case cookState.back:
  194. if (cook.transform.position.x <= destX)
  195. {
  196. ChangeState(cookState.cook);
  197. }
  198. break;
  199. case cookState.cook:
  200. pastTime += Time.deltaTime;
  201. if (pastTime >= cookTime)
  202. {
  203. pastTime = 0;
  204. ChangeState(cookState.sell);
  205. }
  206. break;
  207. case cookState.run:
  208. //ene.targetCharacter = target.GetComponent<Character>();
  209. break;
  210. case cookState.sell:
  211. break;
  212. case cookState.first:
  213. if (cook.transform.position.x >= destX)
  214. {
  215. ChangeState(cookState.sell);
  216. }
  217. break;
  218. case cookState.seize:
  219. pastTime += Time.deltaTime;
  220. if (pastTime >= seizeTime)
  221. {
  222. pastTime = 0;
  223. ChangeState(cookState.back);
  224. }
  225. break;
  226. default:
  227. break;
  228. }
  229. }
  230. private void Update()
  231. {
  232. if (!isAct)
  233. {
  234. activeTime += Time.deltaTime;
  235. if (activeTime >= activeAniTime)
  236. {
  237. dia.SetActive(true);
  238. isAct = true;
  239. col.enabled = true;
  240. ChangeState(cookState.first);
  241. }
  242. }
  243. else
  244. {
  245. StateAct(state);
  246. }
  247. if (isInterval)
  248. {
  249. intervalTimePast += Time.deltaTime;
  250. if (intervalTimePast >= intervalTimeSell)
  251. {
  252. intervalTimePast = 0;
  253. isInterval = false;
  254. }
  255. }
  256. }
  257. }