EnemyBaseAIConditional.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. using System;
  2. using BehaviorDesigner.Runtime.Tasks;
  3. using ExtensionMethods;
  4. using GameWorld;
  5. using UnityEngine;
  6. public class EnemyBaseAIConditional
  7. {
  8. [TaskDescription("判断敌人是否在正常状态")]
  9. [TaskCategory("Enemy/Base")]
  10. public class IsInNormalState : Conditional
  11. {
  12. public override void OnAwake()
  13. {
  14. this.action = base.GetComponent<EnemyBaseAction>();
  15. if (this.action == null)
  16. {
  17. global::Log.Error("EnemyBaseAIAction必须使用在有EnmeyBaseAction的对象上");
  18. }
  19. }
  20. public override TaskStatus OnUpdate()
  21. {
  22. if (this.action.IsInNormalState())
  23. {
  24. return TaskStatus.Success;
  25. }
  26. return TaskStatus.Failure;
  27. }
  28. private EnemyBaseAction action;
  29. }
  30. [TaskCategory("Enemy/Base")]
  31. [TaskDescription("判断玩家是否在我后面")]
  32. public class PlayerIsInBackGround : Conditional
  33. {
  34. public override void OnAwake()
  35. {
  36. this.enemy = base.GetComponent<EnemyAttribute>();
  37. if (this.enemy == null)
  38. {
  39. global::Log.Error("EnemyBaseAIAction必须使用在有Enmey的对象上");
  40. }
  41. }
  42. public override TaskStatus OnUpdate()
  43. {
  44. if (InputSetting.JudgeDir(this.transform.position, R.Player.Transform.position) == this.enemy.faceDir)
  45. {
  46. return TaskStatus.Failure;
  47. }
  48. return TaskStatus.Success;
  49. }
  50. private EnemyAttribute enemy;
  51. }
  52. [TaskCategory("Enemy/Base")]
  53. [TaskDescription("判断是否在Attack的范围内")]
  54. public class PlayerIsInAttackRange : Conditional
  55. {
  56. public override void OnAwake()
  57. {
  58. this.aiAttr = base.GetComponent<EnemyAIAttribute>();
  59. if (this.aiAttr == null)
  60. {
  61. global::Log.Error("必须使用在有EnemyAIAttribute的对象上");
  62. }
  63. this.ex = this.aiAttr.attackExpectations[(int)this.atk];
  64. if (this.ex == null)
  65. {
  66. global::Log.Error("不存在Attack");
  67. }
  68. }
  69. public override TaskStatus OnUpdate()
  70. {
  71. bool flag = MathfX.isInMiddleRange(R.Player.Transform.position.x, (this.ex.distance + this.ex.range / 2f) * (float)this.aiAttr.GetComponent<EnemyAttribute>().faceDir + this.aiAttr.transform.position.x, this.ex.range);
  72. if (flag)
  73. {
  74. return TaskStatus.Success;
  75. }
  76. return TaskStatus.Failure;
  77. }
  78. protected EnemyAIAttribute.ExpectationParam ex;
  79. protected EnemyAIAttribute aiAttr;
  80. [BehaviorDesigner.Runtime.Tasks.Tooltip("选择的攻击类型")]
  81. public EnemyBaseAIConditional.PlayerIsInAttackRange.ATKType atk;
  82. public enum ATKType
  83. {
  84. ATK1,
  85. ATK2,
  86. ATK3,
  87. ATK4,
  88. ATK5
  89. }
  90. }
  91. [TaskCategory("Enemy/Base")]
  92. [TaskDescription("在两种攻击范围内")]
  93. public class InTwoAtkRange : Conditional
  94. {
  95. private Transform player
  96. {
  97. get
  98. {
  99. return R.Player.Transform;
  100. }
  101. }
  102. public override void OnAwake()
  103. {
  104. this.aiAttr = base.GetComponent<EnemyAIAttribute>();
  105. this.firstEx = this.aiAttr.attackExpectations[(int)this.firstAtk];
  106. this.secondEx = this.aiAttr.attackExpectations[(int)this.secondAtk];
  107. }
  108. public override TaskStatus OnUpdate()
  109. {
  110. float num = Mathf.Min(this.firstEx.distance + this.firstEx.range, this.secondEx.distance + this.secondEx.range);
  111. float num2 = Mathf.Max(this.firstEx.distance + this.firstEx.range, this.secondEx.distance + this.secondEx.range);
  112. float num3 = Mathf.Abs(this.player.position.x - this.transform.position.x);
  113. if (num3 > num && num3 <= num2)
  114. {
  115. return TaskStatus.Success;
  116. }
  117. return TaskStatus.Failure;
  118. }
  119. [BehaviorDesigner.Runtime.Tasks.Tooltip("选择的第一种攻击类型")]
  120. public EnemyBaseAIConditional.InTwoAtkRange.ATKType firstAtk;
  121. [BehaviorDesigner.Runtime.Tasks.Tooltip("选择的第二种攻击类型")]
  122. public EnemyBaseAIConditional.InTwoAtkRange.ATKType secondAtk;
  123. private EnemyAIAttribute aiAttr;
  124. private EnemyAIAttribute.ExpectationParam firstEx;
  125. private EnemyAIAttribute.ExpectationParam secondEx;
  126. public enum ATKType
  127. {
  128. ATK1,
  129. ATK2,
  130. ATK3,
  131. ATK4,
  132. ATK5
  133. }
  134. }
  135. [TaskCategory("Enemy/Base")]
  136. [TaskDescription("距离判断")]
  137. public class DistanceJudge : Conditional
  138. {
  139. private Transform player
  140. {
  141. get
  142. {
  143. return R.Player.Transform;
  144. }
  145. }
  146. public override TaskStatus OnUpdate()
  147. {
  148. float num = Mathf.Abs(this.player.position.x - this.transform.position.x);
  149. EnemyBaseAIConditional.DistanceJudge.JudgeState judgeState = this.judge;
  150. if (judgeState != EnemyBaseAIConditional.DistanceJudge.JudgeState.Between)
  151. {
  152. if (judgeState != EnemyBaseAIConditional.DistanceJudge.JudgeState.Greater)
  153. {
  154. if (judgeState != EnemyBaseAIConditional.DistanceJudge.JudgeState.Less)
  155. {
  156. return TaskStatus.Failure;
  157. }
  158. if (num < this.distanceMax)
  159. {
  160. return TaskStatus.Success;
  161. }
  162. return TaskStatus.Failure;
  163. }
  164. else
  165. {
  166. if (num > this.distanceMax)
  167. {
  168. return TaskStatus.Success;
  169. }
  170. return TaskStatus.Failure;
  171. }
  172. }
  173. else
  174. {
  175. if (num >= this.distanceMin && num <= this.distanceMax)
  176. {
  177. return TaskStatus.Success;
  178. }
  179. return TaskStatus.Failure;
  180. }
  181. }
  182. public EnemyBaseAIConditional.DistanceJudge.JudgeState judge;
  183. [BehaviorDesigner.Runtime.Tasks.Tooltip("第一个距离")]
  184. public float distanceMax;
  185. [BehaviorDesigner.Runtime.Tasks.Tooltip("仅判断两个距离之间时使用,表示比较近的距离")]
  186. public float distanceMin;
  187. public enum JudgeState
  188. {
  189. Greater,
  190. Between,
  191. Less
  192. }
  193. }
  194. [TaskDescription("判断是否在玩家视野的范围内")]
  195. [TaskCategory("Enemy/Base")]
  196. public class IsInPlayerView : Conditional
  197. {
  198. private Transform player
  199. {
  200. get
  201. {
  202. return R.Player.Transform;
  203. }
  204. }
  205. public override void OnAwake()
  206. {
  207. this.eAttr = base.GetComponent<EnemyAttribute>();
  208. }
  209. public override TaskStatus OnUpdate()
  210. {
  211. if (this.eAttr.playerInView)
  212. {
  213. return TaskStatus.Success;
  214. }
  215. float x = (this.transform.localScale.x <= 0f) ? (this.transform.position.x - this.eAttr.viewXBack) : (this.transform.position.x - this.eAttr.viewXFront);
  216. Rect rect = new Rect(x, this.transform.position.y - this.eAttr.viewYDown, this.eAttr.viewXFront + this.eAttr.viewXBack, this.eAttr.viewYTop + this.eAttr.viewYDown);
  217. bool flag = rect.Contains(this.player.position + Vector3.up);
  218. bool flag2 = this.eAttr.currentHp < this.eAttr.maxHp;
  219. if (flag)
  220. {
  221. EventManager.PostEvent<GameObject, MoveAreaLimitArgs>("EnemyFindPlayer", this.gameObject, new MoveAreaLimitArgs
  222. {
  223. battleZoneId = base.GetComponent<MoveAreaLimit>().battleZoneId
  224. });
  225. }
  226. if (flag || flag2)
  227. {
  228. this.eAttr.playerInView = true;
  229. return TaskStatus.Success;
  230. }
  231. return TaskStatus.Failure;
  232. }
  233. private EnemyAttribute eAttr;
  234. }
  235. [TaskDescription("判断AI开启")]
  236. [TaskCategory("Enemy/Base")]
  237. public class IsAIOpen : Conditional
  238. {
  239. public override TaskStatus OnUpdate()
  240. {
  241. return (base.GetComponent<EnemyAttribute>().isDead || !R.SceneData.CanAIRun || R.Mode.IsInStoryMode()) ? TaskStatus.Failure : TaskStatus.Success;
  242. }
  243. }
  244. [TaskDescription("判断是否面向右边")]
  245. [TaskCategory("Enemy/Base")]
  246. public class IsTurnRight : Conditional
  247. {
  248. public override void OnAwake()
  249. {
  250. this.eAttr = base.GetComponent<EnemyAttribute>();
  251. }
  252. public override TaskStatus OnUpdate()
  253. {
  254. return (this.eAttr.faceDir != 1) ? TaskStatus.Failure : TaskStatus.Success;
  255. }
  256. protected EnemyAttribute eAttr;
  257. }
  258. [TaskDescription("能否反击")]
  259. [TaskCategory("Enemy/Base")]
  260. public class Counterattack : Conditional
  261. {
  262. public override void OnAwake()
  263. {
  264. this.hurt = base.GetComponent<EnemyBaseHurt>();
  265. this.eAttr = base.GetComponent<EnemyAttribute>();
  266. }
  267. public override TaskStatus OnUpdate()
  268. {
  269. if (this.hurt.canCounterattack)
  270. {
  271. this.hurt.canCounterattack = false;
  272. this.eAttr.paBody = true;
  273. return TaskStatus.Success;
  274. }
  275. return TaskStatus.Failure;
  276. }
  277. private EnemyBaseHurt hurt;
  278. private EnemyAttribute eAttr;
  279. }
  280. [TaskDescription("判断主角在攻击状态")]
  281. [TaskCategory("Enemy/Base")]
  282. public class PlayerInAttack : Conditional
  283. {
  284. private StateMachine state
  285. {
  286. get
  287. {
  288. return R.Player.StateMachine;
  289. }
  290. }
  291. public override TaskStatus OnUpdate()
  292. {
  293. if (this.state.currentState.IsInArray(PlayerAction.AirAttackSta) || this.state.currentState.IsInArray(PlayerAction.AttackSta) || this.state.currentState.IsInArray(PlayerAction.UpRisingSta) || this.state.currentState.IsInArray(PlayerAction.HitGroundSta) || this.state.currentState.IsInArray(PlayerAction.FlashAttackSta) || this.state.currentState.IsInArray(PlayerAction.ChargeSta))
  294. {
  295. return TaskStatus.Success;
  296. }
  297. return TaskStatus.Failure;
  298. }
  299. }
  300. [TaskDescription("判断主角在地面")]
  301. [TaskCategory("Enemy/Base")]
  302. public class playerOnGround : Conditional
  303. {
  304. public override TaskStatus OnUpdate()
  305. {
  306. if (R.Player.Attribute.isOnGround)
  307. {
  308. return TaskStatus.Success;
  309. }
  310. return TaskStatus.Failure;
  311. }
  312. }
  313. [TaskDescription("判断游戏难度,困难为成功")]
  314. [TaskCategory("Enemy/Base")]
  315. public class GameDifficulty : Conditional
  316. {
  317. public override TaskStatus OnUpdate()
  318. {
  319. int difficulty = R.GameData.Difficulty;
  320. if (difficulty != 1 && difficulty != 3)
  321. {
  322. return TaskStatus.Failure;
  323. }
  324. return TaskStatus.Success;
  325. }
  326. }
  327. }