|
|
@@ -11,9 +11,20 @@ public class ESpirits_Pinja : Enemy
|
|
|
[ShowIf("canRevives")] [LabelText("复活次数")] public int totalRevivesNum;
|
|
|
[ShowIf("canRevives")] public int revivesNum;
|
|
|
[ShowIf("canRevives")] [LabelText("复活范围")] public Vector2 revivesPos;
|
|
|
+ [LabelText("攻击时抗击打值")] public int attackHitResistance;
|
|
|
+ [LabelText("跳跃的力")] public float jumpForce;
|
|
|
+ [LabelText("跳跃方向")] public Vector3 jumpDir;
|
|
|
+ [LabelText("跳跃高度")] public float jumpHeight;
|
|
|
+ [LabelText("回旋镖移动时间")] public Vector2 backDuration;
|
|
|
+ [LabelText("回旋镖停留时间")] public float stopDuration;
|
|
|
+ [LabelText("回旋镖最大飞行时间")] public Vector2 maxFlytime;
|
|
|
+ [LabelText("奔跑速度倍率")] public float runSpeedRate;
|
|
|
|
|
|
private PlayerController player;
|
|
|
private BoomerangWeaponController boomerangWeaponController;
|
|
|
+ private int originalHitResistance;
|
|
|
+ public Vector3 moveDir;
|
|
|
+ private int targetBullet;
|
|
|
public override void Init()
|
|
|
{
|
|
|
base.Init();
|
|
|
@@ -29,12 +40,68 @@ public class ESpirits_Pinja : Enemy
|
|
|
player = PlayersInput.instance[0];
|
|
|
ChooseLockingTarget();
|
|
|
boomerangWeaponController = attackController.attackMethod_march[0].skill as BoomerangWeaponController;
|
|
|
+ originalHitResistance = hitResistance;
|
|
|
}
|
|
|
|
|
|
public override void OnState()
|
|
|
{
|
|
|
switch (state)
|
|
|
{
|
|
|
+ case CharacterState.Idle:
|
|
|
+ if (boomerangWeaponController.isFallDown)
|
|
|
+ {
|
|
|
+ targetBullet = boomerangWeaponController.FindMinBullet();
|
|
|
+ if(targetBullet == -1)
|
|
|
+ {
|
|
|
+ boomerangWeaponController.isOut = false;
|
|
|
+ boomerangWeaponController.isReturning = true;
|
|
|
+ boomerangWeaponController.isFallDown = false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.Run);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (boomerangWeaponController.isOut && !boomerangWeaponController.isReturning)
|
|
|
+ {
|
|
|
+ if (rb.velocity.y < 0)
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.Fall);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.Run:
|
|
|
+ if (boomerangWeaponController.isFallDown)
|
|
|
+ {
|
|
|
+ Bullet bullet = boomerangWeaponController.outBullet[targetBullet];
|
|
|
+ float dirX = bullet.transform.position.x - transform.position.x;
|
|
|
+ CheckTurn(dirX);
|
|
|
+
|
|
|
+ if (dirX > 1)
|
|
|
+ {
|
|
|
+ rb.velocity = Vector3.right * moveSpeed * moveSpeedScale * runSpeedRate;
|
|
|
+ }
|
|
|
+ else if(dirX < -1)
|
|
|
+ {
|
|
|
+ rb.velocity = Vector3.left * moveSpeed * moveSpeedScale * runSpeedRate;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ boomerangWeaponController.outBullet[targetBullet] = null;
|
|
|
+ bullet.gameObject.SetActive(false);
|
|
|
+ targetBullet = boomerangWeaponController.FindMinBullet();
|
|
|
+ if (targetBullet == -1)
|
|
|
+ {
|
|
|
+ boomerangWeaponController.isOut = false;
|
|
|
+ boomerangWeaponController.isReturning = true;
|
|
|
+ boomerangWeaponController.isFallDown = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ break;
|
|
|
case CharacterState.Die:
|
|
|
if (GameManager.instance.gameType == GameType.GameEnd)
|
|
|
{
|
|
|
@@ -61,18 +128,25 @@ public class ESpirits_Pinja : Enemy
|
|
|
}
|
|
|
return;
|
|
|
case CharacterState.Attack:
|
|
|
- attackController.attackTime = 1;
|
|
|
ChooseLockingTarget();
|
|
|
- if (boomerangWeaponController.isReturning && boomerangWeaponController.isOut)
|
|
|
+ break;
|
|
|
+ case CharacterState.Rise:
|
|
|
+ Vector3 velocity = jumpDir * jumpForce * moveSpeedScale;
|
|
|
+ if (bodyTrans.localScale.x < 0)
|
|
|
{
|
|
|
- boomerangWeaponController.Init();
|
|
|
- if (GetAttack())
|
|
|
- {
|
|
|
- isConAttack = true;
|
|
|
- }
|
|
|
- ChangeState(CharacterState.Idle);
|
|
|
- return;
|
|
|
+ velocity.x = -velocity.x;
|
|
|
+ }
|
|
|
+ rb.velocity = velocity;
|
|
|
+ if (transform.position.y >= jumpHeight)
|
|
|
+ {
|
|
|
+ boomerangWeaponController.targetPos = player.transform.position + Vector3.one;
|
|
|
+ boomerangWeaponController.hasTarget = true;
|
|
|
+ moveDir.x = -moveDir.x;
|
|
|
+ base.Attack_march();
|
|
|
}
|
|
|
+ return;
|
|
|
+ case CharacterState.Fall:
|
|
|
+ moveDir = Vector3.zero;
|
|
|
break;
|
|
|
}
|
|
|
base.OnState();
|
|
|
@@ -83,14 +157,48 @@ public class ESpirits_Pinja : Enemy
|
|
|
switch (state)
|
|
|
{
|
|
|
case CharacterState.Attack:
|
|
|
+ hitResistance = originalHitResistance;
|
|
|
+ rb.useGravity = true;
|
|
|
+ canNotShotDown = true;
|
|
|
ChooseLockingTarget();
|
|
|
break;
|
|
|
}
|
|
|
switch (newState)
|
|
|
{
|
|
|
case CharacterState.Attack:
|
|
|
+ hitResistance = attackHitResistance;
|
|
|
+ rb.useGravity = false;
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
ChooseLockingTarget();
|
|
|
break;
|
|
|
+ case CharacterState.Rise:
|
|
|
+ float dir = player.transform.position.x - transform.position.x;
|
|
|
+ if (dir < 0)
|
|
|
+ {
|
|
|
+ if (bodyTrans.localScale.x < 0)
|
|
|
+ {
|
|
|
+ Turn();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (bodyTrans.localScale.x > 0)
|
|
|
+ {
|
|
|
+ Turn();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.SpecialStatus_BlowUp:
|
|
|
+ case CharacterState.SpecialStatus_ShotDown:
|
|
|
+ boomerangWeaponController.isFallDown = true;
|
|
|
+ for(int i = 0; i < boomerangWeaponController.bulletNum; i++)
|
|
|
+ {
|
|
|
+ if (boomerangWeaponController.outBullet[i])
|
|
|
+ {
|
|
|
+ boomerangWeaponController.outBullet[i].rb.useGravity = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
}
|
|
|
base.ChangeState(newState);
|
|
|
}
|
|
|
@@ -106,4 +214,36 @@ public class ESpirits_Pinja : Enemy
|
|
|
targetCharacter = player;
|
|
|
}
|
|
|
|
|
|
+ public override void Attack_march()
|
|
|
+ {
|
|
|
+ int randId = Random.Range(0, 2);
|
|
|
+ boomerangWeaponController.backDuration = backDuration[randId];
|
|
|
+ boomerangWeaponController.stopDuration = stopDuration;
|
|
|
+ boomerangWeaponController.maxFlytime = maxFlytime[randId];
|
|
|
+ switch (randId)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+ boomerangWeaponController.hasTarget = false;
|
|
|
+ boomerangWeaponController.targetPos = player.transform.position + Vector3.one;
|
|
|
+ base.Attack_march();
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ moveDir.x = -moveDir.x;
|
|
|
+ canNotShotDown = false;
|
|
|
+ ChangeState(CharacterState.Rise);
|
|
|
+ Vector3 velocity = rb.velocity;
|
|
|
+ velocity.y = jumpForce;
|
|
|
+ rb.velocity = velocity;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override Vector3 GetMoveDir()
|
|
|
+ {
|
|
|
+ if(state == CharacterState.Fall)
|
|
|
+ {
|
|
|
+ return Vector3.zero;
|
|
|
+ }
|
|
|
+ return base.GetMoveDir();
|
|
|
+ }
|
|
|
}
|