|
|
@@ -41,8 +41,30 @@ public class Enemy : MoveCharacter
|
|
|
public float soulStartSpeed = 5f;
|
|
|
public float dropSoulAngle = 60f;
|
|
|
|
|
|
+ [HideInInspector]
|
|
|
public bool noOnSearchState;
|
|
|
- public bool noOnState;
|
|
|
+ [HideInInspector]
|
|
|
+ public bool isFindingPlayer;
|
|
|
+ [HideInInspector]
|
|
|
+ public bool isFindPlayer;
|
|
|
+ public float hateDistance;
|
|
|
+ [HideInInspector]
|
|
|
+ public float distance;
|
|
|
+ [HideInInspector]
|
|
|
+ public Vector3 rushEndPos;
|
|
|
+ public GameObject aimEffect;
|
|
|
+ public float aimDistance;
|
|
|
+ public float rushTime;
|
|
|
+ public float rushSpeed;
|
|
|
+ [HideInInspector]
|
|
|
+ public float time;
|
|
|
+ public float readyCD;
|
|
|
+ public DashEffect dashEffect;
|
|
|
+ [HideInInspector]
|
|
|
+ public Vector3 targetDir;
|
|
|
+ public bool haveDownRush;
|
|
|
+ public float downRushTime;
|
|
|
+ public float finishRushTime;
|
|
|
|
|
|
private void Awake()
|
|
|
{
|
|
|
@@ -68,11 +90,10 @@ public class Enemy : MoveCharacter
|
|
|
OnSearchState();
|
|
|
|
|
|
}
|
|
|
- if (!noOnState)
|
|
|
- {
|
|
|
- OnState();
|
|
|
- }
|
|
|
-
|
|
|
+ OnState();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public override Vector3 GetMoveDir()
|
|
|
@@ -269,7 +290,15 @@ public class Enemy : MoveCharacter
|
|
|
case CharacterState.Fall:
|
|
|
if (foot.TrigGround || canFly)
|
|
|
{
|
|
|
- ChangeState(CharacterState.Idle);
|
|
|
+ if (isFindPlayer)
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.FindPlayer);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.Idle);
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
}
|
|
|
//if (foot.canStepPlayers.Count > 0)
|
|
|
@@ -335,6 +364,105 @@ public class Enemy : MoveCharacter
|
|
|
break;
|
|
|
}
|
|
|
break;
|
|
|
+ case CharacterState.FindPlayer:
|
|
|
+ if (!foot.TrigGround && !canFly)
|
|
|
+ {
|
|
|
+ if (rb.velocity.y > 0)
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.Rise);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.Fall);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Vector3.Distance(transform.position, targetCharacter.transform.position)
|
|
|
+ < hateDistance)
|
|
|
+ {
|
|
|
+ rushEndPos = targetCharacter.transform.position;
|
|
|
+ isFindPlayer = true;
|
|
|
+ }
|
|
|
+ if (targetCharacter.transform.position.x > transform.position.x)
|
|
|
+ {
|
|
|
+ rb.velocity = Vector3.right * moveSpeed;
|
|
|
+ if (bodyTrans.localScale.x > 0)
|
|
|
+ {
|
|
|
+ Turn();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(targetCharacter.transform.position.x < transform.position.x)
|
|
|
+ {
|
|
|
+ rb.velocity = Vector3.left * moveSpeed;
|
|
|
+ if (bodyTrans.localScale.x < 0)
|
|
|
+ {
|
|
|
+ Turn();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.ReadyToRush:
|
|
|
+ time += Time.deltaTime;
|
|
|
+ ReadyToDash(rushEndPos + Vector3.up, transform.position + Vector3.up);
|
|
|
+ if (time >= readyCD)
|
|
|
+ {
|
|
|
+ time = 0;
|
|
|
+
|
|
|
+ ChangeState(CharacterState.Rush);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.Rush:
|
|
|
+ time += Time.deltaTime;
|
|
|
+ Rush();
|
|
|
+ if (time >= rushTime)
|
|
|
+ {
|
|
|
+ time = 0;
|
|
|
+ if (haveDownRush)
|
|
|
+ {
|
|
|
+ if (foot.TrigGround)
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.FinishRush);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.ReadyToDownRush);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.FinishRush);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.ReadyToDownRush:
|
|
|
+ time += Time.deltaTime;
|
|
|
+ if (time >= downRushTime)
|
|
|
+ {
|
|
|
+ time = 0;
|
|
|
+ ChangeState(CharacterState.DownRush);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.DownRush:
|
|
|
+ if (transform.position.y <= 0)
|
|
|
+ {
|
|
|
+ ani.Play("fall_end", 0, 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Rush();
|
|
|
+ }
|
|
|
+ if (foot.TrigGround || transform.position.y <= -1)
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.FinishRush);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CharacterState.FinishRush:
|
|
|
+ time += Time.deltaTime;
|
|
|
+ if (time > finishRushTime)
|
|
|
+ {
|
|
|
+ ChangeState(CharacterState.Idle);
|
|
|
+ }
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
@@ -364,6 +492,37 @@ public class Enemy : MoveCharacter
|
|
|
break;
|
|
|
case CharacterState.Weak:
|
|
|
break;
|
|
|
+ case CharacterState.FindPlayer:
|
|
|
+ noOnSearchState = false;
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
+ isFindPlayer = false;
|
|
|
+ break;
|
|
|
+ case CharacterState.ReadyToRush:
|
|
|
+ aimEffect.SetActive(false);
|
|
|
+ aimEffect.transform.localScale = Vector3.zero;
|
|
|
+ rb.constraints =
|
|
|
+ RigidbodyConstraints.FreezePositionZ|RigidbodyConstraints.FreezeRotation;
|
|
|
+ break;
|
|
|
+ case CharacterState.Rush:
|
|
|
+ dashEffect.canHit = false;
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
+ bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
|
|
|
+ break;
|
|
|
+ case CharacterState.ReadyToDownRush:
|
|
|
+ rb.constraints =
|
|
|
+ RigidbodyConstraints.FreezePositionZ|RigidbodyConstraints.FreezeRotation;
|
|
|
+ break;
|
|
|
+ case CharacterState.DownRush:
|
|
|
+
|
|
|
+ dashEffect.canHit = false;
|
|
|
+ rb.velocity = Vector3.zero;
|
|
|
+ bodyTrans.rotation = Quaternion.Euler(Vector3.zero);
|
|
|
+ transform.position = new Vector3(transform.position.x, -1, 0);
|
|
|
+ break;
|
|
|
+ case CharacterState.FinishRush:
|
|
|
+ searchState = SearchState.NoTarget;
|
|
|
+ noOnSearchState = false;
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
@@ -418,6 +577,34 @@ public class Enemy : MoveCharacter
|
|
|
rb.velocity = velocity;
|
|
|
weakTime = totalWeakTime;
|
|
|
break;
|
|
|
+ case CharacterState.FindPlayer:
|
|
|
+ isFindPlayer = true;
|
|
|
+ noOnSearchState = true;
|
|
|
+ ChosePlayer();
|
|
|
+ ani.Play("walk", 0, 0);
|
|
|
+ aniCollider.Play("Walk", 0, 0);
|
|
|
+ break;
|
|
|
+ case CharacterState.ReadyToRush:
|
|
|
+ ani.Play("charge", 0, 0);
|
|
|
+ aimEffect.SetActive(true);
|
|
|
+ aimDistance = rushTime * rushSpeed / 2;
|
|
|
+ rb.constraints = RigidbodyConstraints.FreezeAll;
|
|
|
+ break;
|
|
|
+ case CharacterState.Rush:
|
|
|
+ dashEffect.canHit = true;
|
|
|
+ targetDir =
|
|
|
+ (rushEndPos - transform.position).normalized;
|
|
|
+ ani.Play("attack_summon", 0, 0);
|
|
|
+ break;
|
|
|
+ case CharacterState.ReadyToDownRush:
|
|
|
+ rb.constraints = RigidbodyConstraints.FreezeAll;
|
|
|
+ ani.Play("charge", 0, 0);
|
|
|
+ break;
|
|
|
+ case CharacterState.DownRush:
|
|
|
+ targetDir = Vector3.down;
|
|
|
+ ani.Play("attack_summon", 0, 0);
|
|
|
+ dashEffect.canHit = true;
|
|
|
+ break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
@@ -571,4 +758,70 @@ public class Enemy : MoveCharacter
|
|
|
base.Attack2();
|
|
|
attackTarget = targetCharacter;
|
|
|
}
|
|
|
+ public void ChosePlayer()
|
|
|
+ {
|
|
|
+ float distance0 = 1000;
|
|
|
+ float distance1 = 1000;
|
|
|
+ if (PlayersInput.instance[0])
|
|
|
+ {
|
|
|
+ distance0 = Mathf.Abs(PlayersInput.instance[0].transform.position.x
|
|
|
+ - transform.position.x);
|
|
|
+ }
|
|
|
+ if (PlayersInput.instance[1])
|
|
|
+ {
|
|
|
+ distance1 = Mathf.Abs(PlayersInput.instance[1].transform.position.x
|
|
|
+ - transform.position.x);
|
|
|
+ }
|
|
|
+ if (distance0 <= distance1)
|
|
|
+ {
|
|
|
+ targetCharacter = PlayersInput.instance[0];
|
|
|
+ distance = distance0;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ targetCharacter = PlayersInput.instance[1];
|
|
|
+ distance = distance1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public void ReadyToDash(Vector3 pos0, Vector3 pos1)
|
|
|
+ {
|
|
|
+ Vector3 target = (pos0 - pos1).normalized;
|
|
|
+ float distance = aimDistance;
|
|
|
+ aimEffect.transform.localScale =
|
|
|
+ new Vector3(distance, 1, 1);
|
|
|
+
|
|
|
+ targetDir = pos0 - pos1;
|
|
|
+ float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
|
|
|
+ if (targetDir.x < 0)
|
|
|
+ {
|
|
|
+ aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
|
|
|
+ bodyTrans.localScale = new Vector3(1, 1, 1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ aimEffect.transform.rotation = Quaternion.Euler(new Vector3(0, 0, k));
|
|
|
+ bodyTrans.localScale = new Vector3(-1, 1, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Rush()
|
|
|
+ {
|
|
|
+ float k = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
|
|
|
+ if (targetDir.x < 0)
|
|
|
+ {
|
|
|
+ dashEffect.offset = 1;
|
|
|
+ bodyTrans.localScale = new Vector3(1, 1, 1);
|
|
|
+ bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k - 180));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dashEffect.offset = -1;
|
|
|
+ bodyTrans.localScale = new Vector3(-1, 1, 1);
|
|
|
+ bodyTrans.rotation = Quaternion.Euler(new Vector3(0, 0, k));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ rb.velocity = targetDir * rushSpeed;
|
|
|
+ }
|
|
|
}
|