WaterSprite.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Sirenix.OdinInspector;
  5. public class WaterSprite : Boss
  6. {
  7. public enum AttackMethods
  8. {
  9. Move, //移动,浮空+点水,动画控制高度,代码控制位移x;点水处生化
  10. Umbrella, //黑伞回旋镖
  11. Lotus, //召唤莲花
  12. Hair, //辫子攻击
  13. Rush, //水面冲刺
  14. Shoot, //苦无射击
  15. }
  16. public enum BossStage
  17. {
  18. waterSprite, //水诡形态
  19. polliwog, //蝌蚪形态
  20. }
  21. [System.Serializable]
  22. public struct AttackAssignment
  23. {
  24. public AttackMethods attack;
  25. public int weight; //权重
  26. }
  27. [System.Serializable]
  28. public struct BossAttackType
  29. {
  30. public AttackCategories category;
  31. public AttackAssignment[] attacks;
  32. }
  33. [Space(30)]
  34. [Header("水诡白家娘娘")]
  35. [Header("攻击配置")]
  36. public BossAttackType[] attackConfigurations;
  37. private AttackMethods curAttackType;
  38. private WaterSpriteAttackController attack;
  39. [Header("移动")]
  40. private WaterSpriteJumpMove jumpMoveCS;
  41. [Header("变化形态")]
  42. [LabelText("召唤蝌蚪的数量")]
  43. public int polliNum; //召唤蝌蚪的数量
  44. [LabelText("召唤蝌蚪的脚本")]
  45. public PolliwogShot pws;
  46. private BossStage curBossStage;
  47. [Range(1,100)]
  48. [LabelText("血量到达多少百分比后切换蝌蚪形态")]
  49. public int[] changeStateHPPer; //每次转化形态的血量百分比预设
  50. private int nextAimHP; //下一个血量预设值
  51. private int changeHPID; //下一个是预设数组里的第几个
  52. [LabelText("过多久从蝌蚪形态切回水诡形态")]
  53. public float polliTime;
  54. private float pastPoliTime; //已经过去的蝌蚪时间
  55. public override void Init()
  56. {
  57. base.Init();
  58. attack = GetComponent<WaterSpriteAttackController>();
  59. jumpMoveCS = GetComponent<WaterSpriteJumpMove>();
  60. jumpMoveCS.ws = this;
  61. nextAimHP = (int)(changeStateHPPer[changeHPID] / 100f * totalHp);
  62. changeHPID++;
  63. }
  64. public void ChangeStage(BossStage bs)
  65. {
  66. if (bs == curBossStage)
  67. {
  68. return;
  69. }
  70. curBossStage = bs;
  71. switch (bs)
  72. {
  73. case BossStage.waterSprite:
  74. if (changeHPID < changeStateHPPer.Length - 1)
  75. {
  76. nextAimHP = (int)(changeStateHPPer[changeHPID] / 100f * totalHp);
  77. changeHPID++;
  78. }
  79. else
  80. {
  81. nextAimHP = -1000;
  82. }
  83. bodyTrans.gameObject.SetActive(true);
  84. //所有蝌蚪消失
  85. pws.AllPoliDie();
  86. break;
  87. case BossStage.polliwog:
  88. bodyTrans.gameObject.SetActive(false);
  89. //在原地召唤一堆蝌蚪
  90. pws.Shoot(polliNum, bodyTrans.position);
  91. break;
  92. default:
  93. break;
  94. }
  95. }
  96. private void OnStage()
  97. {
  98. switch (curBossStage)
  99. {
  100. case BossStage.polliwog:
  101. pastPoliTime += Time.deltaTime;
  102. if (pastPoliTime >= polliTime)
  103. {
  104. ChangeStage(BossStage.waterSprite);
  105. pastPoliTime = 0;
  106. }
  107. break;
  108. }
  109. }
  110. public override void Update()
  111. {
  112. base.Update();
  113. OnStage();
  114. }
  115. //步步生花
  116. public override void ToMove()
  117. {
  118. jumpMoveCS.ToJump();
  119. }
  120. public override void OnMove()
  121. {
  122. jumpMoveCS.OnJumpMove();
  123. }
  124. public override void BeHit(AttackController.AttackMethod attackMethod, Character attackFrom, int damage = -1)
  125. {
  126. base.BeHit(attackMethod, attackFrom, damage);
  127. if (hp <= nextAimHP)
  128. {
  129. ChangeStage(BossStage.polliwog);
  130. }
  131. }
  132. public override void RandomAttackType(AttackCategories cate)
  133. {
  134. AttackAssignment[] attacks = attackConfigurations[(int)cate].attacks;
  135. int[] powers = new int[attacks.Length];
  136. for (int i = 0; i < attacks.Length; i++)
  137. {
  138. powers[i] = attacks[i].weight;
  139. }
  140. int a = RandomWithWeight(powers);
  141. curAttackType = attacks[a].attack;
  142. }
  143. public override void Attack()
  144. {
  145. switch (curAttackType)
  146. {
  147. case AttackMethods.Move:
  148. jumpMoveCS.CountJumpTime();
  149. ChangeState(CharacterState.Run);
  150. break;
  151. case AttackMethods.Umbrella:
  152. ani.Play("shoot");
  153. attack.SkillBlackUmbrella();
  154. break;
  155. case AttackMethods.Hair:
  156. ani.Play("roar");
  157. attack.SkillHairSprint();
  158. ChangeBossState(BossState.invincible);
  159. break;
  160. case AttackMethods.Shoot:
  161. //ani.Play("roar");
  162. attack.KunaiAttack((pc.transform.position - transform.position).normalized);
  163. ChangeState(CharacterState.Run);
  164. break;
  165. default:
  166. break;
  167. }
  168. }
  169. public override void ClearAllSkills()
  170. {
  171. GameObject umbrella = attack.umbrellaInstance;
  172. if (umbrella)
  173. {
  174. umbrella.SetActive(false);
  175. }
  176. }
  177. public override void OnAttack()
  178. {
  179. switch (curAttackType)
  180. {
  181. case AttackMethods.Umbrella:
  182. if (spineEvent.isAttackOn)
  183. {
  184. spineEvent.isAttackOn = false;
  185. attack.BlackUmbrellaRelease();
  186. }
  187. attack.OnBlackUmbrella();
  188. break;
  189. case AttackMethods.Hair:
  190. break;
  191. default:
  192. break;
  193. }
  194. }
  195. }