| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using Sirenix.OdinInspector;
- public class WaterSprite : Boss
- {
- public enum AttackMethods
- {
- Move, //移动,浮空+点水,动画控制高度,代码控制位移x;点水处生化
- Umbrella, //黑伞回旋镖
- Lotus, //召唤莲花
- Hair, //辫子攻击
- Rush, //水面冲刺
- Shoot, //苦无射击
- }
- public enum BossStage
- {
- waterSprite, //水诡形态
- polliwog, //蝌蚪形态
- }
- [System.Serializable]
- public struct AttackAssignment
- {
- public AttackMethods attack;
- public int weight; //权重
- }
- [System.Serializable]
- public struct BossAttackType
- {
- public AttackCategories category;
- public AttackAssignment[] attacks;
- }
- [Space(30)]
- [Header("水诡白家娘娘")]
- [Header("攻击配置")]
- public BossAttackType[] attackConfigurations;
- private AttackMethods curAttackType;
- private WaterSpriteAttackController attack;
- [Header("移动")]
- private WaterSpriteJumpMove jumpMoveCS;
- [Header("变化形态")]
- [LabelText("召唤蝌蚪的数量")]
- public int polliNum; //召唤蝌蚪的数量
- [LabelText("召唤蝌蚪的脚本")]
- public PolliwogShot pws;
- private BossStage curBossStage;
- [Range(1,100)]
- [LabelText("血量到达多少百分比后切换蝌蚪形态")]
- public int[] changeStateHPPer; //每次转化形态的血量百分比预设
- private int nextAimHP; //下一个血量预设值
- private int changeHPID; //下一个是预设数组里的第几个
- [LabelText("过多久从蝌蚪形态切回水诡形态")]
- public float polliTime;
- private float pastPoliTime; //已经过去的蝌蚪时间
- public override void Init()
- {
- base.Init();
- attack = GetComponent<WaterSpriteAttackController>();
- jumpMoveCS = GetComponent<WaterSpriteJumpMove>();
- jumpMoveCS.ws = this;
- nextAimHP = (int)(changeStateHPPer[changeHPID] / 100f * totalHp);
- changeHPID++;
- }
- public void ChangeStage(BossStage bs)
- {
- if (bs == curBossStage)
- {
- return;
- }
- curBossStage = bs;
- switch (bs)
- {
- case BossStage.waterSprite:
- if (changeHPID < changeStateHPPer.Length - 1)
- {
- nextAimHP = (int)(changeStateHPPer[changeHPID] / 100f * totalHp);
- changeHPID++;
- }
- else
- {
- nextAimHP = -1000;
- }
- bodyTrans.gameObject.SetActive(true);
- //所有蝌蚪消失
- pws.AllPoliDie();
- break;
- case BossStage.polliwog:
- bodyTrans.gameObject.SetActive(false);
- //在原地召唤一堆蝌蚪
- pws.Shoot(polliNum, bodyTrans.position);
- break;
- default:
- break;
- }
- }
- private void OnStage()
- {
- switch (curBossStage)
- {
- case BossStage.polliwog:
- pastPoliTime += Time.deltaTime;
- if (pastPoliTime >= polliTime)
- {
- ChangeStage(BossStage.waterSprite);
- pastPoliTime = 0;
- }
- break;
- }
- }
- public override void Update()
- {
- base.Update();
- OnStage();
- }
- //步步生花
- public override void ToMove()
- {
- jumpMoveCS.ToJump();
- }
- public override void OnMove()
- {
- jumpMoveCS.OnJumpMove();
- }
- public override void BeHit(AttackController.AttackMethod attackMethod, Character attackFrom, int damage = -1)
- {
- base.BeHit(attackMethod, attackFrom, damage);
- if (hp <= nextAimHP)
- {
- ChangeStage(BossStage.polliwog);
- }
- }
- public override void RandomAttackType(AttackCategories cate)
- {
- AttackAssignment[] attacks = attackConfigurations[(int)cate].attacks;
- int[] powers = new int[attacks.Length];
- for (int i = 0; i < attacks.Length; i++)
- {
- powers[i] = attacks[i].weight;
- }
- int a = RandomWithWeight(powers);
- curAttackType = attacks[a].attack;
- }
- public override void Attack()
- {
- switch (curAttackType)
- {
- case AttackMethods.Move:
- jumpMoveCS.CountJumpTime();
- ChangeState(CharacterState.Run);
- break;
- case AttackMethods.Umbrella:
- ani.Play("shoot");
- attack.SkillBlackUmbrella();
- break;
- case AttackMethods.Hair:
- ani.Play("roar");
- attack.SkillHairSprint();
- ChangeBossState(BossState.invincible);
- break;
- case AttackMethods.Shoot:
- //ani.Play("roar");
- attack.KunaiAttack((pc.transform.position - transform.position).normalized);
- ChangeState(CharacterState.Run);
- break;
- default:
- break;
- }
- }
- public override void ClearAllSkills()
- {
- GameObject umbrella = attack.umbrellaInstance;
- if (umbrella)
- {
- umbrella.SetActive(false);
- }
- }
- public override void OnAttack()
- {
- switch (curAttackType)
- {
- case AttackMethods.Umbrella:
- if (spineEvent.isAttackOn)
- {
- spineEvent.isAttackOn = false;
- attack.BlackUmbrellaRelease();
- }
- attack.OnBlackUmbrella();
- break;
- case AttackMethods.Hair:
- break;
- default:
- break;
- }
- }
- }
|