EnemyBaseAIAction.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. using System;
  2. using BehaviorDesigner.Runtime.Tasks;
  3. using UnityEngine;
  4. public class EnemyBaseAIAction
  5. {
  6. [TaskDescription("移动到当前选择的攻击可以攻击的位置")]
  7. [TaskCategory("Enemy/Base")]
  8. public class MoveAtkExAim : BehaviorDesigner.Runtime.Tasks.Action
  9. {
  10. private GameObject player
  11. {
  12. get
  13. {
  14. return R.Player.GameObject;
  15. }
  16. }
  17. public override void OnAwake()
  18. {
  19. this.eAttr = base.GetComponent<EnemyAttribute>();
  20. this.enemy = this.eAttr.GetComponent<EnemyBaseAction>();
  21. this.aiAttr = this.eAttr.GetComponent<EnemyAIAttribute>();
  22. }
  23. public override void OnStart()
  24. {
  25. if (this.randomAtkEx)
  26. {
  27. this.atkNum = this.RandomRange[UnityEngine.Random.Range(0, this.RandomRange.Length)];
  28. this.aiAttr.currentEx = this.aiAttr.attackExpectations[(int)this.atkNum];
  29. }
  30. else
  31. {
  32. this.aiAttr.currentEx = this.aiAttr.attackExpectations[(int)this.atkNum];
  33. }
  34. this.aimPos = this.MoveAim();
  35. this.aimPos = new Vector2(Mathf.Clamp(this.aimPos.x, GameArea.EnemyRange.min.x, GameArea.EnemyRange.max.x), this.aimPos.y);
  36. }
  37. public override TaskStatus OnUpdate()
  38. {
  39. if (!this.enemy.AutoMove())
  40. {
  41. return TaskStatus.Failure;
  42. }
  43. bool flag = InputSetting.JudgeDir(this.enemy.transform.position.x, this.aimPos.x) == this.eAttr.faceDir;
  44. Vector2 dis = this.aimPos - (Vector2)R.Player.Transform.position;
  45. bool flag2 = this.MoveStop(dis);
  46. if (flag && !flag2)
  47. {
  48. return TaskStatus.Running;
  49. }
  50. if (!this.isArrivedStopAnim)
  51. {
  52. return TaskStatus.Success;
  53. }
  54. if (this.enemy.StopMoveToIdle())
  55. {
  56. return TaskStatus.Success;
  57. }
  58. return TaskStatus.Failure;
  59. }
  60. protected virtual Vector2 MoveAim()
  61. {
  62. EnemyAIAttribute.ExpectationParam currentEx = this.aiAttr.currentEx;
  63. Vector3 v = R.Player.Transform.position - UnityEngine.Random.Range(currentEx.distance, currentEx.range + currentEx.distance) * Vector3.right;
  64. Vector3 v2 = R.Player.Transform.position + UnityEngine.Random.Range(currentEx.distance, currentEx.range + currentEx.distance) * Vector3.right;
  65. if (v.x < GameArea.EnemyRange.min.x)
  66. {
  67. return v2;
  68. }
  69. if (v2.x > GameArea.EnemyRange.max.x)
  70. {
  71. return v;
  72. }
  73. float num = Mathf.Abs(this.transform.position.x - v.x);
  74. float num2 = Mathf.Abs(this.transform.position.x - v2.x);
  75. if (num < num2)
  76. {
  77. return v;
  78. }
  79. return v2;
  80. }
  81. protected virtual bool MoveStop(Vector2 dis)
  82. {
  83. EnemyAIAttribute.ExpectationParam currentEx = this.aiAttr.currentEx;
  84. Vector2 vector = this.enemy.transform.position - R.Player.Transform.position;
  85. bool flag = MathfX.isInMiddleRange(R.Player.Transform.position.x, (currentEx.distance + currentEx.range / 2f) * (float)this.aiAttr.facePlayerDir + this.enemy.transform.position.x, currentEx.range);
  86. if (flag)
  87. {
  88. if (dis.x > 0f && vector.x > 0f && vector.x < dis.x)
  89. {
  90. return true;
  91. }
  92. if (dis.x < 0f && vector.x < 0f && vector.x > dis.x)
  93. {
  94. return true;
  95. }
  96. }
  97. return !this.enemy.IsInNormalState();
  98. }
  99. [BehaviorDesigner.Runtime.Tasks.Tooltip("到达了后是否停止播放移动动画")]
  100. public bool isArrivedStopAnim = true;
  101. [BehaviorDesigner.Runtime.Tasks.Tooltip("是否随机选择攻击目标")]
  102. public bool randomAtkEx;
  103. public EnemyBaseAIAction.MoveAtkExAim.ATK[] RandomRange;
  104. [BehaviorDesigner.Runtime.Tasks.Tooltip("选择ATK几")]
  105. public EnemyBaseAIAction.MoveAtkExAim.ATK atkNum;
  106. private EnemyAttribute eAttr;
  107. private EnemyBaseAction enemy;
  108. private EnemyAIAttribute aiAttr;
  109. private Vector2 aimPos;
  110. public enum ATK
  111. {
  112. ATK1,
  113. ATK2,
  114. ATK3,
  115. ATK4,
  116. ATK5,
  117. ATK6,
  118. ATK7,
  119. ATK8,
  120. ATK9,
  121. ATK10
  122. }
  123. }
  124. [TaskDescription("远离主角,以攻击范围为准")]
  125. [TaskCategory("Enemy/Base")]
  126. public class FarAwayPlayer : BehaviorDesigner.Runtime.Tasks.Action
  127. {
  128. public override void OnAwake()
  129. {
  130. this.action = base.GetComponent<EnemyBaseAction>();
  131. this.eAttr = base.GetComponent<EnemyAttribute>();
  132. }
  133. private bool nearToPlayer
  134. {
  135. get
  136. {
  137. EnemyAIAttribute.ExpectationParam expectationParam = base.GetComponent<EnemyAIAttribute>().attackExpectations[(int)this.atkNum];
  138. float num = Mathf.Abs(this.transform.position.x - R.Player.Transform.position.x);
  139. return num < expectationParam.range + expectationParam.distance && num > expectationParam.distance;
  140. }
  141. }
  142. public override void OnStart()
  143. {
  144. EnemyAIAttribute.ExpectationParam expectationParam = base.GetComponent<EnemyAIAttribute>().attackExpectations[(int)this.atkNum];
  145. this.atkRange = UnityEngine.Random.Range(expectationParam.distance, expectationParam.distance + expectationParam.range);
  146. int num = this.JudeMoveDir();
  147. this.aimPos = R.Player.Transform.position.x + this.atkRange * (float)num;
  148. this.action.TurnRound(InputSetting.JudgeDir(this.transform.position.x, this.aimPos));
  149. this.aimPos = Mathf.Clamp(this.aimPos, GameArea.EnemyRange.min.x + this.eAttr.bounds.size.x, GameArea.EnemyRange.max.x - this.eAttr.bounds.size.x);
  150. }
  151. public override TaskStatus OnUpdate()
  152. {
  153. if (!this.action.AutoMove())
  154. {
  155. return TaskStatus.Failure;
  156. }
  157. bool flag = InputSetting.JudgeDir(this.action.transform.position.x, this.aimPos) == this.eAttr.faceDir;
  158. if (!flag)
  159. {
  160. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  161. }
  162. if (this.nearToPlayer)
  163. {
  164. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  165. }
  166. return TaskStatus.Running;
  167. }
  168. private int JudeMoveDir()
  169. {
  170. float num = this.atkRange;
  171. if (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) < num || Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.max.x) < num)
  172. {
  173. return (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) >= num) ? -1 : 1;
  174. }
  175. return (this.transform.position.x - R.Player.Transform.position.x <= 0f) ? -1 : 1;
  176. }
  177. private EnemyBaseAction action;
  178. private EnemyAttribute eAttr;
  179. [BehaviorDesigner.Runtime.Tasks.Tooltip("选择ATK几")]
  180. public EnemyBaseAIAction.FarAwayPlayer.ATK atkNum;
  181. private float atkRange;
  182. private float aimPos;
  183. public enum ATK
  184. {
  185. ATK1,
  186. ATK2,
  187. ATK3,
  188. ATK4,
  189. ATK5,
  190. ATK6,
  191. ATK7,
  192. ATK8,
  193. ATK9,
  194. ATK10
  195. }
  196. }
  197. [TaskDescription("远离主角,以攻击范围为准,方向随机")]
  198. [TaskCategory("Enemy/Base")]
  199. public class RandomMovePlayer : BehaviorDesigner.Runtime.Tasks.Action
  200. {
  201. public override void OnAwake()
  202. {
  203. this.action = base.GetComponent<EnemyBaseAction>();
  204. this.eAttr = base.GetComponent<EnemyAttribute>();
  205. }
  206. private bool nearToPlayer
  207. {
  208. get
  209. {
  210. EnemyAIAttribute.ExpectationParam expectationParam = base.GetComponent<EnemyAIAttribute>().attackExpectations[(int)this.atkNum];
  211. float num = Mathf.Abs(this.transform.position.x - R.Player.Transform.position.x);
  212. return num < expectationParam.range + expectationParam.distance && num > expectationParam.distance;
  213. }
  214. }
  215. public override void OnStart()
  216. {
  217. EnemyAIAttribute.ExpectationParam expectationParam = base.GetComponent<EnemyAIAttribute>().attackExpectations[(int)this.atkNum];
  218. this.atkRange = UnityEngine.Random.Range(expectationParam.distance, expectationParam.distance + expectationParam.range);
  219. int num = this.JudeMoveDir();
  220. this.aimPos = R.Player.Transform.position.x + this.atkRange * (float)num;
  221. this.action.TurnRound(InputSetting.JudgeDir(this.transform.position.x, this.aimPos));
  222. this.aimPos = Mathf.Clamp(this.aimPos, GameArea.EnemyRange.min.x + this.eAttr.bounds.size.x, GameArea.EnemyRange.max.x - this.eAttr.bounds.size.x);
  223. }
  224. public override TaskStatus OnUpdate()
  225. {
  226. if (!this.action.AutoMove())
  227. {
  228. return TaskStatus.Failure;
  229. }
  230. bool flag = InputSetting.JudgeDir(this.action.transform.position.x, this.aimPos) == this.eAttr.faceDir;
  231. if (!flag)
  232. {
  233. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  234. }
  235. if (this.nearToPlayer)
  236. {
  237. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  238. }
  239. return TaskStatus.Running;
  240. }
  241. private int JudeMoveDir()
  242. {
  243. float num = this.atkRange;
  244. if (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) < num || Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.max.x) < num)
  245. {
  246. return (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) >= num) ? -1 : 1;
  247. }
  248. return (UnityEngine.Random.Range(0, 2) != 0) ? -1 : 1;
  249. }
  250. private EnemyBaseAction action;
  251. private EnemyAttribute eAttr;
  252. [BehaviorDesigner.Runtime.Tasks.Tooltip("选择ATK几")]
  253. public EnemyBaseAIAction.RandomMovePlayer.ATK atkNum;
  254. private float atkRange;
  255. private float aimPos;
  256. public enum ATK
  257. {
  258. ATK1,
  259. ATK2,
  260. ATK3,
  261. ATK4,
  262. ATK5,
  263. ATK6,
  264. ATK7,
  265. ATK8,
  266. ATK9,
  267. ATK10
  268. }
  269. }
  270. [TaskDescription("移动距离主角的某个位置")]
  271. [TaskCategory("Enemy/Base")]
  272. public class MoveDistance : BehaviorDesigner.Runtime.Tasks.Action
  273. {
  274. public override void OnAwake()
  275. {
  276. this.action = base.GetComponent<EnemyBaseAction>();
  277. this.eAttr = base.GetComponent<EnemyAttribute>();
  278. }
  279. public override void OnStart()
  280. {
  281. int dir = this.JudeMoveDir();
  282. this.action.TurnRound(dir);
  283. this.aimPos = R.Player.Transform.position.x + this.moveRange * (float)this.eAttr.faceDir;
  284. this.aimPos = Mathf.Clamp(this.aimPos, GameArea.EnemyRange.min.x + this.eAttr.bounds.size.x, GameArea.EnemyRange.max.x - this.eAttr.bounds.size.x);
  285. }
  286. public override TaskStatus OnUpdate()
  287. {
  288. if (!this.action.AutoMove())
  289. {
  290. return TaskStatus.Failure;
  291. }
  292. bool flag = InputSetting.JudgeDir(this.action.transform.position.x, this.aimPos) == this.eAttr.faceDir;
  293. if (flag)
  294. {
  295. return TaskStatus.Running;
  296. }
  297. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  298. }
  299. private int JudeMoveDir()
  300. {
  301. float num = this.moveRange;
  302. if (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) < num || Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.max.x) < num)
  303. {
  304. return (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) >= num) ? -1 : 1;
  305. }
  306. return (UnityEngine.Random.Range(0, 2) != 0) ? -1 : 1;
  307. }
  308. private EnemyBaseAction action;
  309. private EnemyAttribute eAttr;
  310. public float moveRange;
  311. private float aimPos;
  312. }
  313. [TaskCategory("Enemy/Base")]
  314. [TaskDescription("向前移动一段距离,距离参数在属性里设置")]
  315. public class MoveSomeDistance : BehaviorDesigner.Runtime.Tasks.Action
  316. {
  317. public override void OnAwake()
  318. {
  319. this.eAttr = base.GetComponent<EnemyAttribute>();
  320. if (this.eAttr == null)
  321. {
  322. global::Log.Error("EnemyBaseAIAction必须使用在有Enmey的对象上");
  323. }
  324. this.enemy = base.GetComponent<EnemyBaseAction>();
  325. if (this.enemy == null)
  326. {
  327. global::Log.Error("EnemyBaseAIAction必须使用在有Enmey的对象上");
  328. }
  329. }
  330. public override void OnStart()
  331. {
  332. if (this.randomDis)
  333. {
  334. this.dis = UnityEngine.Random.Range(this.randomMin, this.randomMax);
  335. }
  336. this.aimPosX = this.enemy.transform.position.x + (float)this.eAttr.faceDir * this.dis;
  337. this.aimPosX = Mathf.Clamp(this.aimPosX, GameArea.EnemyRange.min.x + this.eAttr.bounds.size.x, GameArea.EnemyRange.max.x - this.eAttr.bounds.size.x);
  338. }
  339. public override TaskStatus OnUpdate()
  340. {
  341. if (!this.enemy.AutoMove())
  342. {
  343. return TaskStatus.Failure;
  344. }
  345. bool flag = InputSetting.JudgeDir(this.enemy.transform.position.x, this.aimPosX) == this.eAttr.faceDir;
  346. if (flag)
  347. {
  348. return TaskStatus.Running;
  349. }
  350. if (!this.isArrivedStopAnim)
  351. {
  352. return TaskStatus.Success;
  353. }
  354. if (this.enemy.StopMoveToIdle())
  355. {
  356. return TaskStatus.Success;
  357. }
  358. return TaskStatus.Failure;
  359. }
  360. [BehaviorDesigner.Runtime.Tasks.Tooltip("移动距离")]
  361. public float dis;
  362. public bool randomDis;
  363. public float randomMin;
  364. public float randomMax;
  365. [BehaviorDesigner.Runtime.Tasks.Tooltip("到达了后是否停止播放移动动画")]
  366. public bool isArrivedStopAnim = true;
  367. private EnemyAttribute eAttr;
  368. private EnemyBaseAction enemy;
  369. private float aimPosX;
  370. }
  371. [TaskCategory("Enemy/Base")]
  372. [TaskDescription("移动距离主角的某个位置范围")]
  373. public class MoveDistanceRange : BehaviorDesigner.Runtime.Tasks.Action
  374. {
  375. public override void OnAwake()
  376. {
  377. this.action = base.GetComponent<EnemyBaseAction>();
  378. this.eAttr = base.GetComponent<EnemyAttribute>();
  379. }
  380. public override void OnStart()
  381. {
  382. this.finalMoveLen = UnityEngine.Random.Range(this.moveRangeMin, this.moveRangeMax);
  383. int num = (UnityEngine.Random.Range(0, 2) != 0) ? -1 : 1;
  384. this.aimPos = R.Player.Transform.position.x + this.finalMoveLen * (float)num;
  385. int dir = InputSetting.JudgeDir(this.transform.position.x, this.aimPos);
  386. this.action.TurnRound(dir);
  387. this.aimPos = Mathf.Clamp(this.aimPos, GameArea.EnemyRange.min.x + this.eAttr.bounds.size.x, GameArea.EnemyRange.max.x - this.eAttr.bounds.size.x);
  388. }
  389. public override TaskStatus OnUpdate()
  390. {
  391. if (!this.action.AutoMove())
  392. {
  393. return TaskStatus.Failure;
  394. }
  395. bool flag = InputSetting.JudgeDir(this.action.transform.position.x, this.aimPos) == this.eAttr.faceDir;
  396. if (!flag)
  397. {
  398. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  399. }
  400. float x = Mathf.Abs(R.Player.Transform.position.x - this.transform.position.x);
  401. if (MathfX.isInRange(x, this.moveRangeMin, this.moveRangeMax))
  402. {
  403. this.action.StopMoveToIdle();
  404. return TaskStatus.Success;
  405. }
  406. return TaskStatus.Running;
  407. }
  408. private int JudeMoveDir()
  409. {
  410. float num = this.finalMoveLen;
  411. if (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) < num || Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.max.x) < num)
  412. {
  413. return (Mathf.Abs(this.transform.position.x - GameArea.EnemyRange.min.x) >= num) ? -1 : 1;
  414. }
  415. return (UnityEngine.Random.Range(0, 2) != 0) ? -1 : 1;
  416. }
  417. private EnemyBaseAction action;
  418. private EnemyAttribute eAttr;
  419. public float moveRangeMin;
  420. public float moveRangeMax;
  421. private float aimPos;
  422. private float finalMoveLen;
  423. }
  424. [TaskCategory("Enemy/Base")]
  425. [TaskDescription("移动到主角位置")]
  426. public class MoveToPlayerPos : BehaviorDesigner.Runtime.Tasks.Action
  427. {
  428. public override void OnAwake()
  429. {
  430. this.action = base.GetComponent<EnemyBaseAction>();
  431. this.eAttr = base.GetComponent<EnemyAttribute>();
  432. }
  433. public override void OnStart()
  434. {
  435. this.aimPos = R.Player.Transform.position.x;
  436. int dir = InputSetting.JudgeDir(this.transform.position.x, this.aimPos);
  437. this.action.TurnRound(dir);
  438. this.aimPos = Mathf.Clamp(this.aimPos, GameArea.EnemyRange.min.x + this.eAttr.bounds.size.x, GameArea.EnemyRange.max.x - this.eAttr.bounds.size.x);
  439. }
  440. public override TaskStatus OnUpdate()
  441. {
  442. if (!this.action.AutoMove())
  443. {
  444. return TaskStatus.Failure;
  445. }
  446. bool flag = InputSetting.JudgeDir(this.action.transform.position.x, this.aimPos) == this.eAttr.faceDir;
  447. if (flag)
  448. {
  449. return TaskStatus.Running;
  450. }
  451. return (!this.action.StopMoveToIdle()) ? TaskStatus.Failure : TaskStatus.Success;
  452. }
  453. private EnemyBaseAction action;
  454. private EnemyAttribute eAttr;
  455. private float aimPos;
  456. private float finalMoveLen;
  457. }
  458. [TaskCategory("Enemy/Base")]
  459. [TaskDescription("转向玩家")]
  460. public class FaceToPlayer : BehaviorDesigner.Runtime.Tasks.Action
  461. {
  462. public override void OnAwake()
  463. {
  464. this.enemy = base.GetComponent<EnemyBaseAction>();
  465. }
  466. public override void OnStart()
  467. {
  468. this.enemy.FaceToPlayer();
  469. }
  470. public override TaskStatus OnUpdate()
  471. {
  472. return TaskStatus.Success;
  473. }
  474. private EnemyBaseAction enemy;
  475. }
  476. [TaskCategory("Enemy/Base")]
  477. [TaskDescription("在一般状态")]
  478. public class InNormalState : BehaviorDesigner.Runtime.Tasks.Action
  479. {
  480. public override void OnAwake()
  481. {
  482. this.enemy = base.GetComponent<EnemyBaseAction>();
  483. }
  484. public override TaskStatus OnUpdate()
  485. {
  486. return (!this.enemy.IsInNormalState()) ? TaskStatus.Failure : TaskStatus.Success;
  487. }
  488. private EnemyBaseAction enemy;
  489. }
  490. [TaskDescription("AI启动")]
  491. [TaskCategory("Enemy/Base")]
  492. public class StartAI : BehaviorDesigner.Runtime.Tasks.Action
  493. {
  494. public override TaskStatus OnUpdate()
  495. {
  496. if (!R.Mode.IsInStoryMode() && R.SceneData.CanAIRun)
  497. {
  498. return TaskStatus.Success;
  499. }
  500. return TaskStatus.Failure;
  501. }
  502. }
  503. [TaskDescription("转身")]
  504. [TaskCategory("Enemy/Base")]
  505. public class TurnRound : BehaviorDesigner.Runtime.Tasks.Action
  506. {
  507. public override void OnAwake()
  508. {
  509. this.eAttr = base.GetComponent<EnemyAttribute>();
  510. if (this.eAttr == null)
  511. {
  512. global::Log.Error("EnemyBaseAIAction必须使用在有Enmey的对象上");
  513. }
  514. this.enemy = base.GetComponent<EnemyBaseAction>();
  515. if (this.enemy == null)
  516. {
  517. global::Log.Error("EnemyBaseAIAction必须使用在有EnemyBaseAction的对象上");
  518. }
  519. }
  520. public override TaskStatus OnUpdate()
  521. {
  522. int dir = 1;
  523. switch (this.turnDir)
  524. {
  525. case EnemyBaseAIAction.TurnRound.Dir.Back:
  526. if (this.eAttr.faceDir == 1)
  527. {
  528. dir = -1;
  529. }
  530. if (this.eAttr.faceDir == -1)
  531. {
  532. dir = 1;
  533. }
  534. break;
  535. case EnemyBaseAIAction.TurnRound.Dir.Left:
  536. dir = -1;
  537. break;
  538. case EnemyBaseAIAction.TurnRound.Dir.Right:
  539. dir = 1;
  540. break;
  541. case EnemyBaseAIAction.TurnRound.Dir.Random:
  542. dir = ((UnityEngine.Random.Range(0, 2) != 0) ? 1 : -1);
  543. break;
  544. case EnemyBaseAIAction.TurnRound.Dir.None:
  545. dir = this.eAttr.faceDir;
  546. break;
  547. }
  548. if (this.enemy.TurnRound(dir))
  549. {
  550. return TaskStatus.Success;
  551. }
  552. return TaskStatus.Failure;
  553. }
  554. [BehaviorDesigner.Runtime.Tasks.Tooltip("转向方式")]
  555. public EnemyBaseAIAction.TurnRound.Dir turnDir;
  556. private Transform playerTransform;
  557. private EnemyAttribute eAttr;
  558. private EnemyBaseAction enemy;
  559. public enum Dir
  560. {
  561. Back,
  562. Left,
  563. Right,
  564. Random,
  565. None
  566. }
  567. }
  568. [TaskDescription("待机")]
  569. [TaskCategory("Enemy/Base")]
  570. public class Idle : BehaviorDesigner.Runtime.Tasks.Action
  571. {
  572. public override void OnAwake()
  573. {
  574. this.enemy = base.GetComponent<EnemyBaseAction>();
  575. if (this.enemy == null)
  576. {
  577. global::Log.Error("Player没有生成");
  578. }
  579. }
  580. public override void OnStart()
  581. {
  582. switch (this.type)
  583. {
  584. case EnemyBaseAIAction.Idle.IdleType.Idle1:
  585. this.enemy.Idle1();
  586. break;
  587. case EnemyBaseAIAction.Idle.IdleType.Idle2:
  588. this.enemy.Idle2();
  589. break;
  590. case EnemyBaseAIAction.Idle.IdleType.Idle3:
  591. this.enemy.Idle3();
  592. break;
  593. case EnemyBaseAIAction.Idle.IdleType.Idle4:
  594. this.enemy.Idle4();
  595. break;
  596. case EnemyBaseAIAction.Idle.IdleType.Idle5:
  597. this.enemy.Idle5();
  598. break;
  599. }
  600. }
  601. public override TaskStatus OnUpdate()
  602. {
  603. return TaskStatus.Success;
  604. }
  605. private EnemyBaseAction enemy;
  606. [BehaviorDesigner.Runtime.Tasks.Tooltip("待机类型")]
  607. public EnemyBaseAIAction.Idle.IdleType type;
  608. public enum IdleType
  609. {
  610. Idle1,
  611. Idle2,
  612. Idle3,
  613. Idle4,
  614. Idle5
  615. }
  616. }
  617. [TaskDescription("等待")]
  618. [TaskCategory("Enemy/Base")]
  619. public class Wait : BehaviorDesigner.Runtime.Tasks.Action
  620. {
  621. public override void OnStart()
  622. {
  623. this.startTime = Time.time;
  624. }
  625. public override TaskStatus OnUpdate()
  626. {
  627. if (Time.time - this.startTime > this.waitTime)
  628. {
  629. return TaskStatus.Success;
  630. }
  631. return TaskStatus.Running;
  632. }
  633. [BehaviorDesigner.Runtime.Tasks.Tooltip("等待多久")]
  634. public float waitTime;
  635. private float startTime;
  636. }
  637. [TaskDescription("等待扫描时间")]
  638. [TaskCategory("Enemy/Base")]
  639. public class WaitScanSpeed : BehaviorDesigner.Runtime.Tasks.Action
  640. {
  641. public override void OnStart()
  642. {
  643. this.eAttr = base.GetComponent<EnemyAttribute>();
  644. this.startTime = Time.time;
  645. }
  646. public override TaskStatus OnUpdate()
  647. {
  648. if (Time.time - this.startTime > this.eAttr.scanSpeed)
  649. {
  650. return TaskStatus.Success;
  651. }
  652. return TaskStatus.Running;
  653. }
  654. private EnemyAttribute eAttr;
  655. private float startTime;
  656. }
  657. [TaskCategory("Enemy/Base")]
  658. [TaskDescription("怪物攻击")]
  659. public class EnemyAttack : BehaviorDesigner.Runtime.Tasks.Action
  660. {
  661. public override void OnAwake()
  662. {
  663. this.action = base.GetComponent<EnemyBaseAction>();
  664. }
  665. public override void OnStart()
  666. {
  667. int dir = InputSetting.JudgeDir(this.transform.position, R.Player.Transform.position);
  668. switch (this.atkType)
  669. {
  670. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk1:
  671. this.action.Attack1(dir);
  672. break;
  673. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk2:
  674. this.action.Attack2(dir);
  675. break;
  676. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk3:
  677. this.action.Attack3(dir);
  678. break;
  679. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk4:
  680. this.action.Attack4(dir);
  681. break;
  682. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk5:
  683. this.action.Attack5(dir);
  684. break;
  685. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk6:
  686. this.action.Attack6(dir);
  687. break;
  688. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk7:
  689. this.action.Attack7(dir);
  690. break;
  691. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk8:
  692. this.action.Attack8(dir);
  693. break;
  694. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk9:
  695. this.action.Attack9(dir);
  696. break;
  697. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk10:
  698. this.action.Attack10(dir);
  699. break;
  700. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk11:
  701. this.action.Attack11(dir);
  702. break;
  703. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk12:
  704. this.action.Attack12(dir);
  705. break;
  706. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk13:
  707. this.action.Attack13(dir);
  708. break;
  709. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk14:
  710. this.action.Attack14(dir);
  711. break;
  712. case EnemyBaseAIAction.EnemyAttack.AtkType.Atk15:
  713. this.action.Attack15(dir);
  714. break;
  715. }
  716. }
  717. public override TaskStatus OnUpdate()
  718. {
  719. if (this.action.IsInAttackState())
  720. {
  721. return TaskStatus.Running;
  722. }
  723. return TaskStatus.Success;
  724. }
  725. public EnemyBaseAIAction.EnemyAttack.AtkType atkType;
  726. private EnemyBaseAction action;
  727. public enum AtkType
  728. {
  729. Atk1,
  730. Atk2,
  731. Atk3,
  732. Atk4,
  733. Atk5,
  734. Atk6,
  735. Atk7,
  736. Atk8,
  737. Atk9,
  738. Atk10,
  739. Atk11,
  740. Atk12,
  741. Atk13,
  742. Atk14,
  743. Atk15
  744. }
  745. }
  746. }