|
|
@@ -34,7 +34,7 @@ public class WaterSprite : Boss
|
|
|
public AttackCategories category;
|
|
|
public AttackAssignment[] attacks;
|
|
|
}
|
|
|
- [FoldoutGroup("组件")] public WaterSpriteAttackController attackController;
|
|
|
+ [FoldoutGroup("组件")] public WaterSpriteAttackController wsAttackController;
|
|
|
[Space(30)]
|
|
|
[Header("水诡白家娘娘")]
|
|
|
[Header("攻击配置")]
|
|
|
@@ -76,6 +76,7 @@ public class WaterSprite : Boss
|
|
|
private float angryTimer;
|
|
|
private bool isAngry = false;
|
|
|
public bool isTakingUmbre = false;
|
|
|
+ private Coroutine attackCoroutine;
|
|
|
|
|
|
public override void Init()
|
|
|
{
|
|
|
@@ -87,59 +88,6 @@ public class WaterSprite : Boss
|
|
|
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);
|
|
|
-
|
|
|
- ChangeState(CharacterState.Idle);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- ClearAllSkills();
|
|
|
- isTakingUmbre = false;
|
|
|
- attackCount = 0;
|
|
|
- }
|
|
|
-
|
|
|
- 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();
|
|
|
@@ -206,49 +154,6 @@ public class WaterSprite : Boss
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public override void Attack()
|
|
|
- {
|
|
|
- attackCount--;
|
|
|
- switch (curAttackType)
|
|
|
- {
|
|
|
- case AttackMethods.Move:
|
|
|
- jumpMoveCS.CountJumpTime();
|
|
|
- ChangeState(CharacterState.Run);
|
|
|
- break;
|
|
|
- case AttackMethods.Umbrella:
|
|
|
- isHoldingUmbre = false;
|
|
|
- ani.Play("shoot");
|
|
|
- attack.SkillBlackUmbrella();
|
|
|
- break;
|
|
|
- case AttackMethods.Hair:
|
|
|
- ani.Play("roar");
|
|
|
- int attackTimes = 0;
|
|
|
- switch (bossPhase)
|
|
|
- {
|
|
|
- case 0:
|
|
|
- attackTimes = 6;
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- attackTimes = 6;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- attackTimes = 10;
|
|
|
- break;
|
|
|
- }
|
|
|
- if (isAngry) attackTimes = 10;
|
|
|
- attack.SkillHairSprint(attackTimes);
|
|
|
- ChangeBossState(BossState.invincible);
|
|
|
- break;
|
|
|
- case AttackMethods.Shoot:
|
|
|
- if (isHoldingUmbre) ani.Play("smoke", 0, 0);
|
|
|
- else ani.Play("smoke_no3", 0, 0);
|
|
|
- bodyFlickerTimer = Time.time + 10;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
public override void ChangePhase()
|
|
|
{
|
|
|
base.ChangePhase();
|
|
|
@@ -261,6 +166,7 @@ public class WaterSprite : Boss
|
|
|
angryTimer = angryDuration;
|
|
|
RandomAttackState();
|
|
|
ClearAllSkills();
|
|
|
+ isTakingUmbre = false;
|
|
|
break;
|
|
|
case 2:
|
|
|
ChangeCirculate(3);
|
|
|
@@ -277,6 +183,61 @@ public class WaterSprite : Boss
|
|
|
isHoldingUmbre = true;
|
|
|
}
|
|
|
}
|
|
|
+ #region 状态相关
|
|
|
+ public override void ChangeState(CharacterState newState)
|
|
|
+ {
|
|
|
+ if (state == newState || newState == CharacterState.FramePause)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Debug.Log("从" + state + "切换到" + newState);
|
|
|
+ switch (state)
|
|
|
+ {
|
|
|
+ case CharacterState.Run:
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
+ break;
|
|
|
+ case CharacterState.Attack:
|
|
|
+ spineEvent.isAttackOn = false;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ state = newState;
|
|
|
+ switch (newState)
|
|
|
+ {
|
|
|
+ case CharacterState.Idle:
|
|
|
+ if (bossState != BossState.weak)
|
|
|
+ {
|
|
|
+ if (isHoldingUmbre)
|
|
|
+ {
|
|
|
+ int randomAni = RandomWithWeight(weight);
|
|
|
+ ani.Play(idleAniNames[randomAni], 0, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ani.Play("idle_no3", 0, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.Run:
|
|
|
+ ToMove();
|
|
|
+ break;
|
|
|
+ case CharacterState.Die:
|
|
|
+ ani.Play("die", 0, 0);
|
|
|
+ gameObject.SetActive(false);
|
|
|
+ ClearAllSkills();
|
|
|
+ break;
|
|
|
+ case CharacterState.Attack:
|
|
|
+ if (!isToBossRoom)
|
|
|
+ {
|
|
|
+ //hitResistance = 300;
|
|
|
+ Attack();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
public override void OnState()
|
|
|
{
|
|
|
@@ -289,12 +250,12 @@ public class WaterSprite : Boss
|
|
|
if (Time.time - bodyFlickerTimer > bodyFlickerTime && isDisappear)
|
|
|
{
|
|
|
curInterval = 1;
|
|
|
- transform.position = attackController.blackUmbrella.transform.position - attackController.umbrellaBackPos.position + transform.position;
|
|
|
+ transform.position = wsAttackController.blackUmbrella.transform.position - wsAttackController.umbrellaBackPos.position + transform.position;
|
|
|
EndCurAttackState(true);
|
|
|
BodyFlickerAppear();
|
|
|
ani.Play("shoot_end");
|
|
|
isTakingUmbre = false;
|
|
|
- attackController.blackUmbrella.BeTaken();
|
|
|
+ wsAttackController.blackUmbrella.BeTaken();
|
|
|
}
|
|
|
else if (spineEvent.isAttackOn)
|
|
|
{
|
|
|
@@ -370,6 +331,107 @@ public class WaterSprite : Boss
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 形态相关
|
|
|
+ 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);
|
|
|
+
|
|
|
+ ChangeState(CharacterState.Idle);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ClearAllSkills();
|
|
|
+ isTakingUmbre = false;
|
|
|
+ attackCount = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void OnStage()
|
|
|
+ {
|
|
|
+ switch (curBossStage)
|
|
|
+ {
|
|
|
+ case BossStage.polliwog:
|
|
|
+ pastPoliTime += Time.deltaTime;
|
|
|
+ if (pastPoliTime >= polliTime)
|
|
|
+ {
|
|
|
+ ChangeStage(BossStage.waterSprite);
|
|
|
+ pastPoliTime = 0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 攻击相关
|
|
|
+ public override void Attack()
|
|
|
+ {
|
|
|
+ attackCount--;
|
|
|
+ switch (curAttackType)
|
|
|
+ {
|
|
|
+ case AttackMethods.Move:
|
|
|
+ jumpMoveCS.CountJumpTime();
|
|
|
+ ChangeState(CharacterState.Run);
|
|
|
+ break;
|
|
|
+ case AttackMethods.Umbrella:
|
|
|
+ isHoldingUmbre = false;
|
|
|
+ ani.Play("shoot");
|
|
|
+ attack.SkillBlackUmbrella();
|
|
|
+ break;
|
|
|
+ case AttackMethods.Hair:
|
|
|
+ ani.Play("roar");
|
|
|
+ int attackTimes = 0;
|
|
|
+ switch (bossPhase)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ attackTimes = 6;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ attackTimes = 6;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ attackTimes = 10;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (isAngry) attackTimes = 10;
|
|
|
+ attack.SkillHairSprint(attackTimes);
|
|
|
+ ChangeBossState(BossState.invincible);
|
|
|
+ break;
|
|
|
+ case AttackMethods.Shoot:
|
|
|
+ if (isHoldingUmbre) ani.Play("smoke", 0, 0);
|
|
|
+ else ani.Play("smoke_no3", 0, 0);
|
|
|
+ bodyFlickerTimer = Time.time + 2;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
public override void OnAttack()
|
|
|
{
|
|
|
@@ -399,20 +461,29 @@ public class WaterSprite : Boss
|
|
|
if (spineEvent.isAttackOn)
|
|
|
{
|
|
|
spineEvent.isAttackOn = false;
|
|
|
+ int randomInt = Random.Range(0, 2);
|
|
|
int num = 0;
|
|
|
- switch (bossPhase)
|
|
|
+ switch (randomInt)
|
|
|
{
|
|
|
- case 0:
|
|
|
- num = 7;
|
|
|
+ case 0:
|
|
|
+ switch (bossPhase)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ num = 11;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ num = 15;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ num = 19;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, num,8);
|
|
|
break;
|
|
|
case 1:
|
|
|
- num = 11;
|
|
|
- break;
|
|
|
- case 2:
|
|
|
- num = 15;
|
|
|
+ StartCoroutine(TestAttack(bossPhase));
|
|
|
break;
|
|
|
- }
|
|
|
- attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, num);
|
|
|
+ }
|
|
|
EndCurAttackState(true);
|
|
|
ChangeState(CharacterState.Run);
|
|
|
}
|
|
|
@@ -429,62 +500,30 @@ public class WaterSprite : Boss
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- public override void ChangeState(CharacterState newState)
|
|
|
- {
|
|
|
- if (state == newState || newState == CharacterState.FramePause)
|
|
|
- {
|
|
|
- return;
|
|
|
- }
|
|
|
- Debug.Log("从" + state + "切换到" + newState);
|
|
|
- switch (state)
|
|
|
+ IEnumerator TestAttack(int bossPhase)
|
|
|
{
|
|
|
- case CharacterState.Run:
|
|
|
- rb.velocity = Vector3.zero;
|
|
|
- break;
|
|
|
- case CharacterState.Attack:
|
|
|
- spineEvent.isAttackOn = false;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- state = newState;
|
|
|
- switch (newState)
|
|
|
- {
|
|
|
- case CharacterState.Idle:
|
|
|
- if (bossState != BossState.weak)
|
|
|
- {
|
|
|
- if (isHoldingUmbre)
|
|
|
- {
|
|
|
- int randomAni = RandomWithWeight(weight);
|
|
|
- ani.Play(idleAniNames[randomAni], 0, 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ani.Play("idle_no3", 0, 0);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case CharacterState.Run:
|
|
|
- ToMove();
|
|
|
- break;
|
|
|
- case CharacterState.Die:
|
|
|
- ani.Play("die", 0, 0);
|
|
|
- gameObject.SetActive(false);
|
|
|
- ClearAllSkills();
|
|
|
- break;
|
|
|
- case CharacterState.Attack:
|
|
|
- if (!isToBossRoom)
|
|
|
+ float shortInterval = 0.08f;
|
|
|
+ for(int i = 0;i < 3; i++)
|
|
|
+ {
|
|
|
+ for (int j = 0; j < bossPhase+2; j++)
|
|
|
{
|
|
|
- //hitResistance = 300;
|
|
|
- Attack();
|
|
|
+ attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, 1);
|
|
|
+ yield return new WaitForSeconds(shortInterval);
|
|
|
}
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ yield return new WaitForSeconds(0.2f);
|
|
|
+ }
|
|
|
+ yield return new WaitForSeconds(0.2f);
|
|
|
+
|
|
|
+ for (int i = 0; i < 7 + bossPhase * 2; i++)
|
|
|
+ {
|
|
|
+ attack.KunaiAttack((pc.transform.position - pws.transform.position).normalized, 1);
|
|
|
+ yield return new WaitForSeconds(shortInterval);
|
|
|
+ }
|
|
|
+ yield return new WaitForSeconds(0.2f);
|
|
|
}
|
|
|
}
|
|
|
+ #endregion
|
|
|
|
|
|
#region 瞬身相关
|
|
|
public void BodyFlickerDisappear()
|